从我刚开始接触前端时写的 css,和从事前端以来接触过的实习生 or 新人写的 css 抽了一部分代码来举例子。
1. class 命名规则混乱
- 重复、近义命名
在同一个文件中,混用含义相近或重复的名称来设置 class ,将维护难度大大提升。我遇到的情况是,每一个分类下的 class 名称都同时存在于同一个文件中。
/* 容器 */
.box
.container
.wrapper
.outside
/* 列表 */
.list
.lists
.list-container
.list
.li
.item
.list-item
.list-child
/* 文字 */
.txt
.text
.texts
.label
.msg
.message
/* 按钮 */
.btn
.Btn
.button
.Button
- 拼写错误、拼音命名
考虑到拼写问题,原来上面存在的 .massage 拼写错误归类到下面了,感谢 提醒
/* 拼写错误 */
.massage
.slogen
.penel
.mian
/* 拼音命名 */
.lunbotu
.kapian
.guanyu
- 大小驼峰、下划线、连接线混用
在同一个项目中的 class 命名,大小驼峰、下划线、双下划线、连接线等不同的命名风格混搭,让 css 的可阅读性非常低。
.PageCard-container
.pageCard__Header__text-active
.carousel__slider--img
.carousel_pagination__full-width
.carousel-navigation--bottom_active
.carousel-slider-TEXT
- 过分强调语义和不合理的 HTML 标签嵌套导致的 class 命名冗余
.index-card
.index-card-header
.index-card-header-title
.index-card-header-title-text-left
.index-card-header-title-text-right-gray
.index-card-header-title-text-right-active
- 曲解滥用 BEM
没错,真的会有很多人初次接触过 BEM 之后,曲解 BEM 的含义,以为要将所有单个的单词替换成 BEM 的命名方式,我自己也做过类似的事情。
/* 修改前 */
.card-header-title
.card-header-subTitle
/* 修改后 */
.cardHeader-cardHeaderTitle
.cardHeader-cardHeaderSubTitle
.card-header__card-header-title
.card-header__card-header-sub-title
.card-header--card-header-title
.card-header--card-header-sub-title
2. css 编写的逻辑问题
- 实现效果的逻辑存在问题
以常见的元素在容器内居中为例子,常见的非正常逻辑写法如下面所示。这些写法在某些理想情况下确实可以实现让元素居中,但实际上这样的代码非常难以维护。一旦容器或者内部元素的宽高发生变化,相应的属性值就需要重写。
/* 容器 */
.container {
position: relative;
width: 100px;
height: 100px;
}
/* 居中元素不推荐的写法1 */
.center{
height: 80px;
width: 80px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -40px;
margin-top: -40px;
}
/* 不推荐的写法2:自己算出大概需要移动的 top 和 padding 值 */
.center {
height: 80px;
width: 80px;
position: absolute;
top: 10%;
left: 10%;
}
/* 更加奇怪的写法1:
* 手动算出容器 padding 值,以此实现居中
* 注:这里的情况属于 box-sizing: border-box;
*/
.container{
padding : 10px;
}
/* 更加奇怪的写法2:
* 手动算出元素的 margin 值,以此实现居中
* 注:这里的情况属于 box-sizing: content-box;
*/
.center{
margin : 10px;
}
其他的一些常见情况,其他答主都有提及,在此就不赘述了。
- 用内部元素的 margin 去控制容器内元素的间距
- 随意设置 z-index 的值
- 模仿别人的样式时,不思考 css 样式的实现原理,而是直接在开发者控制台 copy 人家的样式(甚至包括 class 命名)
- 滥用通配符等来设置样式、覆盖样式
3. 编码习惯问题
- 无意义、无语义命名
比如各种 my - 开头的 class 命名,以及用 html 标签本身的名称来做 class 的命名
.text1{
color:#fff;
}
.text2{
color:#000;
}
.div{
width:100%;
}
.h2{
font-weight:800;
}
.myClass{
width:100%;
}
.myCard{
border:5px;
}
- css 属性顺序随便乱放
.example{
width: 100px;
color: #ffffff;
position: relative;
margin: 10px;
font-size: 20px;
height: 150px;
padding: 5px;
font-weight: 800;
background-color: #1f1f1f;
}
这样也最容易直接导致的问题就是:css 属性重复且被覆盖。若样式行数较多,则被覆盖后不容易被发现。
.example{
margin: 0;
position: relative;
width: 100px;
height: 100px;
background-color: #fff;
padding: 10px;
margin: 50px auto;
}
- 滥用! important
包括但不仅限于,用! important 覆盖默认样式、覆盖第三方 ui 样式等。
- 内联、css 大量混用导致维护较难
- 大量使用 id
4. 使用 css 预处理器时
- 嵌套层级过深,滥用选择器进行嵌套
.container{
.card{
.card-header{
.card-header-title{
color:#fff;
}
}
.card-body{
height:300px;
width:100%;
}
}
}
.container{
* {
color:#fff;
}
}
.container{
ol{
list-style:none;
li{
margin:0;
}
}
}
- 在预处理器源文件中,重复 copy 样式代码,不写公共 class,不做合并
.card-main{
color: #222;
background-color: #999;
border-radius: 5px;
padding: 10px;
}
.card-result{
color: #222;
background-color: #999;
border-radius: 5px;
padding: 10px;
}
.card-order{
color: #222;
background-color: #999;
border-radius: 5px;
padding: 10px;
}
- 因使用 & 嵌套过深导致可读性较差或造成混乱
.container{
&-header{
color:#fff;
&:hover{
.text{
&:after{
content:'';
width: 100%;
height: 1px;
}
}
}
}
}
5. css 与 js 一起使用时
- 写静态样式时,css 与 css-in-js 、内联样式等混用
以 React 为例:
/* react 组件 ,Example.js */
const Example(){
return (
<div
className="demo"
style={{
color:'#fff',
fontSize:'20px'
}}
>...
</div>
)
}
自己写的 css 就起不到作用了
/* 引入的css样式 style.css */
.demo{
color: #000;
font-size: 15px;
}
最后,知乎上已经给出一些关于 css 规范的回答了。关于这一块可以参考:
如何规范 CSS 的命名和书写?www.zhihu.com
https://www.zhihu.com/question/322443498/answer/1608869388?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=53706733125632