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 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
Jan 18 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 Javascript
Javascript使用post方法提交数据实例
Aug 03 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
js实现非常棒的弹出div
Oct 06 Javascript
微信小程序表单验证功能完整实例
Dec 01 Javascript
详解react关于事件绑定this的四种方式
Mar 09 Javascript
JavaScript函数的特性与应用实践深入详解
Dec 30 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魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中正则表达式详解
2017/05/17 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
python如何快速拼接字符串
2020/10/28 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
银行办公室岗位职责
2014/03/10 职场文书
学习雷锋活动总结
2014/04/29 职场文书
天鹅湖观后感
2015/06/09 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
Python打包为exe详细教程
2021/05/18 Python