Селектор пользовательских элементов

Есть ли способ выбрать все пользовательские элементы с помощью CSS? Я хочу, чтобы все пользовательские элементы блокировали элементы по умолчанию (большинство браузеров делают их встроенными по умолчанию), а затем переопределяют это по мере необходимости.

Мое правило может выглядеть примерно так:

*::custom {
    display: block;
}

Все пользовательские элементы имеют тире в стандарте, поэтому я мог бы создать правило, использующее это, но оно будет медленнее во многих/большинстве современных браузеров, так как потребуется использовать регулярные выражения. Если бы был встроенный селектор, это, вероятно, было бы быстрее.


person trysis    schedule 17.07.2015    source источник
comment
Итак, сколько пользовательских элементов у вас есть в вашем проекте? 5, 10, 20? Проще просто написать правила вручную и забыть об этом: x-one, x-two, ..., x-xxx {display: block;}.   -  person dfsq    schedule 17.07.2015
comment
Насколько я знаю, такого псевдоселектора нет, и CSS не поддерживает имена в селекторах с частично подстановочными знаками (хотя это очевидное улучшение).   -  person RBarryYoung    schedule 17.07.2015
comment
Большинство браузеров делают их встроенными по умолчанию: это потому, что начальное значение display равно inline.   -  person Oriol    schedule 17.07.2015
comment
Нельзя ли добавить атрибуты class или data-?   -  person Jacob    schedule 17.07.2015
comment
@divinecomedian, как говорится в документации Angular (это относится к директивам, но также может применяться к элементам/атрибутам, поскольку это и есть директивы): используйте элемент, когда вы создаете компонент, который контролирует шаблон. Обычно это происходит, когда вы создаете предметно-ориентированный язык для частей вашего шаблона. Используйте атрибут, когда вы украшаете существующий элемент новой функциональностью.   -  person trysis    schedule 17.07.2015
comment
@divinecomedian, В другом месте говорится (опять же для директив, но может применяться и в другом месте): предпочитайте использовать директивы через имя тега и атрибуты, а не комментарии и имена классов. Обычно это упрощает определение того, каким директивам соответствует данный элемент.   -  person trysis    schedule 17.07.2015
comment
Так да или нет? lol Извините, я никогда не использовал Angular.   -  person Jacob    schedule 17.07.2015
comment
Я мог бы, но я не хочу <div class="some-behavior"> везде, я хочу <some-behavior> или <some-element data-some-behavior>. Как я уже сказал, это не специфичное для Angular поведение, Angular просто абстрагирует некоторые распространенные трудности.   -  person trysis    schedule 17.07.2015
comment
возможный дубликат Использование пользовательских тегов HTML   -  person sergdenisov    schedule 17.07.2015
comment
@SergeyDenisov, это не дубликат этого вопроса и не совсем связанный с ним, хотя я понимаю, почему вы так думаете. Этот вопрос спрашивает, можно ли использовать теги HTML (это гораздо больше, чем когда вопрос был задан), в то время как этот вопрос спрашивает о селекторе CSS для всех пользовательских элементов.   -  person trysis    schedule 18.07.2015
comment
Такой селектор должен быть псевдоклассом, а не псевдоэлементом, поскольку вы ориентируетесь на элементы. В любом случае, я не думаю, что такой селектор существует, и было бы сложно указать его, потому что что именно представляет собой пользовательский элемент? Элемент, тэг которого соответствует префиксу, определенному пользователем или внедренному? Любой нестандартный элемент (что считать стандартным?)? В случае XML элемент в пространстве имен XML отличается от используемого по умолчанию?   -  person BoltClock    schedule 18.07.2015
comment
Как я уже сказал, во всех нестандартных элементах есть прочерки, согласно стандарту. Конечно, не все будут следовать этому, но я предполагаю (надеюсь), что основные будут, и я бы сделал это, если бы использовал такой селектор.   -  person trysis    schedule 18.07.2015
comment
@BoltClock, поэтому для всех, кто следует этому стандарту, должен быть способ указать все пользовательские элементы. Я спрашиваю, есть ли для этого встроенный селектор.   -  person trysis    schedule 20.07.2015


Ответы (5)


Нет, для этого нет псевдоселектора.

Однако одним, безусловно, не оптимальным решением было бы использование такого типа CSS:

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

Это сработает! С другой стороны, если когда-либо добавляются новые элементы, вам нужно добавить этот элемент в свой не-селектор. Ура.

^.^

person Florrie    schedule 17.07.2015

Вот обходной путь, основанный на ответе Флорри: :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.

person Abradoks    schedule 07.10.2019

Добавьте инертный настраиваемый атрибут к своим пользовательским элементам:

<some-element cutom-elem /> <other-element custom-elem />
<script> 
  var customs = document.querySelectorAll( "*[custom-elem]" )
</script>
<style>
    *[custom-elem] { display: block ; }
</style>
person Supersharp    schedule 10.08.2015
comment
Это может сработать (хотя я бы поставил data- в начале пользовательского атрибута) и похоже на то, что я делал. Теперь я удалил много пользовательских элементов, потому что понял, что некоторые встроенные элементы в порядке. Я бы просто предпочел не добавлять больше атрибутов, чем нужно. - person trysis; 10.08.2015

Вы можете сделать это, используя слегка измененный код из этого ответа, чтобы получить все зарегистрированные имена пользовательских тегов:

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";
});
person Tentacola    schedule 21.04.2020
comment
Где определяется customElements? Это встроенное свойство window? Я тоже не видел этого в ответе, на который вы ссылаетесь. - person trysis; 22.04.2020
comment
Да, я немного изменил код другого ответа, но логика за ним та же developer.mozilla.org/en-US/docs/Web/API/Window/customElements - person Tentacola; 24.04.2020

Вы можете просто использовать css, как показано ниже:

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

Я тестировал это в Firefox и Chrome. Хотя не уверен в реальной совместимости. Пожалуйста, протестируйте в своей среде.

person Gaurav Dixit    schedule 12.02.2019