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 相关文章推荐
基于jQuery实现表格数据的动态添加与统计的代码
Jan 31 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 Javascript
js实现登录拖拽窗口
Feb 10 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
Jul 13 Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
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新手上路(十三)
2006/10/09 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
js里的prototype使用示例
2010/11/19 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JavaScript内置对象math,global功能与用法实例分析
2019/06/10 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Python实现注册登录系统
2017/08/08 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
代码分析Python地图坐标转换
2018/02/08 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
Python调用C语言程序方法解析
2020/07/07 Python
Django model class Meta原理解析
2020/11/14 Python
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
电气专业应届生求职信
2013/11/01 职场文书
医学专业毕业生个人的求职信
2013/12/04 职场文书
医院门卫岗位职责
2013/12/30 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
会计求职信范文
2014/05/24 职场文书
2014和解协议书范文
2014/09/15 职场文书
企业百日安全活动总结
2015/05/07 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书