zoukankan      html  css  js  c++  java
  • js如何动态控制伪元素

    什么是伪元素

    伪元素用于向某些选择器设置特殊效果。
    已存在元素是指DOM中存在的,伪元素则是虚拟的一种,样式也是给这个虚拟的元素使用的。
    比如伪元素 :before和:after,用于在CSS渲染中向元素的头部或尾部插入内容,它们不受文档约束,也不影响文档本身,只影响最终样式。这些添加的内容不会出现在DOM中,仅仅是在CSS渲染层中加入。它不存在于文档中,所以JS无法直接操作它。而jQuery的选择器都是基于DOM元素的,因此也并不能直接操作伪元素。

    哪些是伪元素

    • :first-letter:向文本的第一个字母添加特殊样式。 
    • :first-line: 向文本的首行添加特殊样式。 
    • :before:在元素之前添加内容。 
    • :after:在元素之后添加内容。 
    • ::placeholder:匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。(只支持双冒号的形式)。
    • ::selection:CSS伪元素应用于文档中被用户高亮的部分(比如使用鼠标或其他选择设备选中的部分)。(只支持双冒号的形式)。 
    • ::backdrop(处于试验阶段):用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色。(只支持双冒号的形式)。

    更改伪元素的样式

    1.更换class来实现伪元素属性值的更改:

    // CSS代码
    .red::before { content: "red"; color: red; }
    .green::before { content: "green"; color: green; }
    
    // HTML代码
    <div class="red">测试测试</div>
    
    // jQuery代码
    $(".red").removeClass('red').addClass('green');
    

    2.使用CSSStyleSheet的insertRule来为伪元素修改样式:

    // HTML代码
    <div class="red">测试测试</div>
    
    // js代码
    // 支持IE
    document.styleSheets[0].addRule('.red::before','content: "red";color: red;');
    // 支持非IE的现代浏览器
    document.styleSheets[0].insertRule('.red::before { content: "red";color: red; }', 0);
    

    MDN的addRule
    MDN的insertRule

    3.在标签中插入

    // HTML代码
    <div class="red">测试测试</div>
    
    //js代码
    var style = document.createElement("style");
    document.head.appendChild(style);
    sheet = style.sheet;
    // 兼容IE浏览器
    sheet.addRule('.red::before','content: "red";color: red;'); 
    // 支持非IE的现代浏览器
    sheet.insertRule('.red::before { content: "red";color: red; }', 0);
    
    // 亦可以使用 JQuery:
    $('<style>.red::before{content: "red";color:red;}</style>').appendTo('head');
    

    修改伪元素的content的属性值

    1. 使用CSSStyleSheet的insertRule来为伪元素修改样式

    var latestContent = "新修改的内容";
    // 兼容IE浏览器
    document.styleSheets[0].addRule('.jadeId::before','content: "' + latestContent + '"');
    // 支持非IE的现代浏览器
    document.styleSheets[0].insertRule('.jadeId::before { content: "' + latestContent + '" }', 0);
    

    2. 使用DOM元素的 data-* 属性来更改content的值

    // CSS代码
    .jadeId::before {
      content: attr(data-attr);
      color: red;
    }
    
    // HTML代码
    <div class="jadeId" data-attr="jadeId">测试测试</div>
    
    // JacaScript代码
    $('.jadeId').attr('data-attr', '新修改的内容');
    

    注意

    • 伪元素的 content 属性很强大,可以写入各种字符串和部分多媒体文件。但是伪元素的内容只存在于CSS渲染树中,并不存在于真实的DOM中。所以为了SEO优化,最好不要在伪元素中包含与文档相关的内容。

    • 修改伪元素的样式,建议使用通过更换class来修改样式的方法。因为其他两种通过插入行内CSSStyleSheet的方式是在JavaScript中插入字符代码,不利于样式与控制分离;而且字符串拼接易出错。

    • 修改伪元素的content属性的值,建议使用利用DOM的 data-* 属性来更改。

  • 相关阅读:
    WINCE串口打印信息的屏蔽与打开
    WINCE系统时间设置
    WINCE调试常见错误
    今天开始研究arcgisserver
    今天开始,放弃项目管理,做技术了
    java数据库连接
    [转]建一个XMLHttpRequest对象池
    Linux下jsp开发环境,apache,tomcat服务器配置过程
    div+css布局漫谈
    新图纸总结
  • 原文地址:https://www.cnblogs.com/ZerlinM/p/13559229.html
Copyright © 2011-2022 走看看