给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 相关文章推荐
jQuery 常见操作实现方式和常用函数方法总结
May 06 Javascript
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
jquery ztree实现树的搜索功能
Feb 25 Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 Javascript
完美解决JS文件页面加载时的阻塞问题
Dec 18 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
vue左侧菜单,树形图递归实现代码
Aug 24 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
Feb 13 Javascript
JavaScript实现指定数量的并发限制的示例代码
Mar 10 Javascript
JS实现烟花爆炸效果
Mar 10 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
Jan 19 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的基本常识小结
2013/07/05 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
php的curl封装类用法实例
2014/11/07 PHP
用PHP代码给图片加水印
2015/07/01 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
Python读写unicode文件的方法
2015/07/10 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python实现二维数组输出为图片
2018/04/03 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
django跳转页面传参的实现
2020/09/17 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
英国自行车商店:AW Cycles
2021/02/24 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
小学学校评估方案
2014/06/08 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
普通话宣传标语
2014/06/26 职场文书
护士实习自荐信
2015/03/06 职场文书
党员转正大会主持词
2015/07/02 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL