明白何谓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属性,这样就显得和谐多了。

使用Flexbox进行布局

在传统的布局中我们习惯使用Floats或者inline-blocks,不过它们更适合于格式化文档,而不是整个网站。而Flexbox则是专门的用于进行布局的工具。Flexbox模型允许开发者使用很多便捷可扩展的属性来进行布局,估计你一旦用上就舍不得了:

.container {   display: flex;   /* Don't forget to add prefixes for Safari */display: -webkit-flex;
}

我们已经在Tutorialzine上提供了很多的关于Flexbox的介绍与小技巧,譬如5 Flexbox Techniques You Need to Know About。

使用CSS Reset

虽然这些年来随着浏览器的迅速发展与规范的统一,浏览器特性碎片化的情况有所改善,但是在不同的浏览器之间仍然存在着很多的行为差异。而解决这种问题的最好的办法就是使用某个CSS Reset来为所有的元素设置统一的样式,保证你能在相对统一干净的样式表的基础上开始工作。目前流行的Reset库有 normalize.css, minireset以及 ress ,它们都可以修正很多已知的浏览器之间的差异性。而如果你不打算用某个外在的库,那么建议可以使用如下的基本规则:

* {   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。

将元素设置为border-box会很方便你进行样式布局,这样的话你就可以在父元素设置高宽限制而不担心子元素的内边距或者边打破了这种限制。

以背景图方式使用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可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。

注释格式优化

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;     }

使用Kebab-case命名变量

对于样式类名或者ID名的命名都需要在多个单词之间添加-符号,CSS本身是大小写不敏感的因此你是用不了camelCase的,另一方面,很久之前也不支持下划线,所以现在的默认的命名方式就是使用-:

/*  Do     */   .footer-column-left { }   /*  Don't  */   .footerColumnLeft { }   .footer_column_left { }

而涉及到具体的变量命名规范时,建议是使用BEM规范,只要遵循一些简单的原则即可以保证基于组件风格的命名一致性。你也可以参考CSS Tricks来获得更多的细节描述。

避免重复代码

大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以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);
}

Transform的几个属性translate、rotate、scale都具有比较好的浏览器兼容性可以放心使用。

不要重复造轮子

现在CSS社区已经非常庞大,并且不断地有新的各式各样的库开源出来。这些库可以帮助我们解决从小的代码片到用于构建完整的响应式应用的全框架。所以如果下次你再碰到什么CSS问题的时候,在打算撸起袖子自己上之前可以尝试在GitHUB或者CodePen上搜索可行方案。

尽可能使用低优先级的选择器

并不是所有的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)

避免使用!important

认真的说,千万要避免使用!important,这可能会导致你在未来的开发中无尽的属性重写,你应该选择更合适的CSS选择器。而唯一的可以使用!important属性的场景就是当你想去复写某些行内样式的时候,不过行内样式本身也是需要避免的。

使用text-transform属性设置文本大写

<div class="movie-poster">Star Wars: The Force Awakens</div>   .movie-poster {   text-transform: uppercase;
}

Em, Rem, 以及 Pixel

已经有很多关于人们应该如何使用em,rem,以及px作为元素尺寸与文本尺寸的讨论,而笔者认为,这三个尺寸单位都有其适用与不适用的地方。不同的开发与项目都有其特定的设置,因此并没有通用的规则来决定应该使用哪个单位,这里是我总结的几个考虑:

  • em – 其基本单位即为当前元素的font-size值,经常适用于media-queries中,em是特别适用于响应式开发中。
  • rem – 其是相对于html属性的单位,可以保证文本段落真正的响应式尺寸特性。
  • px – Pixels 并没有任何的动态扩展性,它们往往用于描述绝对单位,并且可以在设置值与最终的显示效果之间保留一定的一致性。

在大型项目中使用预处理器

估计你肯定听说过 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%);
}

使用Autoprefixers来提升浏览器兼容性

使用特定的浏览器前缀是CSS开发中常见的工作之一,不同的浏览器、不同的属性对于前缀的要求也不一样,这就使得我们无法在编码过程中记住所有的前缀规则。并且在写样式代码的时候还需要加上特定的浏览器前缀支持也是个麻烦活,幸亏现在也是有很多工具可以辅助我们进行这样的开发:

  • Online tools: Autoprefixer
  • Text editor plugins: Sublime Text, Atom
  • Libraries: Autoprefixer (PostCSS)

在生产环境下使用Minified代码

为了提升页面的加载速度,在生产环境下我们应该默认使用压缩之后的资源代码。在压缩的过程中,会将所有的空白与重复剔除掉从而减少整个文件的体积大小。当然,经过压缩之后的代码毫无可读性,因此在开发阶段我们还是应该使用普通的版本。对于CSS的压缩有很多的现行工具:

  • 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上我们可以查询某个特性的浏览器版本适配性,是否需要添加特定的前缀或者在某个平台上是否存在Bug等等。不过光光使用caniuse肯定是不够的,我们还需要使用些额外的服务来进行检测。

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)

编写现代 CSS 代码的 20 个建议相关推荐

  1. 编写出色CSS代码的13个建议

    CSS学起来并不难,但在大型项目中,就变得难以管理,特别是不同的人在CSS书写风格上稍有不同,团队上就更加难以沟通,为此总结了一些如何实现高效整洁的CSS代码原则:     1. 使用Reset但并非 ...

  2. Zen Coding: 一种快速编写HTML/CSS代码的方法

    译自:Smashing Magazine 中文:Zen Coding: 一种快速编写HTML/CSS代码的方法 请尊重版权,转载请注明来源! 在本文中我们将展示一种新的使用仿CSS选择器的语法来快速开 ...

  3. 20个编写现代CSS代码的建议

    本文翻译自Danny Markov 的20-Tips-For-Writing-Modern-CSS一文. 本文归纳于笔者的Web Frontend Introduction And Best Prac ...

  4. sublime text3 快速编写 HTML/CSS代码

    转自:http://www.cnblogs.com/EnSnail/p/6294897.html Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生. ...

  5. 编写更好的CSS代码

    编写好的CSS代码,有助提升页面的渲染速度.本质上,引擎需要解析的CSS规则越少,性能越好.MDN上将CSS选择符归类成四个主要类别,如下所示,性能依次降低. ID 规则 Class 规则 标签规则 ...

  6. 写好CSS代码的70个专业建议

    写好CSS代码的70个专业建议-前端开发博客 CSS 并不总是容易处理. 在你的能力和经验不够的时候,CSS编程会成为一个噩梦,特别是你不确定为页面元素中选择哪种选择器的时候.使用一个不常见的CSS属 ...

  7. 写好CSS代码的70个专业建议-前端开发博客

    写好CSS代码的70个专业建议-前端开发博客 CSS 并不总是容易处理. 在你的能力和经验不够的时候,CSS编程会成为一个噩梦,特别是你不确定为页面元素中选择哪种选择器的时候.使用一个不常见的CSS属 ...

  8. 《Java编码指南:编写安全可靠程序的75条建议》—— 指南20:使用安全管理器创建一个安全的沙盒...

    本节书摘来异步社区<Java编码指南:编写安全可靠程序的75条建议>一书中的第1章,第1.20节,作者:[美]Fred Long(弗雷德•朗), Dhruv Mohindra(德鲁•莫欣达 ...

  9. 《编写高质量代码:改善C#程序的157个建议》勘误表

    <编写高质量代码:改善C#程序的157个建议>中关于勘误的描述: 资源及勘误 通常情况下,一个问题的解决方案往往不止一种,你可能会不同意本书中的一些观点,甚至会强烈反对.没有关系,你可以通 ...

最新文章

  1. 浅析SEO优化中标签的作用?
  2. Python多线程介绍及实例
  3. java 一般方法_一般覆盖Java中的方法
  4. Android studio的监听器初学者要懂
  5. 在xcode4.2.1项目中加入oreplot0.9
  6. wincc 如何实现上下箭头对数字的增减_由箭头函数引发的对一些概念的认识
  7. 机器学习就那么回事儿
  8. 分析uint8_t\uint_16_t\uint32_t\uint64_t
  9. iOS:栈、堆、字符串常量区、全局区
  10. 2019数据安装勾选_【在发票平台确认签名后,为什么在电子税务局增值税申报表上没有自动显示进项数据?】一张发票的“有效税额”是否可以分两个月抵扣?...
  11. 数据的种类(结构化数据、非结构化数据、半结构化数据)
  12. 【Python程序设计】实验4:字符串与正则表达式
  13. 《魔兽世界》国服团队正与新合作方洽谈;爆苹果将允许第三方应用商店替代 App Store;Vite 4.0发布|极客头条
  14. Latex 调整行距
  15. LaTeX中的保留字符(反斜杠)和特殊符号(角度、摄氏度)怎么表示?
  16. 编译错误/usr/bin/ld: cannot find -lz
  17. 服务器性能参数:QPS、PV、IP
  18. uniapp无网络提示
  19. java计算机毕业设计高校教师工作量管理系统MyBatis+系统+LW文档+源码+调试部署
  20. Java+Swing实现医院管理系统

热门文章

  1. QMidi Pro for mac (终极多媒体卡拉OK播放器)
  2. DASH视频系统(服务器播放器)搭建
  3. 【数电课程设计】---出租车计价器
  4. ZEMAX 如何通过 K-相关分布模拟表面散射
  5. Python 波形处理
  6. pytorch 图像分割DeepLabv3+ 训练自己的数据
  7. jconsole连接远程服务
  8. 轻听-最好的解压助眠医疗轻音乐集
  9. Android设置状态栏字体深色,Android实现修改状态栏背景、字体和图标颜色的方法...
  10. Deepin系统卸载alsa-base后导致系统无法启动