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 相关文章推荐
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
几个高效,简洁的字符处理函数
Apr 12 Javascript
javascript 极速 隐藏/显示万行表格列只需 60毫秒
Mar 28 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
AngularJS中的指令全面解析(必看)
May 20 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
Oct 11 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
javascript cookie的基本操作(添加和删除)
Jul 24 Javascript
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
微信小程序实现录音Record功能
May 09 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文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
js实现上传图片之上传前预览图片
2013/03/25 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python中设置变量访问权限的方法
2015/04/27 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python gevent协程切换实现详解
2020/09/14 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2014教师年度工作总结
2014/11/10 职场文书
初中物理教学反思
2016/02/19 职场文书
python绘制箱型图
2021/04/27 Python