给before和after伪元素设置js效果的方法


Posted in Javascript onDecember 04, 2015

层叠样式表(CSS)的主要目的是给HTML元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的。事实上CSS中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是“伪元素”。

前面的话

 无法直接给before和after伪元素设置js效果 

例子说明

现在需要为(id为box,内容为"我是测试内容"的div)添加(:before内容为"前缀",颜色为红色的伪类)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">

<title>Document</title>
</head>
<body>

<div id="box">我是测试内容</div>
<script>

var oBox = document.getElementById('box');
</script>
</body>
</html>

解决办法

【方法一】动态嵌入CSS样式

IE8-浏览器将<style>标签当作特殊的节点,不允许访问其子节点。IE10-浏览器支持使用styleSheet.cssText属性来设置样式。兼容写法如下:

<script>
function loadStyleString(css){
  var style = document.createElement("style");
  style.type = "text/css";
  try{
    style.appendChild(document.createTextNode(css));
  }catch(ex){
    style.styleSheet.cssText = css;
  }
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(style);
}
loadStyleString("#box:before{content:'前缀';color: red;}");
<script>

【方法二】添加自带伪类的类名

<style>
  .change:before{content: "前缀";color: red;}
</style> 
<script>
  oBox.className = 'change';
</script>

[缺点]此方法无法控制伪元素里面的content属性的值

【方法三】利用setAttribute实现自定义content内容

<style>
.change:before{content: attr(data-beforeData);color: red;}
</style> 
<script>
  oBox.setAttribute('data-beforeData','前缀');
</script>

[注意]此方法只可用setAttribute实现,经测试用dataset方法无效

【方法四】添加样式表

firefox浏览器不支持addRule()方法,IE8-浏览器不支持insertRule()方法。兼容写法如下:

<script>
  function insertRule(sheet,ruleKey,ruleValue,index){
  return sheet.insertRule ? sheet.insertRule(ruleKey+ '{' + ruleValue + '}',index) : sheet.addRule(ruleKey,ruleValue,index);

} 
  insertRule(document.styleSheets[0],'#box:before','content:"前缀";color: red;',0)  
</script>

[缺点]该方法必须有内部<style>或用<link>链接外部样式,否则若不存在样式表,则document.styleSheets为空列表,则报错

【方法五】修改样式表

先使用方法四添加空的样式表,然后获取新生成的<style>并使用其innerHTML属性来修改样式表

<script>
function loadStyleString(css){
  var style = document.createElement("style");
  style.type = "text/css";
  try{
    style.appendChild(document.createTextNode(css));
  }catch(ex){
    style.styleSheet.cssText = css;
  }
  var head = document.getElementsByTagName('head')[0];
  head.appendChild(style);
}
loadStyleString('');
document.head.getElementsByTagName('style')[1].innerHTML = "#oBox:before{color: " + colorValue + ";}";
</script>

[注意]只能使用getElementsByTagName('style')[1]的方法,经测验使用stylesheets[1]方法无效

DEMO

<演示框>点击下列相应属性值可进行演示

给before和after伪元素设置js效果的方法

Javascript 相关文章推荐
Javascript常用运算符(Operators)-javascript基础教程
Dec 14 Javascript
重载toString实现JS HashMap分析
Mar 13 Javascript
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
控制文字内容的显示与隐藏示例
Jun 11 Javascript
JavaScript中的类数组对象介绍
Dec 30 Javascript
AngularJS基础教程之简单介绍
Sep 27 Javascript
微信jssdk用法汇总
Jul 16 Javascript
Javascript的this用法
Jan 16 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
JQuery插件tablesorter表格排序实现过程解析
May 28 jQuery
Vue生命周期activated之返回上一页不重新请求数据操作
Jul 26 Javascript
全面解析Bootstrap手风琴效果
Apr 17 #Javascript
简单对比分析JavaScript中的apply,call与this的使用
Dec 04 #Javascript
详解JavaScript的Date对象(制作简易钟表)
Apr 07 #Javascript
浅析2种JavaScript继承方式
Dec 04 #Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
Dec 03 #Javascript
浅析jQuery Mobile的初始化事件
Dec 03 #Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
Dec 03 #Javascript
You might like
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
js星星评分效果
2014/07/24 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
js实现随机点名功能
2020/12/23 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
基于Python函数和变量名解析
2019/07/19 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
天猫精选:上天猫,就够了
2016/09/21 全球购物
项目投资建议书
2014/05/16 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python