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 相关文章推荐
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
jquery mobile实现可折叠的导航按钮
Mar 11 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
layui实现数据表格table分页功能(ajax异步)
Jul 27 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 Javascript
vue+elementUI实现表格列的显示与隐藏
Apr 13 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
第七节--类的静态成员
2006/11/16 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue写一个组件
2018/04/09 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
高级护理实习生自荐信
2013/09/28 职场文书
心理健康心得体会
2014/01/02 职场文书
党支部承诺书范文
2014/03/28 职场文书
银行委托书范本
2014/04/04 职场文书
文明礼仪演讲稿
2014/05/12 职场文书
2014年副班长工作总结
2014/12/10 职场文书
武侯祠导游词
2015/02/04 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Python实现为PDF去除水印的示例代码
2022/04/03 Python