给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 相关文章推荐
用js做一个小游戏平台 (一)
Dec 29 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
Mar 26 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
jquery实现的导航固定效果
Apr 28 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
Jun 10 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
Jun 18 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
vue项目中使用Svg的方法
Oct 24 Javascript
详解VUE单页应用骨架屏方案
Jan 17 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 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
PHP 反向排序和随机排序代码
2010/06/30 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
各种快递查询--Api接口
2016/04/26 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
解析Python的缩进规则的使用
2019/01/16 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
pycharm永久激活超详细教程
2020/10/29 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
后勤部长岗位职责
2013/12/14 职场文书
事业单位接收函
2014/01/10 职场文书
财务总经理岗位职责
2014/02/16 职场文书
事假请假条范文
2014/04/11 职场文书
煤矿安全承诺书
2014/05/22 职场文书
幼儿教师求职信
2014/05/24 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS