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自动显示最后更新时间
Mar 15 Javascript
Extjs学习笔记之六 面版
Jan 08 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
Mar 16 Javascript
22点关于jquery性能优化的建议
May 28 Javascript
使用JavaScript实现旋转的彩圈特效
Jun 23 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
jquery实现输入框实时输入触发事件代码
Dec 21 Javascript
基于vue2.0动态组件及render详解
Mar 17 Javascript
微信小程序实现顶部下拉菜单栏
Nov 04 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
PHP三元运算符的结合性介绍
2012/01/10 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python实现ping指定IP的示例
2018/06/04 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python os.access()用法实例
2019/02/18 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
单位法人授权委托书范本
2014/10/09 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS