深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法

×

目录

[1]动态样式 [2]CSS类[3]setAttribute()[4]CSSRule对象添加[5]空样式覆盖[6]CSSRule对象删除

前面的话

  我们可以通过计算样式来读取伪元素的样式信息,但是却无法使用javascript来直接操作伪元素,本文以一个需求解决为例,详细介绍脚本化伪元素的6种方法

需求说明

  【1】为id=box的div元素添加content="前缀"的:before伪元素

  【2】为已经添加:before伪元素的div元素删除伪元素

   [注意]由于IE7-浏览器不支持:before伪元素,所以该需求兼容到IE8

添加伪元素

方法一:动态样式

  可以采用动态样式的方法,动态生成<style>标签及相关的伪元素样式内容

  由于IE8-浏览器将<style>标签当作特殊的节点,不允许访问其子节点及设置innerHTML属性,需要使用CSSStyleSheet对象的cssText属性来实现兼容

<div id="box">测试文字</div>
<button id="btn">添加伪元素</button>
<script>
//添加伪元素
function loadStyles(str){
    //设置标记,防止重复添加
    loadStyles.mark = ‘load‘;
    var style = document.createElement("style");
    style.type = "text/css";
    try{
        style.innerHTML = str;
    }catch(ex){
        //IE8-浏览器兼容
        style.styleSheet.cssText = str;
    }
    var head = document.getElementsByTagName(‘head‘)[0];
    head.appendChild(style);
}
btn.onclick = function(){
    //当样式表没有添加过时,添加
    if(loadStyles.mark != ‘load‘){
        loadStyles("#box:before{content:‘前缀‘;color: red;}");
    }
}
</script>        

方法二:添加自带伪元素的类名

  在处理大量CSS样式时,一般采用脚本化CSS类的方法。而添加伪元素,也可以使用类似的技术。把伪元素的样式挂在一个新类名上,然后把元素的className设置为新类名

<style>
.add:before{content: "前缀";color: blue;}
</style>

<div id="box">测试文字</div>
<button id="btn">添加伪元素</button>
<script>
btn.onclick = function(){
    box.className = ‘add‘;
}
</script>

方法三:利用setAttribute()方法实现自定义伪元素内容

  若使用方法二,无法自定义伪元素的内容,拓展性不高

  伪元素的content属性非常强大,它的值可以有以下选择,关于content属性的详细信息移步至此

content:<string>|<uri>|attr(<identifier>)

  使用content属性中的attr()值配合setAttribute()方法就可以实现自定义伪元素的内容

  IE8-浏览器需要在元素特性中出现data-beforeData(设置为空字符串即可),才可以效果;其他浏览器无此问题

<style>
#box:before{content: attr(data-beforeData);color: red;}
</style>

<!--为了兼容IE8-,需要在元素特性中设置 data-beforeData=""-->
<div id="box"  data-beforeData="">测试文字</div>
<button id="btn">添加伪元素</button>
<script>
btn.onclick = function(){
    box.setAttribute(‘data-beforeData‘,‘前缀‘);
}
</script>

dataset

  HTML5新增了dateset数据集特性,将元素特性和对象属性联系在了一起

  [注意]IE10-浏览器不支持

  如果不考虑兼容,同样可以实现dateset来实现,但是由于dataset的解释规则,元素特性的值不可以出现大写,需要进行局部修改

  经测试,IE11浏览器不支持使用dateset动态修改伪元素

<style>
#box:before{content: attr(data-before);color: red;}
</style>

<div id="box">测试文字</div>
<button id="btn">添加伪元素</button>
<script>
btn.onclick = function(){
    box.dataset.before = ‘前缀‘;
}
</script>

方法四:通过CSSRule对象添加样式

  虽然伪元素的样式无法通过操作行间样式来直接添加,但是可以通过CSSRule对象通过操作内部样式表实现

  如果存在内部样式表,即存在<style>标签,则直接在<style>标签中添加样式;否则先新建<style>标签,再添加样式

