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 相关文章推荐
Ctrl+Enter提交内容信息
Jun 26 Javascript
JavaScript类库D
Oct 24 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
javascript中Object使用详解
Jan 26 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
用jQuery实现可输入多选下拉组合框实例代码
Jan 18 Javascript
新闻上下滚动jquery 超简洁(必看篇)
Jan 21 Javascript
Nuxt.js SSR与权限验证的实现
Nov 21 Javascript
深入浅出vue图片路径的实现
Sep 04 Javascript
js校验开始时间和结束时间
May 26 Javascript
在Vue 中获取下拉框的文本及选项值操作
Aug 13 Javascript
vue的$http的get请求要加上params操作
Nov 12 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中global和$GLOBALS[]的分析之一
2012/02/02 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
jquery自定义表格样式
2015/11/23 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
微信小程序 选项卡的简单实例
2017/05/24 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
Python PO设计模式的具体使用
2019/08/16 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
Tensorflow 实现释放内存
2020/02/03 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
python的dict判断key是否存在的方法
2020/12/09 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
工作检讨书范文
2015/01/23 职场文书
党员年度个人总结
2015/02/14 职场文书
小时代观后感
2015/06/10 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
Python中itertools库的四个函数介绍
2022/04/06 Python