CSS Stylesheets — Shadow DOM Encapsulation

DEX475 - Style a Component

📄 第 59 页 🎬 视频课程

课程章节介绍

同学们,今天我们来讲一下 Lightning Web Components 里一个非常重要的概念——,影子 DOM 对 CSS 的封装,。这能让你写的组件样式不会被外部轻易干扰,同时也不会意外地去影响其他组件。 首先,我们要明白,在 LWC 里,每个组件都有一个属于自己的“影子 DOM”,它就像给组件套上了一个保护罩。你在,组件自己的样式表,里定义的 CSS,,只对这个组件内部生效,。组件的父组件,可以把子组件当作一个整体来看,但它没办法直接伸手进去修改子组件的内部样式。比如说,你没办法在父组件里写一条 CSS 规则去改变子组件内部某个 `
` 的背景色。 那如果你想让组件自己的根元素有一个样式,该怎么做呢?可以用 ,`:host` 选择器,。`:host` 指的就是组件自己那个最外层标签。你可以直接写 `:host { display: block; }`,这就给组件的根元素加上了块级显示。甚至还能结合类名来用,比如 `:host(.active)`,意思是只有当这个组件自身带有 `active` 这个 class 时,样式才会生效。 在影子 DOM 内部,标准的 ,CSS 级联和特异性规则,依然有效,也就是说,你仍然可以用更具体的选择器去覆盖前面的样式。但是要注意,LWC 里,不支持 ID 选择器,。如果你在组件里写 `#my-id`,它在运行时会被转换成一个唯一的随机值,所以用 ID 选择器的样式其实是不会生效的。 接下来要讲一个比较反直觉的点——,样式属性的继承,。有一部分 CSS 属性,比如,颜色、字体,,它们是可继承的。这些属性会强势地穿透影子 DOM 边界,从父组件传到子组件。但像,边框,这种不可继承的属性,就不会穿透。所以你会发现,父组件设个 `color: red`,子组件里的文字也变红了,但父组件设的 `border` 就不会跑进子组件。 还有一种东西,叫 ,CSS 自定义属性,,也就是我们常说的 CSS 变量。自定义属性有一个特点:,它总是能穿透影子 DOM,。无论你在父组件里定义了什么 CSS 变量,子组件都能读取到,这是有意设计用于跨组件样式定制的安全方式。 最后,有两个选择器是,不支持,的:一个是 `::host-context()`,另一个是 `::part`。这两个在 LWC 里暂时还用不了,所以写样式时别去依赖它们。 还有一个重要的提醒:影子 DOM 带来的 CSS 隔离会增加一些页面渲染的开销,因为浏览器要管理这些独立的样式作用域。所以我们在设计组件样式的时候要小心,避免过度使用复杂的样式,以减少性能影响。 好了,这就是关于 LWC 中影子 DOM 封装的要点。记住:组件样式是私有的,`:host` 控制根元素,继承穿透有规律,自定义属性随便穿,ID 选择器别用,性能方面多留心。下一个话题我们继续深入。

关键词

LWC Lightning Web Components Salesforce