美文网首页
使用 js 设置伪元素样式

使用 js 设置伪元素样式

作者: holidayPenguin | 来源:发表于2021-03-10 14:10 被阅读0次

在开发一个ui编辑功能,因为使用的是Vue,最开始的时候是的方法是直接将styles放在dom元素上面,当遇到伪元素就无计可施了(切没发现JS直接获取DOM伪元素的方法)。

于是就想能不能使用什么方法设置一段css样式

网络上的办法

我们可以这样:

document.styleSheets[0].insertRule('.test::before{color:green}',0)//chrome,firefox,ie9+,Edge,移动端
// 不推荐使用,实际使用过程中未生效
document.styleSheets[0].addRule('.test::before{color:green}',0)// IE 浏览器

我们还可以这样:

var style=document.createElement('style');
style.innerHTML=".test::before{color:green}";
document.head.appendChild(style);

我是在移动端使用的,实际上这两种方法都是可以的,但是我选择使用第二种,因为兼容性更好

解决兼容问题

对于兼容问题MDN上面已经给出了一个答案 https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleSheet/insertRule

(function(Sheet_proto){
  var originalInsertRule = Sheet_proto.insertRule;

  if (originalInsertRule.length === 2){ // 2 个托管参数: (selector, rules)
    Sheet_proto.insertRule = function(selectorAndRule){
      // 首先,从规则中分离选择器
      a: for (var i=0, Len=selectorAndRule.length, isEscaped=0, newCharCode=0; i !== Len; ++i) {
        newCharCode = selectorAndRule.charCodeAt(i);
        if (!isEscaped && (newCharCode === 123)) { // 123 = "{".charCodeAt(0)
          // 其次,找到花括号
          var openBracketPos = i, closeBracketPos = -1;

          for (; i !== Len; ++i) {
            newCharCode = selectorAndRule.charCodeAt(i);
            if (!isEscaped && (newCharCode === 125)) { // 125 = "}".charCodeAt(0)
              closeBracketPos = i;
            }
            isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
          }

          if (closeBracketPos === -1) break a; // No closing bracket was found!
            /*else*/ return originalInsertRule.call(
            this, // 想要改变的样式表
            selectorAndRule.substring(0, openBracketPos), // 选择器
            selectorAndRule.substring(closeBracketPos), // 规则
            arguments[3] // 插入的索引
          );
        }

        // Works by if the char code is a backslash, then isEscaped
        // gets flipped (XOR-ed by 1), and if it is not a backslash
        // then isEscaped gets XORed by itself, zeroing it
        isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
      }
      // Else, there is no unescaped bracket
      return originalInsertRule.call(this, selectorAndRule, "", arguments[2]);
    };
  }
})(CSSStyleSheet.prototype);

这段代码应该放在何处才能生效,可以自己思考一下,至于是否选择这个兼容方案大家自己选择。

插入顺序问题

这两个方法因为都是插入了一段CSS代码,CSS在解析的时候会根据引入的先后顺序和权重值来解析,导致我们插入的代码被覆盖,虽然第二种方法是插入到了head最后,一定程度上避免了这种问题,但是不能完全解决这种隐患

解决办法就是当发现或者凭经验判断样式未生效,需要在当前功能执行之后在head最后重新添加对应的CSS代码

删除无效CSS代码

  • 对于第一种方法
    CSSStyleSheet.deleteRule() 移除指定的CSS代码
  • 对于第二种方法
    可以在创建style的时候设置一个id,可以使用 document.styleSheet来匹配id,可以是移除dom或者使用 CSSStyleSheet.deleteRule()移除指定的CSS代码

参考地址

DocumentOrShadowRoot.styleSheets
Document.styleSheetSets
CSSStyleSheet
CSSStyleSheet.insertRule()
Document.createElement()

使用 js 设置伪元素样式
JavaScript HTML DOM - 改变 CSS
JS addRule()和insertRule()方法:添加CSS样式
如何使用JS操纵伪元素
Js动态加载CSS样式文件的2种方法

相关文章

  • 如何用js改变伪元素样式

    通常设置伪元素的样式直接用CSS很方便 可是有时候想用js动态的去改变伪元素的样式,但是js获取不到伪元素,这就很...

  • 使用 js 设置伪元素样式

    在开发一个ui编辑功能,因为使用的是Vue,最开始的时候是的方法是直接将styles放在dom元素上面,当遇到伪元...

  • js设置html元素的样式

    设置某个元素的样式 去除使用js设置的样式

  • CSS基础之伪类伪元素&样式优先权

    伪类&伪元素 首字样式控制 —— 使用伪元素::first-letter 首行样式控制 —— 使用伪元素::fir...

  • CSS 伪类和伪元素

    伪类:单冒号,基于元素的当前状态进行设置; 伪元素:双冒号,设置指定元素样式; 伪类 基于元素的当前状态进行设置。...

  • 清除浮动的几种方法

    父元素使用伪元素after(推荐) 给浮动元素后的同级块级元素设置样式 clear: both 缺点:需要添加无用...

  • css杂记

    1.:伪类选择器 和 ::伪元素选择器 问题描述:在css设置placeholder的样式时,使用::-webk...

  • 伪元素学习

    :first-line伪元素 "first-line" 伪元素用于向文本的首行设置特殊样式 :first-lett...

  • Css3Two

    文本溢出样式设置 文本超出容器以后: 换行显示 超出容器部分也显示 伪类和伪元素 伪类和伪元素 都是css中的伪类...

  • CSS-伪类

    伪类专门用来表示元素的一种特殊状态 需要为这些特殊状态设置样式,就得使用伪类 超链接 aa:linka:visit...

网友评论

      本文标题:使用 js 设置伪元素样式

      本文链接:https://www.haomeiwen.com/subject/aaswqltx.html