<div id="box">测试文字</div>
<button id="btn">添加伪元素</button>
<script>
//作为存在<style>标签的标记,1表示存在,0表示不存在
var mark = 0;
var tags = document.getElementsByTagName(‘*‘);
function addStyle(obj){
    var str = ‘#box:before{content:"前缀";color: pink;}‘;
    var sheet = obj.sheet || obj.styleSheet;
    var rules = sheet.cssRules|| sheet.rules;
    for(var i = 0,len = rules.length; i < len; i++){
        //如果已经设置了:before伪元素的样式,就不再重复添加
        if(/:before/.test(rules[i].selectorText)){
            //obj.mark表示是否设置了:before伪元素的样式,1为已设置,0为未设置
            obj.mark = 1;
            break;
        }
    }
    //如果未设置伪元素样式
    if(!obj.mark){
        if(sheet.insertRule){
            sheet.insertRule(‘#box:before{content:"前缀";color:green;}‘,0);
        }else{
            sheet.addRule(‘#box:before‘,‘content:"前缀";color:green;‘,0);
        }
    }
}
btn.onclick = function(){
    for(var i = 0; i < tags.length; i++){
        if(tags[i].nodeName == ‘STYLE‘){
            mark = 1;
            //添加伪元素
            addStyle(tags[i]);
            break;
        }
    }
    if(!mark){
        //新建<style>标签
        var ele = document.createElement(‘style‘);
        document.getElementsByTagName(‘head‘)[0].appendChild(ele);
        //添加伪元素
        addStyle(ele);
    }
}
</script>    

删除伪元素

  相比于新增伪元素来说,删除伪元素要困难一些。因为<style>元素中可能还有许多其他的样式,所以只能通过覆盖或删除指定样式来实现

方法一:空样式覆盖

  使用优先级更高的:before伪元素的空样式来覆盖原有样式

<style>
#box:before{content:"前缀";color:green;}
.remove:before{content:""!important;}
</style>

<div id="box">测试文字</div>
<button id="btn">删除伪元素</button>
<script>
btn.onclick = function(){
    box.className = ‘remove‘;
}
</script>    

方法二:通过CSSRule对象删除指定

  通过selectorText找出CSSRule对象中的:before伪元素的CSS规则

  [注意]在IE8浏览器中,:before伪元素选择器文本会自动将冒号置为单冒号,而其他浏览器会自动将冒号置为双冒号

  然后使用deleteRule()方法或removeRule()方法删除指定样式

<style>
#box::before{content:"前缀";color:green;}
</style>

<div id="box">测试文字</div>
<button id="btn">删除伪元素</button>
<script>
function deleteStyles(){
    var sheet = document.styleSheets[0];
    var rules = sheet.cssRules || sheet.rules;
    for(var i = 0; i < rules.length; i++){
        //找出伪元素
        if(/#box:(:)?before/.test(rules[i].selectorText)){
            if(sheet.deleteRule){
                sheet.deleteRule(i);
            //兼容IE8-浏览器
            }else{
                sheet.removeRule(i);
            }
        }
    }
}
btn.onclick = function(){
    deleteStyles();
}
</script>

最后

  脚本化CSS系列终于完结了,基本上把使用javascript操作CSS的内容都囊括了

  【1】脚本化行间样式

  【2】查询计算样式

  【3】脚本化CSS类

  【4】脚本化样式表

  【5】动态样式

  【6】脚本化伪元素

  欢迎交流

时间: 2024-11-19 19:47:13

深入理解脚本化CSS系列第六篇——脚本化伪元素的6种方法的相关文章

深入理解脚本化CSS系列第三篇——脚本化CSS类

前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接改变其行间样式 <div id="test" style="height:100px;width:100px;background-color:blue;"></div> <script> test.onclick = functio

深入理解脚本化CSS系列第四篇——脚本化样式表

× 目录 [1]CSSStyleSheet [2]CSSRule 前面的话 关于脚本化CSS,查询样式时,查询的是计算样式:设置单个样式时,设置的是行间样式:设置多个样式时,设置的是CSS类名.脚本化样式表当然也是一种脚本化CSS的技术,虽然不经常使用,但有时却非常有用.下面将详细介绍脚本化样式表的内容 CSSStyleSheet CSSStyleSheet类型表示的是样式表.我们知道,引入CSS一共有3种方式,包括行间样式.内部样式和外部样式.其中,内部样式和外部样式分别通过<style>和

深入理解脚本化CSS系列第五篇——动态样式

前面的话 很多时候,DOM操作比较简单明了,因此用javascript生成那些通常原本是HTML代码生成的内容并不麻烦.但由于浏览器充斥着隐藏的陷阱和不兼容问题,处理DOM中的某些部分时要复杂一些,比如动态样式就相对较复杂 所谓动态样式,是指在页面加载时并不存在,在页面加载完成后动态添加到页面的样式 动态样式包括两种情况:一种是通过<link>元素插入外部样式表,另一种是通过<style>元素插入内部样式.下面将详细介绍这两种情况 外部样式 /*style.css里面的内容*/ .

CSS 隐藏页面元素的 几 种方法总结

用 CSS 隐藏页面元素有许多种方法.你可以将 opacity 设为 0.将 visibility 设为 hidden.将 display 设为 none 或者将 position 设为 absolute 然后将位置设到不可见区域. 你有没有想过,为什么我们要有这么多技术来隐藏元素,而它们看起来都实现的是同样的效果?每一种方法实际上与其他方法之间都有一些细微的不同,这些不同决定了在一个特定的场合下使用哪一个方法.我们只需要记住的细小不同点,根据不同情况选择上面这些方法中适合的方法来隐藏元素. d

用 CSS 隐藏页面元素的 5 种方法

原文链接:用 CSS 隐藏页面元素的 5 种方法,转载请注明来源! 用 CSS 隐藏页面元素有许多种方法.你可以将 opacity 设为 0.将 visibility 设为 hidden.将 display 设为 none 或者将 position 设为 absolute 然后将位置设到不可见区域. 你有没有想过,为什么我们要有这么多技术来隐藏元素,而它们看起来都实现的是同样的效果?每一种方法实际上与其他方法之间都有一些细微的不同,这些不同决定了在一个特定的场合下使用哪一个方法.这篇教程将覆盖到

CSS 隐藏元素的八种方法

前言 总括: 本文详细讲述了在网页中用CSS隐藏元素的七种方法. 原文博客地址:从隐藏元素谈起 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 念念不忘,必有回响;有一口气,点一盏灯. 正文 说起隐藏元素我想每一个前端er都能说起几种,但能说全的我想就不是很多了.博主总结了几种隐藏元素的方法,总结如下: 1 div{ 2 3 overflow:hidden 4 opacity:0: 5 visibility:hidd

CSS实现自适应不同大小屏幕的背景大图的两种方法(转自简书)

CSS实现自适应不同大小屏幕的背景大图的两种方法 一张清晰漂亮的背景图片能给网页加分不少,设计师也经常会给页面的背景使用大图,我们既不想图片因为不同分辨率图片变形,也不希望当在大屏的情况下,背景有一块露白,简而言之,就是实现能自适应屏幕大小又不会变形的背景大图,而且背景图片不会随着滚动条滚动而滚动. 用CSS实现真的很简单很简单,下面我们来看一下第一种方法具体的代码: HTML代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <m

深入理解脚本化CSS系列第一篇——脚本化行内样式

× 目录 [1]用法 [2]属性 [3]方法 前面的话 脚本化CSS,通俗点说,就是使用javascript来操作CSS.引入CSS有3种方式:外部样式,内部样式和行间样式.本文将主要介绍脚本化行间样式 基本用法 行间样式又叫内联样式,使用HTML的style属性进行设置 <div style="height: 40px;width: 40px;background-color: blue;"></div> element元素节点提供style属性,用来操作CS

CSS“隐藏”元素的几种方法的对比

一说起CSS隐藏元素,我想大部分小伙伴们都会想到的第一种方法就是设置display为none.这是最为人所熟知也是最常用的方法.我相信还有不少人想到使用设置visibility为hidden来隐藏元素,这种方式也是常用的方法,而且也有很多人知道两者的不同.除了这两种方法,本文还总结了一些比较不常用的方法,比较了这几种“隐藏”元素方法的区别和优缺点,欢迎大家交流!! 几种方法的简单介绍 首先我们分别来说说到底有哪几种隐藏元素的方法,有一些方法是众所周知的,还有一些算是一种技巧. display:n