【问题标题】:How to get pseudo element?如何获得伪元素?
【发布时间】:2016-12-16 18:31:27
【问题描述】:

我需要获取:after 并将其分配给变量。有可能吗?

querySelectorAll 不起作用。

alert(some_div_with_pseudo.querySelectorAll('::after')[0]) // undefined

【问题讨论】:

  • 不能,正如“伪”这个名字所暗示的那样。这些不是实际 DOM 的一部分,对于 javascript,它们是应用于实际元素的样式规则。
  • JavaScript 绝对 可以读/写 CSS 伪 content;请参阅下面的 write-mode 示例我的答案。
  • 这个问题不是另一个问题的重复。你会注意到另一个问题涉及到 jQuery,并且选择的答案没有回答这个问题。

标签: javascript html pseudo-element


【解决方案1】:

在 JavaScript 中有一种方法可以在没有任何库的情况下访问伪元素的值。要获取值,您需要使用“getComputedStyle”函数。第二个参数是可选的。

let elem = window.getComputedStyle(parent, ':before');
alert(elem.getPropertyValue('background'))

这会提醒伪元素的值。

【讨论】:

  • 但是有没有办法列出所有的伪元素?
【解决方案2】:

简短的回答是你不能。它还没有。

JavaScript 可以访问 DOM,它是在页面从 HTML 加载时构建的,并在 JavaScript 操作时进一步修改。

伪元素是由 CSS 而不是 HTML 或 JavaScript 生成的。它纯粹是为了给 CSS 一些东西来坚持,但这一切都是在 JavaScript 没有任何想法的情况下发生的。

这是应该的。在整体方案中,页面以 HTML 开始。 JavaScript 一方面可以用来修改其行为和操作内容,而 CSS 可以用来控制结果的呈现:

HTML [→ JavaScript] → CSS → Result

您会看到带有伪元素的 CSS 出现在最后,因此 JavaScript 无法查看。

另见:

编辑

似乎在现代 JavaScript 中有一种使用 window.getComputedStyle(element,pseudoElement) 的解决方法:

var element = document.querySelector(' … ');
var styles = window.getComputedStyle(element,':after')
var content = styles['content'];

【讨论】:

  • getComputedStyle 的问题在于,如果你输入了错误的文字,你将得到与根本没有输入第二个变量一样的结果,例如getComputedStyle(element,':afterrrr')==getComputedStyle(element) 所以函数的行为很奇怪。
【解决方案3】:

我使用一个箭头指向内容和侧边栏将通过 CSS 伪元素切换到/切换的方向。下面的代码实际上是一个 write 模式,但是也完全可以读取 CSS 伪元素 content

由于涉及到一些问题,我还将发布先决条件(来源:JAB Creations 网络平台 JavaScript 文档,如果有任何遗漏,请在此处查找),以便那些希望尝试的人可以相当快地完成。

CSS

#menu a[href*='sidebar']::after {content: '\2192' !important;}

JavaScript 使用

css_rule_set('#menu a[href*="sidebar"]::after','content','"\u2192"','important');

JavaScript 先决条件

var sidebar = 20;


function id_(id)
{
 return (document.getElementById(id)) ? document.getElementById(id) : false;
}


function css_rule_set(selector,property,value,important)
{
 try
 {
  for (var i = 0; i<document.styleSheets.length; i++)
  {
   var ss = document.styleSheets[i];
   var r = ss.cssRules ? ss.cssRules : ss.rules;

   for (var j = 0; j<r.length; j++)
   {
    if (r[j].selectorText && r[j].selectorText==selector)
    {
     if (typeof important=='undefined') {r[j].style.setProperty(property,value);}
     else {r[j].style.setProperty(property,value,'important');}
     break;
    }
   }
  }
 }
 catch(e) {if (e.name !== 'SecurityError') {console.log('Developer: '+e);}}
}


function sidebar_toggle()
{
 if (id_('menu_mobile')) {id_('menu_mobile').checked = false;}

 if (getComputedStyle(id_('side')).getPropertyValue('display') == 'none')
 {
  css_rule_set('#menu a[href*="sidebar"]::after','content','"\u2192"','important');

  if (is_mobile())
  {
   css_rule_set('main','display','none','important');
   css_rule_set('#side','width','100%','important');
   css_rule_set('#side','display','block','important');
  }
  else
  {
   css_rule_set('main','width',(100 - sidebar)+'%');
   css_rule_set('#side','display','block');
  }
 }
 else
 {
  css_rule_set('#menu a[href*="sidebar"]::after','content','"\u2190"','important');

  if (is_mobile())
  {
   css_rule_set('main','display','block','important');
   css_rule_set('main','width','100%','important');
   css_rule_set('#side','display','none','important');
  }
  else
  {
   css_rule_set('main','width','100%','important');
   css_rule_set('#side','display','none');
  }
 }

【讨论】:

    【解决方案4】:

    你应该这样做:

    window.getComputedStyle(
        document.querySelector('somedivId'), ':after'
    );
    

    示例:https://jsfiddle.net/cfwmqbvn/

    【讨论】:

    • 它返回样式。我需要元素
    • ":after" 是伪元素,不是元素。你不能返回一个 dom 节点,它不是一个 - 你能做的就是获得样式:)
    • @MrBizle 它是一个影子 dom 元素。
    • @MrBizle 如何检查伪元素是否存在?
    猜你喜欢
    • 2015-01-03
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2017-09-01
    • 2012-02-18
    • 2014-06-08
    相关资源
    最近更新 更多