JavaScript动态插入CSS的方法


Posted in Javascript onDecember 10, 2015

写组件时有时想把一些组件特性相关的 CSS 样式封装在 JS 里,这样更内聚,改起来方便。JS 动态插入 CSS 两个步骤:创建1、一个 style 对象
2、使用 stylesheet 的 insertRule 或 addRule 方法添加样式

一、查看样式表

先看下 document.styleSheets,随意打开一个页面

JavaScript动态插入CSS的方法

其中前三个是通过 link 标签引入的 CSS 文件,第四个是通过 style 标签内联在页面里的 CSS。有如下属性

JavaScript动态插入CSS的方法

 每一个 cssRule 又有如下属性

JavaScript动态插入CSS的方法

其中的 cssText 正是写在 style 的源码。 

二、动态插入 CSS
首先,需要创建一个 style 对象,返回其 stylesheet 对象

/*
 * 创建一个 style, 返回其 stylesheet 对象
 * 注意:IE6/7/8中使用 style.stylesheet,其它浏览器 style.sheet
 */
function createStyleSheet() {
 var head = document.head || document.getElementsByTagName('head')[0];
 var style = document.createElement('style');
 style.type = 'text/css';
 head.appendChild(style);
 return style.sheet ||style.styleSheet;
}

添加函数 addCssRule 如下

/*
 * 动态添加 CSS 样式
 * @param selector {string} 选择器
 * @param rules {string} CSS样式规则
 * @param index {number} 插入规则的位置, 靠后的规则会覆盖靠前的
 */
function addCssRule(selector, rules, index) {
 index = index || 0;
 if (sheet.insertRule) { 
  sheet.insertRule(selector + "{" + rules + "}", index); 
 } else if (sheet.addRule) { 
  sheet.addRule(selector, rules, index); 
 }
}

需要注意,标准浏览器支持 insertRule, IE低版本则支持 addRule。
完整代码如下

/*
 * 动态添加 CSS 样式
 * @param selector {string} 选择器
 * @param rules {string} CSS样式规则
 * @param index {number} 插入规则的位置, 靠后的规则会覆盖靠前的
 */
var addCssRule = function() {
 // 创建一个 style, 返回其 stylesheet 对象
 // 注意:IE6/7/8中使用 style.stylesheet,其它浏览器 style.sheet
 function createStyleSheet() {
  var head = document.head || document.getElementsByTagName('head')[0];
  var style = document.createElement('style');
  style.type = 'text/css';
  head.appendChild(style);
  return style.sheet ||style.styleSheet;
 }
 
 // 创建 stylesheet 对象
 var sheet = createStyleSheet();
 
 // 返回接口函数
 return function(selector, rules, index) {
  index = index || 0;
  if (sheet.insertRule) { 
   sheet.insertRule(selector + "{" + rules + "}", index); 
  } else if (sheet.addRule) { 
   sheet.addRule(selector, rules, index); 
  }
 }
}();

如果只支持移动端或现代浏览器,可以去掉低版本IE判断的代码

/*
 * 动态添加 CSS 样式
 * @param selector {string} 选择器
 * @param rules {string} CSS样式规则
 * @param index {number} 插入规则的位置, 靠后的规则会覆盖靠前的,默认在后面插入
 */
var addCssRule = function() {
 // 创建一个 style, 返回其 stylesheet 对象
 function createStyleSheet() {
  var style = document.createElement('style');
  style.type = 'text/css';
  document.head.appendChild(style);
  return style.sheet;
 }
 
 // 创建 stylesheet 对象
 var sheet = createStyleSheet();
 
 // 返回接口函数
 return function(selector, rules, index) {
  index = index || 0;
  sheet.insertRule(selector + "{" + rules + "}", index);
 }
}();

以上就是JavaScript动态插入CSS的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
模拟select的代码
Oct 19 Javascript
jquery根据name属性查找的小例子
Nov 21 Javascript
javascript中定义类的方法汇总
Dec 28 Javascript
js实现分享到随页面滚动而滑动效果的方法
Apr 10 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
Aug 21 Javascript
jquery实现的横向二级导航效果代码
Aug 26 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
angularjs 动态从后台获取下拉框的值方法
Aug 13 Javascript
vue cli3适配所有端方案的实现
Apr 13 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 #Javascript
js表单提交和submit提交的区别实例分析
Dec 10 #Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 #Javascript
JS提交form表单实例分析
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 #Javascript
AngularJs实现ng1.3+表单验证
Dec 10 #Javascript
You might like
php Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
jquery 手势密码插件
2017/03/17 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python中range()与xrange()用法分析
2016/09/21 Python
快速查询Python文档方法分享
2017/12/27 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
python的pip安装以及使用教程
2018/09/18 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python学习笔记之装饰器
2020/08/06 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
院药学专业个人求职信
2013/09/21 职场文书
学校卫生检查制度
2014/02/03 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
python的变量和简单数字类型详解
2021/09/15 Python
python使用torch随机初始化参数
2022/03/22 Python