给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 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
JS 页面自动加载函数(兼容多浏览器)
May 18 Javascript
javascript instanceof 与typeof使用说明
Jan 11 Javascript
jQuery bind事件使用详解
May 05 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 Javascript
JavaScript解析任意形式的json树型结构展示
Jul 23 Javascript
详解微信小程序中的页面代码中的模板的封装
Oct 12 Javascript
iview table render集成switch开关的实例
Mar 14 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
小程序最新获取用户昵称和头像的方法总结
Sep 23 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
php session和cookie使用说明
2010/04/07 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
PDO::quote讲解
2019/01/29 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
python装饰器与递归算法详解
2016/02/18 Python
Python自动生产表情包
2017/03/17 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
高考自主招生自荐信
2013/10/20 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
python爬虫selenium模块详解
2021/03/30 Python
解决python存数据库速度太慢的问题
2021/04/23 Python
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js