给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插件validate验证的小例子
May 08 Javascript
js中substring和substr的详细介绍与用法
Aug 29 Javascript
document.forms用法示例介绍
Jun 26 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
Dec 11 Javascript
JavaScript下拉菜单功能实例代码
Mar 01 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
Apr 13 jQuery
浅谈sass在vue注意的地方
Aug 10 Javascript
react+redux的升级版todoList的实现
Dec 18 Javascript
微信小程序实现九宫格抽奖
Apr 15 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 Javascript
JavaScript实现跟随鼠标移动的盒子
Jan 28 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实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
详解php中 === 的使用
2016/10/24 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
通过python爬虫赚钱的方法
2019/01/29 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python导入库的具体方法
2020/06/18 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
公司财务总监岗位职责
2013/12/14 职场文书
就业协议书范本
2014/04/11 职场文书
2014年校长工作总结
2014/12/11 职场文书
教师病假条范文
2015/08/17 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
AngularJS实现多级下拉框
2022/03/25 Javascript