从我刚开始接触前端时写的 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 (<divclassName="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
