В настоящее время я работаю над пользовательским элементом, который представляет собой слегка расширенную версию элемента ввода, в которой все его строительные блоки (включая элемент ввода) размещены в теневом DOM.
Когда внутренний элемент ввода имеет фокус, элемент хоста должен быть стилизован с помощью цветного контура и рамки-тени, как показано ниже:
Поэтому фокус и размытие Обработчики событий ввода переключают атрибут «сосредоточенный» на элементе хоста с инкапсулированными стилями, выглядящими так:
:host([focussed]) {
transition: outline 0.3s ease-in-out;
outline-color: var(--focus-color, var(--default-focus-color)) !important;
box-shadow: 0px 0px 3px var(--focus-color, var(--default-focus-color)) !important;
}
Что мне не нравится в этом подходе:
Предоставление настраиваемого атрибута на хосте, который необходимо наблюдать, для обеспечения правильности визуально представленного состояния (например, звонки потребителя setAttribute('focussed', '')
)
Альтернативы, которые я рассмотрел:
Конечно, моей первой мыслью было инкапсулировать атрибут в теневой DOM (или даже переключить класс) в элемент контейнера, заполняя пространство элемента host, но проблема в том, что переполненное содержимое, такое как контур и тень блока, кажется, принудительно скрыто элементом host - что кажется логичным.
Я мог бы диктовать фиксированный отступ на хосте элемент, обеспечивающий видимость контура и тени, но для этого потребуется рассмотреть другое поведение рендеринга в браузере box-shadow, и потребитель будет чувствовать себя не интуитивно понятным для пользовательских стилей.
Я ищу подход наилучшей практики здесь, и я был бы очень признателен за ваши образованные мысли об этом.