向当前style sheet中插入一个新的style实现方法


Posted in Javascript onApril 01, 2013

很少会插入一个新的style rule,今天为了临时解决页面样式问题,需要更新很多页面的一些样式,这些页面都引用了一个公共的js,为了方便,直接在这个公共的js里面向style sheet插入新的style rule。

先看代码:

/** 
* Add a stylesheet rule to the document (may be better practice, however, 
* to dynamically change classes, so style information can be kept in 
* genuine styesheets (and avoid adding extra elements to the DOM)) 
* Note that an array is needed for declarations and rules since ECMAScript does 
* not afford a predictable object iteration order and since CSS is 
* order-dependent (i.e., it is cascading); those without need of 
* cascading rules could build a more accessor-friendly object-based API. 
* @param {Array} decls Accepts an array of JSON-encoded declarations 
* @example 
addStylesheetRules([ 
['h2', // Also accepts a second argument as an array of arrays instead 
['color', 'red'], 
['background-color', 'green', true] // 'true' for !important rules 
], 
['.myClass', 
['background-color', 'yellow'] 
] 
]); 
*/ 
function addStylesheetRules (decls) { 
var style = document.createElement('style'); 
document.getElementsByTagName('head')[0].appendChild(style); 
if (!window.createPopup) { /* For Safari */ 
style.appendChild(document.createTextNode('')); 
} 
var s = document.styleSheets[document.styleSheets.length - 1]; 
for (var i=0, dl = decls.length; i < dl; i++) { 
var j = 1, decl = decls[i], selector = decl[0], rulesStr = ''; 
if (Object.prototype.toString.call(decl[1][0]) === '[object Array]') { 
decl = decl[1]; 
j = 0; 
} 
for (var rl=decl.length; j < rl; j++) { 
var rule = decl[j]; 
rulesStr += rule[0] + ':' + rule[1] + (rule[2] ? ' !important' : '') + ';\n'; 
} 
if (s.insertRule) { 
s.insertRule(selector + '{' + rulesStr + '}', s.cssRules.length); 
} 
else { /* IE */ 
s.addRule(selector, rulesStr, -1); 
} 
} 
}

addStylesheetRules(["div.content", ["color": "#000"], ["border-width","1px"], ["border-style", "solid"]])

执行后当前document的head标签内,多了一个style
<style> 
div.content{color:#000;border:1px solid} 
</style

知道怎么调用了吧,每次调用都会插入一个新的style,所以最好调用一次,插入多个rule
addStylesheetRules( 
[selector, [attr, value], …], 
[selector, [attr, value], …] 
);

主要用到两个方法
标准方法:stylesheet.insertRule(rule, index)
rule:被插入的rule,如 div.content{color:#000}
index: 插入顺序,先后顺序会影响样式的。从0开始
firefox、chrome、opera、safri、ie从ie9开始也支持这个方法
ie的stylesheet.addRule (selector, styleDef [, positionIndex]);
selector:如div.content
styleDef:如color:#000
positionIndex:默认-1,插入到末尾
ie、safari、chrome支持这个方法
Javascript 相关文章推荐
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
判断div滑动到底部的scroll实例代码
Nov 15 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
小程序实现多列选择器
Feb 15 Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
Aug 26 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 Javascript
Vue双向绑定实现原理与方法详解
May 07 Javascript
js实现从右往左匀速显示图片(无缝轮播)
Jun 29 Javascript
select标签模拟/美化方法采用JS外挂式插件
Apr 01 #Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 #Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 #Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 #Javascript
表单验证的完整应用案例探讨
Mar 29 #Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
Mar 29 #Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 #Javascript
You might like
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
js实现楼层导航功能
2017/02/23 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python单链表实现代码实例
2013/11/21 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
python实现数组插入新元素的方法
2015/05/22 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
python表格存取的方法
2018/03/07 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
中文系师范生自荐信
2013/10/01 职场文书
监察建议书范文
2014/03/12 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
山楂树之恋观后感
2015/06/11 职场文书
初一军训感言
2015/08/01 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python