Ответ Supersharp верен, однако это не код StencilJS, а также поддержка контекста хоста - flakey (не работает в Firefox и, вероятно, IE11).
Вы можете «перенести» атрибут в элемент hostи затем используйте селектор изнутри стиля компонента хоста:
TSX:
private intent: String;
componentWillLoad() {
this.intent = document.querySelector('html').getAttribute('data-whatintent');
}
hostData() {
return {
'data-whatintent': this.intent
};
}
SCSS:
:host([data-whatintent="keyboard"]) *:focus {
outline: solid 2px #1A79C6;
}
Если атрибут data-whatintent
изменяется динамически,сделайте это свойством компонента, и функция слушателя обновит ваш компонент.При желании вы можете использовать это свойство для добавления / удаления классов на хост для стилизации, хотя вы также можете продолжать использовать селектор атрибутов.
TSX:
@Prop({ mutable: true, reflectToAtrr: true }) dataWhatintent: String;
componentWillLoad() {
this.dataWhatintent = document.querySelector('html').getAttribute('data-whatintent');
}
hostData() {
return {
class: {
'data-intent-keyboard': this.dataWhatintent === 'keyboard'
}
};
}
SCSS:
:host(.data-intent-keyboard) *:focus {
outline: solid 2px #1A79C6;
}
Обработчик событий клавиатуры и мыши в документе:
function intentHandler(event: Event) {
const intent = event instanceof KeyboardEvent ? 'keyboard' : 'mouse';
document.querySelectorAll('my-custom-component').forEach(
el => el.setAttribute('data-whatintent', intent)
);
}