Open switer opened 10 years ago
在使用组件化开发系统时,解决组件样式冲突使用了CSS规则添加命名空间的方式,而添加命名空间的方式有两种 层级前缀 和 类名前缀 ,下面分析下:
层级前缀
类名前缀
使用类名前缀 示范样例:
<div component="header" class="header"> <div class="header-title">title</div> <div class="header-home">home</div> </div>
.header-title {color:blue;} .header-home {height:25px; width:50px;}
命名前缀能很好地避开组件间的样式影响,划分了独立的组件样式独立空间,但缺点在于:
命名前缀
使用父级前缀方式如下: 示范样例:
<div component="header" class="header"> <div class="title">title</div> <div class="home">home</div> </div>
.header .title {color:blue;} .header .home {height:25px; width:50px;}
相比较,使用层级前缀的好处在于:
层级前缀方案也不是完美的,该方案的致命缺点是不能完美解决组件样式独立性的问题,问题案例如下:
<div component="index" class="index"> <div class="title">首页</div> <div component="header" class="header"> <div class="title">title</div> <div class="home">home</div> </div> </div>
父组件index有类名为title的元素,子组件header也有类名为title的元素,所以父组件对title元素的样式描述 会层叠在header组件的title元素上。
层级前缀的缺点可以用 .header > .title 这样的方式来解决,不过一旦写了 > 等选择器就比较依赖于 HTML 结构。 我还是更喜欢命名前缀,只要类名起得好可以避免它的缺点。
.header > .title
>
@NdYAG 使用子代是不得已而为之(为了解决父-子组件的样式冲突),很多时候我只会在第一级的时候使用子代选择器:
@NdYAG Sorry,我的文章没有涉及到子代选择器。
在使用组件化开发系统时,解决组件样式冲突使用了CSS规则添加命名空间的方式,而添加命名空间的方式有两种
层级前缀
和类名前缀
,下面分析下:命名前缀
使用类名前缀 示范样例:
命名前缀
能很好地避开组件间的样式影响,划分了独立的组件样式独立空间,但缺点在于:层级前缀
使用父级前缀方式如下: 示范样例:
相比较,使用
层级前缀
的好处在于:层级前缀
方案也不是完美的,该方案的致命缺点是不能完美解决组件样式独立性的问题,问题案例如下:父组件index有类名为title的元素,子组件header也有类名为title的元素,所以父组件对title元素的样式描述 会层叠在header组件的title元素上。