CSS作用域样式实战:组件化开发的样式隔离方案
一、技术优势
作用域样式使样式冲突减少90%,组件复用率提升300%
/* 传统CSS */
.button { } /* 全局污染风险 */
/* 作用域CSS */
:host .button { } /* 仅限组件内部 */
二、核心方案
1. CSS Modules方案
/* styles.module.css */
.error {
color: red;
}
// 组件中使用
import styles from './styles.module.css';
function Alert() {
return <div className={styles.error}>错误提示</div>;
}
2. Shadow DOM方案
class MyElement extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({mode: 'open'});
shadow.innerHTML = `
<style>
:host { display: block; }
.button { color: white; }
</style>
<button class="button">点击</button>
`;
}
}
三、高级技巧
1. 作用域CSS变量
:host {
--primary-color: #3b82f6;
--padding: 1rem;
}
.button {
background: var(--primary-color);
padding: var(--padding);
}
2. 穿透样式封装
/* 穿透Shadow DOM边界 */
::part(button) {
font-weight: bold;
}
/* 组件中标记可穿透部分 */
<button part="button">提交</button>
四、完整案例
设计系统按钮组件
/* button.module.css */
.primary {
--bg-color: #3b82f6;
background: var(--bg-color);
}
/* Button.jsx */
import styles from './button.module.css';
function Button({ variant = 'primary' }) {
return (
<button className={`${styles.button} ${styles[variant]}`}>
<slot></slot>
</button>
);
}
/* 使用示例 */
<Button variant="primary">主要按钮</Button>
function checkSupport() {
if (!document.createElement(‘div’).attachShadow) {
alert(‘您的浏览器不完全支持Shadow DOM,建议使用Chrome或Firefox’);
}
}
window.onload = checkSupport;