布局与样式
明白何谓Margin Collapse
不同于其他很多属性,盒模型中垂直方向上的
.square {
width: 80px;
height: 80px;
}
.red {
background-color: #f44336;
margin-bottom: 40px;
}
.blue {
background-color: #2196f3;
margin-top: 30px;
}
在上述例子中我们会发现,红色和蓝色方块的外边距并没有相加得到margin-bottom
属性,这样就显得和谐多了。
使用Flexbox 进行布局
在传统的布局中我们习惯使用
.container {
display: flex;
/* Don't forget to add prefixes for Safari */display: -webkit-flex;
}
我们已经在
使用CSS Reset
虽然这些年来随着浏览器的迅速发展与规范的统一,浏览器特性碎片化的情况有所改善,但是在不同的浏览器之间仍然存在着很多的行为差异。而解决这种问题的最好的办法就是使用某个
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
上面的规则看起来没啥用,不过如果不同的浏览器在默认情况下为你设置了不同的外边距
一切应为Border-box
虽然很多初学者并不了解box-sizing
这个属性,但是它确实相当的重要。而最好的理解它的方式就是看看它的两种取值
- 默认值为
content-box ,即当我们设置某个元素的heght/width 属性时,仅仅会作用于其内容尺寸。而所有的内边距与边都是在其之上的累加,譬如某个<div>
标签设置为宽100 ,内边距为10 ,那么最终元素会占用120(100 + 2*10) 的像素。 border-box: 内边距与边是包含在了width/height 之内,譬如设置了width:100px
的<div>
无论其内边距或者边长设置为多少,其占有的大小都是100px 。
将元素设置为
以背景图方式使用Images
如果需要在响应式的环境下展示图片,有个简单的小技巧就是使用该图片作为某个<div>
的背景图而不是直接使用background-size
与background-position
这两个属性,可以很方便地按比例缩放
img {
width: 300px;
height: 200px;
}
div {
width: 300px;
height: 200px;
background: url("http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg");
background-position: center center;
background-size: cover;
}
section {
float: left;
margin: 15px;
}
不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
Better Table Borders
table {
width: 600px;
border: 1px solid #505050;
margin-bottom: 15px;
color: #505050;
}
td {
border: 1px solid #505050;
padding: 10px;
}
这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse
来进行处理
注释格式优化
/*---------------
#Header
---------------*/
header {
}
header nav {
} /*---------------
#Slideshow
---------------*/
.slideshow {
}
而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式
/* Footer Buttons */
.footer button {
}
.footer button:hover {
}
同时,不要忘了//
这种注释方式的
/* Do */
p {
padding: 15px;
/*border: 1px solid #222;*/
} /* Don't */
p {
padding: 15px;
// border: 1px solid #222;
}
使用Kebab-case 命名变量
对于样式类名或者-
符号,-
/* Do */
.footer-column-left {
}
/* Don't */
.footerColumnLeft {
}
.footer_column_left {
}
而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。
避免重复代码
大部分元素的font
属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html
或者body
中添加该属性然后使其层次传递下去即可
html {
font: normal 16px/1.4 sans-serif;
}
使用transform 添加CSS Animations
不建议直接改变元素的width
与height
属性或者left/top/bottom/right
这些属性来达到动画效果,而应该优先使用transform()
属性来提供更平滑的变换效果,并且能使得代码的可读性会更好
.ball {
left: 50px;
transition: 0.4s ease-out;
} /* Not Cool*/
.ball.slide-out {
left: 500px;
} /* Cool*/
.ball.slide-out {
transform: translateX(450px);
}
translate
、rotate
、scale
都具有比较好的浏览器兼容性可以放心使用。
不要重复造轮子
现在
尽可能使用低优先级的选择器
并不是所有的
a{
color: #fff;
padding: 15px;
}
a#blue-btn {
background-color: blue;
}
a.active {
background-color: red;
}
我们本来希望将.active
类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button
已经以
避免使用!important
认真的说,千万要避免使用!important
属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
使用text-transform 属性设置文本大写
<div class="movie-poster">Star Wars: The Force Awakens</div>
.movie-poster {
text-transform: uppercase;
}
Em, Rem, 以及Pixel
已经有很多关于人们应该如何使用
- em – 其基本单位即为当前元素的
font-size
值,经常适用于media-queries 中,em 是特别适用于响应式开发中。 - rem – 其是相对于
html
属性的单位,可以保证文本段落真正的响应式尺寸特性。 - px –
Pixels 并没有任何的动态扩展性,它们往往用于描述绝对单位,并且可以在设置值与最终的显示效果之间保留一定的一致性。
在大型项目中使用预处理器
估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。
$accent-color: #2196F3;
a {
padding: 10px 15px;
background-color: $accent-color;
}
a:hover {
background-color: darken($accent-color,10%);
}
使用Autoprefixers 来提升浏览器兼容性
使用特定的浏览器前缀是
- Online tools: Autoprefixer
- Text editor plugins: Sublime Text, Atom
- Libraries: Autoprefixer (PostCSS)
在生产环境下使用Minified 代码
为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于
- Online tools – CSS Minifier (API included), CSS Compressor
- Text editor plugins: Sublime Text, Atom
- Libraries: Minfiy (PHP), CSSO and CSSNano (PostCSS, Grunt, Gulp)
选择哪个工具肯定是依赖于你自己的工作流啦
多参阅Caniuse
不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在
Validate: 校验
对于
- Online tools: W3 Validator, CSS Lint
- Text editor plugins: Sublime Text, Atom
- Libraries: stylelint (Node.js, PostCSS), css-validator (Node.js)