一、@scope
是一个全新的 CSS @ 规则,它允许我们将样式的作用域限制在 DOM 树的特定部分。即,再也不会泄露出去影响到全局。
1.1、传统写法 (BEM)
//html
<div class="card">
<h2 class="card__title">文章标题</h2>
<p class="card__content">这里是一些内容...</p>
<a href="#" class="card__link">阅读更多</a>
</div>
<!-- 页面其他地方可能还有一个不相关的 title -->
<h1 class="page-title">FedJavaScript</h1>
//css
.card__title{
font-size: 10px;
color: #333;
}
.card__content{
color: #888;
line-height: 1.6em;
}
.card__link{
color: blue;
text-decoration: none;
}
1.2、使用 @scope 的新写法
<div class="card">
<h2>文章标题</h2>
<p>这里是一些内容...</p>
<a href="#">阅读更多</a>
</div>
<h1 class="page-title">FedJavaScript</h1>
//css
@scope(.crad){
h2{
font-size: 10px;
color: #333;
}
p{
color: #888;
line-height: 1.6em;
}
a{
color: blue;
text-decoration: none;
}
}
//优势:HTML 变得结构更干净了,CSS 更直观了,也不存在样式泄露问题。
1.3、@scope伪类:引用作用域根元素——在 @scope
块内部,我们可以使用 :scope
伪类来直接选中作用域的根元素本身。
:scope(.card){
/* :scope 指向 .card 元素本身 */
:scope{
border: 1px solid red;
border-radius:8px;
padding: 1rem;
box-show: 0 2px 5px rgba(0,0,0,0.1);
}
}
二、12个降低css冲突方法
1. BEM命名规范
/* 传统方式 */
.sidebar .title { }
/* BEM命名 */
.sidebar__title--highlight {
color: #007bff;
font-weight: bold;
}
2. CSS Modules
/*styles.module.css*/
.container{
max-width: 1200;
margin: 0 auto;
}
import styles from './styles.module.css'
funtion Component(){
return <div className={styles.container}></div>;
}
3. Shadow DOM:利用Web Components的Shadow DOM实现完全的样式隔离。
class MyComponent extends HTMLElement {
constructor(){
super();
const show = this.attachShadow({mode: 'closed'});
const style = document.createElement('style');
style.textContent = `
:host {
display: block;
background: #f4f4f4;
}
`;
shadow.appendChild(style);
}
}
4. CSS 命名空间:为不同模块或组件添加特定的命名空间前缀。
/* 页面级命名空间 */
.homepage-header { }
.homepage-sidebar { }
/* 组件级命名空间 */
.user-profile__avatar { }
.user-profile__name { }
5. @scope规则(新特性)
案例再上面一种
6. CSS自定义属性(变量)继承:通过自定义属性实现可控的样式继承和隔离。
.theme-light {
--primary-color: blue;
--secondary-color: green;
}
.theme-dark {
--primary-color: darkblue;
--secondary-color: darkgreen;
}
.button {
background-color: var(--primary-color);
}
7. 作用域选择器 :where() 和 :is()——利用新一代选择器降低选择器特异性。
/* 降低选择器特异性 */
//作用:选择所有具有 title 类名的元素,这些元素必须位于具有 sidebar 类名的元素内部
:where(.sidebar .title) {
font-weight: bold;
}
// 作用:选择位于 .header 或 .footer 元素内部的所有 .nav 元素
:is(.header, .footer) .nav {
display: flex;
}
等价写法
.header .nav,
.footer .nav {
display: flex;
}
8. CSS Containment:使用contain属性限制CSS布局和绘制的作用范围。
.component {
contain: layout; /* 隔离布局 */
contain: paint; /* 隔离绘制 */
contain: strict; /* 完全隔离 */
}
9. 样式穿透控制:在组件库和框架中精确控制样式穿透。
/* Vue Scoped Style */
// 含义:在Vue的scoped样式中,让样式穿透到子组件内部
// 作用:选择 .parent 元素内部的所有 .child 元素,包括子组件中的 .child 元素
// 使用场景:需要修改子组件内部特定类名的样式时使用
.parent ::v-deep .child {
color: red;
}
/* CSS Selector */
含义:明确指定某些选择器不受局部作用域限制
作用:选择 .component 元素的直接子元素中具有 external-class 类名的元素
特点:external-class 类名不会被添加Vue的scoped标识符
使用场景:需要与外部CSS类名或第三方组件库样式配合时使用
.component > :global(.external-class) {
margin: 10px;
}
10. 层叠层级 @layer:通过定义样式层级管理样式优先级。
@layer reset, base, components, utilities;
@layer components {
.button {
background: blue;
}
}
11. 动态样式生成:通过JavaScript动态生成和管理唯一样式。
function generateUniqueClassName() {
return `custom-${Math.random().toString(36).substring(2)}`;
}
const className = generateUniqueClassName();
element.classList.add(className);
12. 样式重置策略:全局和局部样式重置的平衡策略。
/* 局部重置 */
.reset-list {
margin: 0;
padding: 0;
list-style: none;
}
/* 范围重置 */
@scope (.card) {
ul {
margin: 0;
}
}