js设置beforeheaders|js设置before和after伪元素效果的方法总结

更新时间:2020-03-24    来源:js教程    手机版     字体:

【www.bbyears.com--js教程】

我们知道,我们无法直接给before和after伪元素设置js效果

例子说明

现在需要为(id为box,内容为"我是测试内容"的div)添加(:before内容为"前缀",颜色为红色的伪元素)





  
  Document


  我是测试内容
  <script>
    var oBox = document.getElementById('box');
  </script>




 
解决办法

【方法一】动态嵌入CSS样式

IE8-浏览器

<script>
    oBox.className = 'change';
</script>

[缺点]此方法无法控制伪元素里面的content属性的值

 
【方法三】利用setAttribute实现自定义content内容



<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>


[缺点]该方法必须有内部

正文内容



<script>
var css=function(t,s){
    s=document.createElement('style');
    s.innerText=t;
    document.body.appendChild(s);
};

document.onclick=function(){
    css('p:after{content:\'修改一下\'}');
};
</script>

进化版

这样写了功能实现了,优雅欠佳,作为进化版,其实就是用class名来重写样式,

p:after{content:'我是后缀'}
p.change{content:'我是修改过的后缀'}

只要在需要的时候,给p标签添加change这个class就可以实现替换的目的。原理和第一个没什么区别。这样写的好处是,改变起来更优雅灵活,用class做了个钩子。


再进化版

上个版本已经解决了切换的问题,如果有更多可以不断的切换class,但是想下这种方式也还是有点笨重,因为可能要写很多css,如果是想换的内容是不确定的,需要用变量来处理呢?这时候,可能会想到用 第一种方法就可以了,但是第一种方式真的不是很优雅。还有什么方式呢?
在css中,伪元素的content是能读取到data属性的。
也就是说我们可以这样写css

p:after {
    content: attr(data-content);
}

在进化版是第二版的变种,

css文件

p.change:after {
    content: attr(data-content);
}

js文件

$(this).addClass('change').attr('data-content', content);

这样你就可以随意改动了。

最后一种方法是由bumfod提供方法很hack了,遍历了所有的css文档,找到伪元素,然后更改,有兴趣的同学可以尝试下

本文来源:http://www.bbyears.com/wangyezhizuo/89445.html

猜你感兴趣