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 变量作用域 代码分析
Jun 26 Javascript
ext checkboxgroup 回填数据解决
Aug 21 Javascript
2012年开发人员的16款新鲜的jquery插件体验分享
Dec 28 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
Bootstrap提示框效果的实例代码
Jul 12 Javascript
Javascript中Promise的四种常用方法总结
Jul 14 Javascript
js原生日历的实例(推荐)
Oct 31 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
May 08 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
Nov 26 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
如何正确理解vue中的key详解
Nov 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
PHP分页显示制作详细讲解
2006/10/09 PHP
php 判断数组是几维数组
2013/03/20 PHP
深入php处理整数函数的详解
2013/06/09 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
PHP5.3新特性小结
2016/02/14 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
javascript背投广告代码的完善
2008/04/08 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
2019/04/17 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
浅析Python 中整型对象存储的位置
2016/05/16 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
地方白酒代理协议书
2014/10/25 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python