Этот вопрос, скорее всего, не имеет однозначного прямого ответа, но, надеюсь, приведет к некоторым лучшим практикам или общим шаблонам для использования при адаптации существующей среды стилей к разработке новых веб-компонентов.
В моем случае у меня есть компонент <custom-avatar>
, и он все настроен должным образом с автономными стилями и функциональностью, все просто превосходно.
В определенных случаях использования приложение Для отображения необходимо сложить аватары, расположив их немного друг над другом по диагонали, и шаблон, который я использую, использует простой компонент <custom-composite-avatar>
. Все, что это делает, это оборачивает выделенное содержимое в <div>
с правильным классом стилей, но ключевым аспектом является сохранение способности к гибкому повторному использованию, например так:
<custom-composite-avatar>
<custom-avatar title="first"></custom-avatar>
<custom-avatar title="second"></custom-avatar>
</custom-composite-avatar>
Хитрый бит заключается в стили, импортируемые из monorepo, который предоставляет те же модули BEM-i sh CSS и component CSS для других разновидностей библиотеки компонентов, таких как React, Vue, et c. У меня есть стили avatar
и composite-avatar
, импортированные просто отлично, но принудительное отображение предполагаемого перекрытия определяется с помощью иерархического селектора .my-composite-avatar.my-composite-avatar--medium .my-avatar {}
То есть с классом .my-composite-avatar
, примененным к оболочке div в <custom-composite-avatar>
и класс .my-avatar
, примененный к оболочке в <custom-avatar>
и его собственном Shadow DOM, этот селектор parent / child CSS не годится.
Я сомневаюсь, что для этого есть серебряная пуля, но похоже, что это будет довольно распространенный сценарий, поскольку все больше людей переходят на веб-компоненты при использовании существующих систем стилей. Какой подход имеет больше смысла для обеспечения того, чтобы составной компонент оставался компонуемым, а адаптация существующих селекторов была безболезненной (или, по крайней мере, легкой для общения с другими разработчиками)? это можно решить с помощью ::host
или ::slotted
, или эти случаи потребуют значительных переделок?
Спасибо за чтение, ваши идеи ценятся!