给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 相关文章推荐
关于恒等于(===)和非恒等于(!==)
Aug 20 Javascript
javascript 传统事件模型构造的事件监听器实现代码
May 31 Javascript
javascript操作referer详细解析
Mar 10 Javascript
JS将光标聚焦在文本最后的实现代码
Mar 28 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
js实现多图左右切换功能
Aug 04 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
Sep 29 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
解决Vue项目中tff报错的问题
Oct 21 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
Terran魔法科技
2020/03/14 星际争霸
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
php 移除数组重复元素的一点说明
2008/11/27 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
javascript 实现map集合
2015/04/03 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Django用户身份验证完成示例代码
2020/04/03 Python
在python中修改.properties文件的操作
2020/04/08 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
python中_del_还原数据的方法
2020/12/09 Python
Ego Shoes官网:英国时髦鞋类品牌
2020/10/19 全球购物
幼儿师范毕业生自荐信
2013/11/09 职场文书
传媒专业推荐信范文
2013/11/23 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
兵马俑的导游词
2015/02/02 职场文书
小学感恩节活动总结
2015/03/24 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
Python OpenCV之常用滤波器使用详解
2022/04/07 Python