给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 AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
Jun 19 Javascript
详解AngularJS中自定义过滤器
Dec 28 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
JQuery 动态生成Table表格实例代码
Dec 02 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
Oct 12 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
JavaScript实现背景自动切换小案例
Sep 27 Javascript
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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
JS 对象介绍
2010/01/20 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
JS前端加密算法示例
2016/12/22 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
python远程登录代码
2008/04/29 Python
Python读写Excel文件的实例
2013/11/01 Python
python函数形参用法实例分析
2015/08/04 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python如何求100以内的素数
2020/05/27 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
与UNIX有关的几个名词
2015/09/17 面试题
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
党员干部承诺书
2014/03/25 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
活动倡议书范文
2014/05/13 职场文书
护士求职信
2014/07/05 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
处级干部考察材料
2014/12/24 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL