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 相关文章推荐
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
Apr 20 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
Sep 28 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 Javascript
JS实现标签页效果(配合css)
Apr 03 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
Feb 04 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
vue ssr 指南详读
Jun 29 Javascript
Element UI框架中巧用树选择器的实现
Dec 12 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 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+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python set集合使用方法解析
2019/11/05 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Pycharm小白级简单使用教程
2020/01/08 Python
python基于property()函数定义属性
2020/01/22 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
实习教师自我鉴定
2013/09/27 职场文书
酒店保洁主管岗位职责
2013/11/28 职场文书
法律进学校实施方案
2014/03/15 职场文书
法制宣传教育方案
2014/05/09 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
2015党建工作简报
2015/07/21 职场文书
2015大一新生军训感言
2015/08/01 职场文书
2016年少先队活动总结
2016/04/06 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
python中的装饰器该如何使用
2021/06/18 Python