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的ready函数与JS的onload的区别详解
Nov 21 Javascript
jQuery动画与特效详解
Feb 01 Javascript
js实现跨域的多种方法
Dec 25 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
Dec 11 Javascript
微信小程序 slider的简单实例
Apr 19 Javascript
mongoose中利用populate处理嵌套的方法
May 26 Javascript
谈谈对vue响应式数据更新的误解
Aug 01 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 Javascript
从0搭建vue-cli4脚手架
Jun 17 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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+JavaScript实现无刷新上传图片
2017/02/21 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
Highcharts入门之简介
2016/08/02 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
理解javascript async的用法
2017/08/22 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
英文求职信结束语大全
2013/10/26 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
数学系个人求职信范文
2014/01/30 职场文书
五好党支部事迹材料
2014/02/06 职场文书
陈欧的广告词
2014/03/18 职场文书
建设工程授权委托书
2014/09/22 职场文书
2015年药店工作总结
2015/04/20 职场文书
大学生团日活动总结
2015/05/06 职场文书
运动会广播稿100字
2015/08/19 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
python scrapy简单模拟登录的代码分析
2021/07/21 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL