转载自:http://www.codeceo.com/article/20-modern-css-tips.html
https://www.npmjs.com/package/css-validator
1. 明白何谓Margin Collapse
不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较大值会被保留下来,可以从下面这个简单的例子来学习:
.square {
width: 80px;
height: 80px;
}
.red {
background-color: #F44336;
margin-bottom: 40px;
}
.blue {
background-color: #2196F3;
margin-top: 30px;
}
在上述例子中我们会发现,红色和蓝色方块的外边距并没有相加得到70px,而是只有红色的下外边距保留了下来。我们可以使用一些方法来避免这种行为,不过建议来说还是尽量统一使用margin-bottom属性,这样就显得和谐多了。
2. 使用Flexbox进行布局
在传统的布局中我们习惯使用Floats或者inline-blocks,不过它们更适合于格式化文档,而不是整个网站。而Flexbox则是专门的用于进行布局的工具。Flexbox模型允许开发者使用很多便捷可扩展的属性来进行布局,估计你一旦用上就舍不得了:
.container {
display: flex;
/* Don't forget to add prefixes for Safari */display: -webkit-flex;
}
这里说一下 “flex” 这个属性
布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持(Chrome21+,Opera12.1+,Firefox22+,Safari6.1+,IE10+),这意味着,现在就能很安全地使用这项功能.
Flex布局将成为未来布局的首选方案,详细的可以参照阮一峰的这篇文章
3. 使用CSS Reset
虽然这些年来随着浏览器的迅速发展与规范的统一,浏览器特性碎片化的情况有所改善,但是在不同的浏览器之间仍然存在着很多的行为差异。
而解决这种问题的最好的办法就是使用某个CSS Reset来为所有的元素设置统一的样式,保证你能在相对统一干净的样式表的基础上开始工作。目前流行的Reset库有 normalize.css, minireset以及 ress ,它们都可以修正很多已知的浏览器之间的差异性。而如果你不打算用某个外在的库,那么建议可以使用如下的基本规则:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
上面的规则看起来没啥用,不过如果不同的浏览器在默认情况下为你设置了不同的外边距/内边距的默认值,还是会挺麻烦的。
4. 一切应为Border-box
虽然很多初学者并不了解box-sizing这个属性,但是它确实相当的重要。而最好的理解它的方式就是看看它的两种取值:
- 默认值为content-box,即当我们设置某个元素的heght/width属性时,仅仅会作用于其内容尺寸。而所有的内边距与边都是在其之上的累加,譬如某个
<div>
标签设置为宽100,内边距为10,那么最终元素会占用120(100 + 2*10)的像素。- border-box:内边距与边是包含在了width/height之内,譬如设置了width:100px的
<div>
无论其内边距或者边长设置为多少,其占有的大小都是100px。
将元素设置为border-box会很方便你进行样式布局,这样的话你就可以在父元素设置高宽限制而不担心子元素的内边距或者边打破了这种限制。
5. 以背景图方式使用Images
如果需要在响应式的环境下展示图片,有个简单的小技巧就是使用该图片作为某个<div>
的背景图而不是直接使用img标签。基于这种方式配合上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可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。
6. Better Table Borders
HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:
这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse
来进行处理:
7. 注释格式优化
CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:
/*---------------#Header---------------*/
header { }
header nav { }
/*---------------#Slideshow---------------*/
.slideshow { }
而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:
/* Footer Buttons */
.footer button { }
.footer button:hover { }
同时,不要忘了CSS中是没有//这种注释方式的:
/* Do */
p {
padding: 15px;
/*border: 1px solid #222;*/
}
/* Don't */
p {
padding: 15px;
// border: 1px solid #222;
}
8. 使用Kebab-case命名变量
对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-
:
/* Do */
.footer-column-left { }
/* Don't */
.footerColumnLeft { }
.footer_column_left { }
9. 避免重复代码
大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:
html {
font: normal 16px/1.4 sans-serif;
}
10. 使用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);
}
Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。
11. 不要重复造轮子
现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。
12. 尽可能使用低优先级的选择器
并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:
a{
color: #fff;
padding: 15px;
}
a#blue-btn {
background-color: blue;
}
a.active {
background-color: red;
}
我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。
一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)
13. 避免使用!important
认真的说,千万要避免使用!important
,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。
14. 使用text-transform属性设置文本大小写
<div class="movie-poster">Star Wars: The Force Awakens</div>
.movie-poster {
text-transform: uppercase;
}
text-transform属性值如下:
值 | 描述 |
---|---|
none | 默认。定义带有小写字母和大写字母的标准的文本。 |
capitalize | 文本中的每个单词以大写字母开头。 |
uppercase | 全部字母大写。 |
lowercase | 全部字母小写 |
inherit | 规定应该从父元素继承 text-transform 属性的值。 |
所有浏览器都支持 text-transform 属性。
注释:任何的版本的 Internet Explorer (包括 IE8)都不支持属性值"inherit"
。
15. Em, Rem, 以及 Pixel
已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:
- em – 其基本单位即为当前元素的font-size值,经常适用于media-queries中,em是特别适用于响应式开发中。
- rem – 其是相对于html属性的单位,可以保证文本段落真正的响应式尺寸特性。
- px – Pixels 并没有任何的动态扩展性,它们往往用于描述绝对单位,并且可以在设置值与最终的显示效果之间保留一定的一致性。
16.在大型项目中使用预处理器
估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:
$accent-color: #2196F3;
a {
padding: 10px 15px;
background-color: $accent-color;
}
a:hover {
background-color: darken($accent-color,10%);
}
17. 使用Autoprefixers来提升浏览器兼容性
使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:
- Online tools: Autoprefixer
- Text editor plugins: Sublime Text, Atom
- Libraries: Autoprefixer (PostCSS)
18. 多参阅Caniuse
不同的浏览器在兼容性上差异很大,因此如果我们可以针对我们所需要适配的浏览器,在caniuse上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。
19. Validate:校验
对于CSS的校验可能不如HTML校验或者JavaScript校验那么重要,不过在正式发布之前用Lint工具校验一波你的CSS代码还是很有意义的。它会告诉你代码中潜在的错误,提示你一些不符合最佳实践的代码以及给你一些提升代码性能的建议。就像Minifers与Autoprefixers,也有很多可用的工具:
- Online tools: W3 Validator, CSS Lint
- Text editor plugins: Sublime Text, Atom
- Libraries: stylelint (Node.js, PostCSS), css-validator (Node.js)
20. 网页样式
1. 居中
长文本很难解析,也因此不易阅读。每行设置字符限制,可以大大提高大量文本的可读性和吸引力。
body {
margin: 0 auto;
max-width: 50em;
}
2. 字体
浏览器的默认字体为Times,可看起来缺乏吸引力(主要是因为它是“无样式”字体)。切换到一个无衬线字体,如Helvetica
或Arial
可以大大提高你网页的可读性。
body {
font-family: "Helvetica", "Arial", sans-serif;
}
3. 间隔
当用户觉得一个页面崩坏的时候,通常来说都是间距问题。通过在文本周围和文本内设置适当的间距就可以增加页面的吸引力。
body {
line-height: 1.5;
padding: 4em 1em;
}
h2 {
margin-top: 1em;
padding-top: 1em;
}
4. 颜色和对比度
白色背景上的黑色文字看起来会比较扎眼。为文本选择一款较软一点的黑色,让页面阅读起来更舒服。
body {
color: #555;
}
为了保持一个良好的对比度,让我们为重要文本选择一个更黑暗的阴影。
h1,
h2,
strong {
color: #333;
}
5. 平衡
只需要一些额外的调整就可以平衡页面,在这一点上,你可能想让你的页面脱颖而出,让它更有个性:
code,
pre {
background: #eee;
}
code {
padding: 2px 4px;
vertical-align: text-bottom;
}
pre {
padding: 1em;
}
6.主色调
大多数品牌都有一个主色调,作为视觉基调。在一个网页上,这个主色调可以用来强调交互元素,如链接:
a {
color: #e81c4f;
}
7.辅助色
主色调可以用更微妙的色调来补充,用于边框,背景,甚至正文中。
body {
color: #566b78;
}
code,
pre {
background: #f5f7f9;
border-bottom: 1px solid #d8dee9;
color: #a7adba;
}
pre {
border-left: 2px solid #69c;
}
8.自定义字体
由于文本是网页的主要内容,使用自定义字体能使页面更加引人注目。
当你可以嵌入自己的网页字体或使用类似Typekit的在线服务时,让我们使用免费谷歌字体Roboto:
@import 'https://fonts.googleapis.com/cssfamily=Roboto:300,400,500';
body {
font-family: "Roboto", "Helvetica", "Arial", sans-serif;
}
在通过自定义字体凸显你的个性后,增加一千个单词又怎么办呢?
图形和图标既可用来作为支持你的内容的装饰品,还可以在你想要传达的信息中担当积极部分。
让我们从Unsplash挑选一张漂亮的背景图片来美化header。
header {
background-color: #263d36;
background-image: url("header.jpg");
background-position: center top;
background-repeat: no-repeat;
background-size: cover;
line-height: 1.2;
padding: 10vw 2em;
text-align: center;
}
9.添加logo
header img {
display: inline-block;
height: 120px;
vertical-align: top;
width: 120px;
}
让我们借这个机会,来提高文本风格。
header h1 {
color: white;
font-size: 2.5em;
font-weight: 300;
}
header a {
border: 1px solid #e81c4f;
border-radius: 290486px;
color: white;
font-size: 0.6em;
letter-spacing: 0.2em;
padding: 1em 2em;
text-transform: uppercase;
text-decoration: none;
transition: none 200ms ease-out;
transition-property: color, background;
}
header a:hover {
background: #e81c4f;
color: white;
}
按照网页设计的基本原则,我们在短短几分钟内设计了一个像样的页面