Таблица стилей сброса Shadow DOM

Я бы хотел, чтобы приложение, которое я делаю, использовало reset.css на глобальном уровне. Я также хотел бы, чтобы он проникал во все теневые корни, но имел низкую специфичность. Как я могу это сделать?

Допустим, мой reset.css содержит что-то вроде:

li, ::shadow li {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}

Тогда мой пользовательский элемент имеет такой шаблон, как:

<template>
    <style>
        li {
            padding: 10px;
        }
    <style>
    <ol>
        <li>Foo</li>
        <li>Bar</li>
        <li>Baz</li>
    </ol>
</template>

Моя проблема в том, что селектор шаблона li не обладает достаточной специфичностью, чтобы превзойти ::shadow li. Я не хочу повторяться в каждом пользовательском элементе. Думаю, я мог бы добавить <link> к каждому <template>, но тогда я снова буду повторяться. Я также мог бы использовать JavaScript для внедрения <link>, но я не уверен, что это лучший способ.

Какими еще способами я мог бы использовать reset.css, который проникает в теневые корни, но имеет очень мало специфичности?


person Olson.dev    schedule 15.08.2015    source источник
comment
Есть ли причина, по которой вы избегаете использования классов CSS в своем шаблоне? Почему вы не могли обеспечить локальное переопределение глобальных свойств CSS через класс?   -  person Mike Brant    schedule 15.08.2015
comment
Вот почему было создано свойство all... все, что нам сейчас нужно, это чтобы каждый, кто реализует теневые стили, также реализовал его.   -  person BoltClock    schedule 15.08.2015
comment
@MikeBrant, я мог бы использовать классы, но даже тогда мне пришлось бы быть более подробным, чем хотелось бы. .padded {} недостаточно конкретен, как и li.padded ... Мне пришлось бы использовать ol li.padded, чтобы переопределить ::shadow li.   -  person Olson.dev    schedule 15.08.2015
comment
@BoltClock, я посмотрел на all, прежде чем спрашивать, но я не знаю, как применить его к этому сценарию. Хотите уточнить?   -  person Olson.dev    schedule 15.08.2015
comment
Я думаю что-то вроде сброса унаследованных стилей для корневого элемента, а затем all: unset для всего остального. Все, что не унаследовано, принимает свое начальное значение, а все, что унаследовано, наследуется полностью от корня. Хотя при ближайшем рассмотрении я думаю, что каскад все равно будет проблемой...   -  person BoltClock    schedule 15.08.2015
comment
Возможно, вместо ::shadow li вы могли бы попробовать * /deep/ li - универсальный селектор имеет нулевую специфичность, а комбинаторы также не добавляют специфичности. (/deep/ теперь >>> в спецификации, но имплы не обновлялись, насколько мне известно.)   -  person BoltClock    schedule 15.08.2015
comment
@BoltClock Попробовал * /deep/ li, и он все еще как-то более специфичен.   -  person Olson.dev    schedule 15.08.2015
comment
Итак, этот вопрос больше не имеет значения, потому что /deep/, >>> и ::shadow теперь устарели.   -  person Olson.dev    schedule 10.09.2015


Ответы (1)


Я понимаю, что после устаревания селекторов ::shadow и /deep/ этот вопрос может быть уже не актуален, но если вы все еще сталкиваетесь с этой проблемой, я бы посоветовал вам использовать css @imports для вставки вашего общего reset.css в тень - корневой шаблон.

Поскольку это должен быть первый тег внутри шаблона, ваша встроенная таблица стилей будет иметь приоритет над reset.css, где это применимо.

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

person Abhinav    schedule 06.10.2015
comment
Это то, что я в конечном итоге сделал, более или менее. Я автоматизировал его с помощью собственного кода регистрации элемента: он автоматически вставляет <style> с @import общими таблицами стилей. - person Olson.dev; 06.10.2015