自定义元素选择器

时间:2015-07-17 16:56:24

标签: html css css-selectors custom-element

有没有办法用CSS选择所有自定义元素?我想默认设置所有自定义元素块元素(大多数浏览器默认使它们内联),然后根据需要覆盖它。

我的规则可能如下:

*::custom {
    display: block;
}

所有自定义元素在标准中都有破折号,因此我可以创建一个利用它的规则,但在许多/大多数当前浏览器上它会更慢,因为它需要使用正则表达式。如果有内置选择器,这可能会更快。

5 个答案:

答案 0 :(得分:2)

不,没有伪选择器可以做到这一点。

然而,一个肯定不是最佳的解决方案是使用这种类型的CSS:

:not(html, head, body, h1, h2, h3, h4, h5, h6, div, ...) {
  /* Code here */
}

它会工作!如果添加了新元素,则需要将该元素添加到非选择器中。耶。

^。^

答案 1 :(得分:1)

为您的自定义元素添加惰性自定义属性:

<some-element cutom-elem /> <other-element custom-elem />
<script> 
  var customs = document.querySelectorAll( "*[custom-elem]" )
</script>
<style>
    *[custom-elem] { display: block ; }
</style>

答案 2 :(得分:1)

以下是基于Florrie的答案的解决方法: :not(html):not(head):not(title):not(base):not(link):not(meta):not(style):not(body):not(article):not(section):not(nav):not(aside):not(h1):not(h2):not(h3):not(h4):not(h5):not(h6):not(hgroup):not(header):not(footer):not(address):not(p):not(hr):not(pre):not(blockquote):not(ol):not(ul):not(li):not(dl):not(dt):not(dd):not(figure):not(figcaption):not(div):not(main):not(a):not(em):not(strong):not(small):not(s):not(cite):not(q):not(dfn):not(abbr):not(data):not(time):not(code):not(var):not(samp):not(kbd):not(sub):not(sup):not(i):not(b):not(u):not(mark):not(ruby):not(rb):not(rt):not(rtc):not(rp):not(bdi):not(bdo):not(span):not(br):not(wbr):not(ins):not(del):not(picture):not(img):not(iframe):not(embed):not(object):not(param):not(video):not(audio):not(source):not(track):not(map):not(area):not(math):not(svg):not(table):not(caption):not(colgroup):not(col):not(tbody):not(thead):not(tfoot):not(tr):not(td):not(th):not(form):not(label):not(input):not(button):not(select):not(datalist):not(optgroup):not(option):not(textarea):not(keygen):not(output):not(progress):not(meter):not(fieldset):not(legend):not(script):not(noscript):not(template):not(canvas)

此外,您还必须考虑SVG和MathML名称空间。

  • 一种方法是仅以类似的方式添加其标签。
  • 在某些情况下(广告屏蔽),为选择器添加几个可能的父母可能就足够了,以避免子代。类似于:-webkit-any(body, div) > :not(...。参见:is(), :matches(), :any()
  • 实施后,选择器第4级应允许使用:not(math *, svg *)之类的东西。
  • 可以使用
  • @namespace,类似于@namespace xhtml "http://www.w3.org/1999/xhtml"; xhtml|*:not(...

答案 3 :(得分:1)

您可以使用this answer中经过稍微修改的代码来执行此操作,以获取所有已注册的自定义标签名称:

function getCustomElements() {
    const allElems = document.getElementsByTagName("*");
    let elementNames = [].map.call(allElems, el => el.nodeName.toLowerCase())
    elementNames = [...new Set(elementNames)];
    return elementNames.filter(name => customElements.get(name));
}

然后可以用来设置所有自定义元素的样式:

const customElementSelector = getCustomElements().join();
document.querySelectorAll(customElementSelector).forEach(el => {
    el.style.border = "solid";
});

答案 4 :(得分:0)

您可以像下面这样简单地使用css:

custom-element{
    color: white;
    min-height: 20px;
}

我已经在Firefox和Chrome中对此进行了测试。虽然不确定实际的兼容性。请在您的环境中进行测试。