Last active
October 30, 2016 00:38
-
-
Save solendil/821ed660cf3e391daea5ca36d3b86148 to your computer and use it in GitHub Desktop.
A little utility to change the rules of a stylesheet on the fly.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2016, Matthieu Dumas | |
* This work is licensed under the Creative Commons Attribution 4.0 International License. | |
* To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ | |
*/ | |
/* Identify rules in a given stylesheet and change them on the fly. | |
* var ss = StyleChanger("my_custom_identifier"); // stylesheet must have a dummy identifying rule like .my_custom_identifier{color:black;} | |
* ss.change("darkolivegreen", "blue"); // change all values with a given original value | |
* ss.change("darkolivegreen", "green"); // ...can be applied many times (original values are saved) | |
* ss.reset(); // reset all values to original | |
*/ | |
var StyleChanger = function(id) { | |
id = id.toLowerCase().trim(); | |
let findSS = function() { | |
for (let ss of document.styleSheets) | |
for (let rule of ss.cssRules) | |
if (rule.selectorText.toLowerCase().substr(1)===id) | |
return ss; | |
} | |
let ss = findSS(); | |
if (!ss) return undefined; | |
ss.change = function(originalValue, newValue) { | |
for (let rule of ss.cssRules) { | |
if (!rule.originalStyle) { // init original rules at first use | |
rule.originalStyle = {}; | |
for (let style of rule.style) | |
rule.originalStyle[style] = rule.style[style]; | |
} | |
for (let style in rule.originalStyle) { // replace rules from original list | |
if (rule.originalStyle[style]===originalValue) | |
rule.style[style] = newValue; | |
} | |
} | |
} | |
ss.reset = function() { | |
for (let rule of ss.cssRules) { | |
if (!rule.originalStyle) continue; | |
for (let style in rule.originalStyle) | |
rule.style[style] = rule.originalStyle[style]; | |
} | |
} | |
return ss; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- a full working example including inlined StyleChanger --> | |
<html> | |
<head> | |
<style> | |
/* use a simple .dummy rule to identify your stylesheet from the javascript */ | |
.my_custom_identifier {color:black;} | |
/* use identifiable styles so you can flag them from the javascript. in this case, darkolivegreen and aquamarine */ | |
p { | |
color:darkOliveGreen; | |
} | |
h1 { | |
border-bottom:1px solid darkolivegreen; | |
} | |
h2 { | |
color:aquamarine | |
} | |
</style> | |
</head> | |
<body> | |
<h1>TITLE</h1> | |
<h2>subtitle</h2> | |
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non saepe obcaecati recusandae autem ratione natus molestiae vero libero cumque placeat dolorem odit molestias excepturi suscipit voluptatem perspiciatis, magnam dicta velit.</p> | |
<script> | |
var StyleChanger = function(id) { | |
id = id.toLowerCase().trim(); | |
let findSS = function() { | |
for (let ss of document.styleSheets) | |
for (let rule of ss.cssRules) | |
if (rule.selectorText.toLowerCase().substr(1)===id) | |
return ss; | |
} | |
let ss = findSS(); | |
if (!ss) return undefined; | |
ss.change = function(originalValue, newValue) { | |
for (let rule of ss.cssRules) { | |
if (!rule.originalStyle) { // init original rules at first use | |
rule.originalStyle = {}; | |
for (let style of rule.style) | |
rule.originalStyle[style] = rule.style[style]; | |
} | |
for (let style in rule.originalStyle) { // replace rules from original list | |
if (rule.originalStyle[style]===originalValue) | |
rule.style[style] = newValue; | |
} | |
} | |
} | |
ss.reset = function() { | |
for (let rule of ss.cssRules) { | |
if (!rule.originalStyle) continue; | |
for (let style in rule.originalStyle) | |
rule.style[style] = rule.originalStyle[style]; | |
} | |
} | |
return ss; | |
} | |
// find the stylesheet to change | |
var ss = StyleChanger("my_custom_identifier"); | |
// a simple change | |
ss.change("darkolivegreen", "blue"); | |
// more complex usage with successive definitions | |
var val = 0; | |
setInterval(function() { | |
val+=10; | |
ss.change("darkolivegreen", "rgba("+(val%255)+",0,0,1)"); | |
}, 100); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment