给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 相关文章推荐
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
javascript bom是什么及bom和dom的区别
Nov 26 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
JavaScript常用字符串与数组扩展函数小结
Apr 24 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
关于vue.extend和vue.component的区别浅析
Aug 16 Javascript
jQuery实现的简单前端搜索功能示例
Oct 28 jQuery
Angular实现的table表格排序功能完整示例
Dec 22 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
Nov 24 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
thinkphp四种url访问方式详解
2014/11/28 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
文字幻灯片
2006/06/26 Javascript
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
二行代码解决全部网页木马
2008/03/28 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
python使用分治法实现求解最大值的方法
2015/05/12 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
学校门卫工作职责
2013/12/07 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
转党组织关系介绍信
2014/01/08 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
物业品质提升方案
2014/06/08 职场文书
企业标语大全
2014/07/01 职场文书
销售人员求职信
2014/07/22 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP