【问题标题】:Combining ::slotted with pseudo-elements结合 ::slotted 与伪元素
【发布时间】:2021-09-10 23:21:12
【问题描述】:

我试图弄清楚将伪元素与::slotted 选择器结合起来有什么用,看起来它适用于某些但不适用于其他选择器,我找不到任何列出它适用的选择器的文档

这是一个问题的演示,注意一些伪选择器是如何生效的,而另一些则没有

class TestElement extends HTMLElement {
    constructor() {
        super();
        this.attachShadow({mode: 'open'});
        let template = document.querySelector("template");
        this.shadowRoot.append(template.content.cloneNode(true));
    }
}

customElements.define("test-element", TestElement);
<template>
    <style>
        
        ::slotted(*)::first-line { /* doesn't works */
            color: red;
        }
        ::slotted(*):first-letter { /* doesn't works */
            color: red;
        }
        ::slotted(*) {
            max-height: 3em;
            overflow: auto;
        }
        ::slotted(*)::-webkit-scrollbar { /* doesn't works */
            width: 3px;
        }
        ::slotted(*)::-webkit-scrollbar-track { /* doesn't works */
            background-color: red;
        }
        ::slotted(*)::selection { /* doesn't works */
            color: red;
        }
        ::slotted(*)::placeholder { /* works */
            color: red;
        }
        ::slotted(*)::marker { /* works */
            color: red;
        }
    </style>
    <slot></slot>
</template>

<test-element>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Sapiente
    doloribus ullam fugit ipsum laborum velit architecto, provident dolore
    at, aperiam quaerat officiis aliquid magni sed expedita totam dolor
    doloremque odit.
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Sapiente
    doloribus ullam fugit ipsum laborum velit architecto, provident dolore
    at, aperiam quaerat officiis aliquid magni sed expedita totam dolor
    doloremque odit.
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Sapiente
    doloribus ullam fugit ipsum laborum velit architecto, provident dolore
    at, aperiam quaerat officiis aliquid magni sed expedita totam dolor
    doloremque odit.</p>
</test-element>

<test-element>
    <input placeholder="Placeholder">
</test-element>

<test-element>
    <li>Li</li>
</test-element>

【问题讨论】:

  • developer.mozilla.org/en-US/docs/Web/CSS/::slotted "还要注意,此选择器不会选择放置在插槽中的文本节点;它只针对实际元素。"
  • @disinfor 我的问题中的示例都不是文本节点,它们都是实际元素
  • 例如,first-letter 不是元素 - 它是对文本的伪引用。
  • @disinfor 嗯..,我不认为这就是他们所说的“文本节点”的意思,我认为他们只是说那里必须有和元素(例如 @987654326 @),并不是说选择器不能选择元素内的文本,但我可能错了。但无论如何,即使你是对的,它也只能解释 first-letter 和 first-line 而不是像 selection 和 webkit-scrollbar 这样的其他人。
  • 同意。这是个有趣的问题!对于::selection 和webkit-scrollbar,我想知道是不是因为它们不一定是实际影子dom 的一部分——而::selection 仍然指的是实际文本,而不是基本/简单的选择器。

标签: html css css-selectors shadow-dom custom-element


【解决方案1】:

在 ::placeholder 和 ::marker 上找到很好的结果

但是::marker 在 Mozilla 的浏览器中不起作用(没有测试过 safari)

一般::slotted()只需要一个简单的选择器;
见:::slotted CSS selector for nested children in shadowDOM slot

旁注:您的constructor 可以写成:

constructor() {
  let template = document.querySelector("template"); // valid code *before* super()
  super() // sets and returns this scope
    .attachShadow({mode: 'open'}) // sets and returns this.shadowRoot
    .append(template.content.cloneNode(true));
}

【讨论】:

  • 我现在有点好奇......你对“Firefox”这个大写的名字有反感吗? :-)
  • 什么是简单的选择器?我在您链接的答案中找不到任何内容,这可以解释为什么 ::placeholder 比 ::selection 更简单。看起来他们所说的简单选择器是直接选择器,而不是父选择器到子选择器,即没有空格的选择器
  • @Mendy 也许您将它们理解为“基本”选择器(参见developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors),而不是“简单”。正式地,这里定义了简单的选择器:w3.org/TR/2018/CR-selectors-3-20180130/#simple-selectors
  • 不知道,本来以为没有伪选择器可以工作。也许::placeholder 与其他的有些不同,因为它在表单元素上运行。询问工程师:github.com/WICG/webcomponents/issues
猜你喜欢
  • 2021-08-28
  • 2017-01-22
  • 2020-09-05
  • 1970-01-01
  • 2015-02-21
  • 2018-01-24
  • 1970-01-01
  • 2011-01-22
  • 2022-12-13
相关资源
最近更新 更多