给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 相关文章推荐
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
Dec 21 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
微信小程序开发实战教程之手势解锁
Nov 18 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
Dec 12 Javascript
Javascript循环删除数组中元素的几种方法示例
May 18 Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 Javascript
node.js基础知识汇总
Aug 25 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
全面解析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基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
jQuery最佳实践完整篇
2011/08/20 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
javascript的几种写法总结
2016/09/30 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
Vue 实现拨打电话操作
2020/11/16 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python中调用其他程序的方式详解
2019/08/06 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python关于调用函数外的变量实例
2019/12/26 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
Ajax的工作原理
2015/12/04 面试题
硕士生找工作求职信
2014/07/05 职场文书
节水倡议书
2015/01/19 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
学期个人自我总结
2015/02/13 职场文书
清洁工工作总结
2015/08/11 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