首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Shadow-DOM中有访问CSS中的HTML标记属性的方法吗?

在Shadow-DOM中有访问CSS中的HTML标记属性的方法吗?
EN

Stack Overflow用户
提问于 2019-03-28 18:17:29
回答 2查看 1.2K关注 0票数 0

我正在用StencilJS创建一个自定义组件,当用户使用键盘或鼠标导航到组件时,我必须对大纲做一些更改。

我的组件正在使用ShadowDOM,我希望从CSS访问一个HTML属性。

标记的属性是用什么-输入(https://github.com/ten1seven/what-input)生成的,以检测keybord和鼠标事件。

我尝试过使用CSS选择器,比如[data-whatintent=keyboard]html[data-whatintent=keyboard],但是它没有起作用。

这是我要访问data-whatintent属性的HTML标记:

代码语言:javascript
复制
<html dir="ltr" lang="en" data-whatinput="keyboard" data-whatintent="mouse">

  <my-custom-component></my-custom-component>

</html>

这是我的CSS:

代码语言:javascript
复制
[data-whatintent=keyboard] *:focus {
  outline: solid 2px #1A79C6;
}

我希望ShadowDOM中的CSS可以使用data-whatintent属性的值来设置组件上的样式,因此大纲就像我想要的那样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-28 19:08:52

Supersharp的答案是正确的,但是它不是StencilJS代码,而且主机上下文支持也不稳定(在火狐和IE11中不起作用)。

您可以将属性“传输”给主机元素,然后在主机组件样式中使用选择器:

TSX:

代码语言:javascript
复制
private intent: String;

componentWillLoad() {
    this.intent = document.querySelector('html').getAttribute('data-whatintent');
}

hostData() {
    return {
        'data-whatintent': this.intent
    };
}

SCSS:

代码语言:javascript
复制
:host([data-whatintent="keyboard"]) *:focus {
    outline: solid 2px #1A79C6;
}

如果data-whatintent属性动态更改,则使其成为组件的属性,并让侦听器函数更新组件。您可以选择使用该属性向主机添加/删除类以进行样式设置,但也可以继续使用属性选择器。

TSX:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
:host(.data-intent-keyboard) *:focus {
    outline: solid 2px #1A79C6;
}

文档的键盘和鼠标事件处理程序:

代码语言:javascript
复制
function intentHandler(event: Event) {
    const intent = event instanceof KeyboardEvent ? 'keyboard' : 'mouse';
    document.querySelectorAll('my-custom-component').forEach(
        el => el.setAttribute('data-whatintent', intent)
    );
}
票数 3
EN

Stack Overflow用户

发布于 2019-03-28 18:41:14

您应该使用*主机-上下文()在Shadow中应用CSS样式,具体取决于使用自定义元素的上下文。

代码语言:javascript
复制
customElements.define( 'my-custom-component', class extends HTMLElement {
    constructor() {
        super()
        this.attachShadow( { mode: 'open' } )
            .innerHTML = `
              <style>
                :host-context( [data-whatinput=keyboard] ) *:focus {
                   outline: solid 2px #1A79C6;
                }
              </style>
              <input value="Hello">`
    }
} )         
代码语言:javascript
复制
<html dir="ltr" lang="en" data-whatinput="keyboard" data-whatintent="mouse">

  <my-custom-component></my-custom-component>

</html>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55404389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档