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

本文翻译自Danny Markov 的20-Tips-For-Writing-Modern-CSS一文。

本文归纳于笔者的Web Frontend Introduction And Best Practices:前端入门与最佳实践中CSS入门与最佳实践系列,其他的关于CSS样式指南的还有提升你的CSS姿势、Facebook里是怎样提升CSS代码质量的。本文更偏向于样式使用技巧,前两篇偏向于代码风格与规范。

明白何谓Margin Collapse

不同于其他很多属性,盒模型中垂直方向上的Margin会在相遇时发生崩塌,也就是说当某个元素的底部Margin与另一个元素的顶部Margin相邻时,只有二者中的较大值会被保留下来,可以从下面这个简单的例子来学习:

 
  1. .square { 
  2.     width: 80px; 
  3.     height: 80px; 
  4.  
  5. .red { 
  6.     background-color: #F44336; 
  7.     margin-bottom: 40px; 
  8.  
  9. .blue { 
  10.     background-color: #2196F3; 
  11.     margin-top: 30px; 
  12. }  

在上述例子中我们会发现,红色和蓝色方块的外边距并没有相加得到70px,而是只有红色的下外边距保留了下来。我们可以使用一些方法来避免这种行为,不过建议来说还是尽量统一使用margin-bottom属性,这样就显得和谐多了。

使用Flexbox进行布局

CSS实战之Flex详解以及其在微信中的兼容实现

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

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

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

使用CSS Reset

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

 
  1. * { 
  2.     margin: 0; 
  3.     padding: 0; 
  4.     box-sizing: border-box; 
  5. }  

上面的规则看起来没啥用,不过如果不同的浏览器在默认情况下为你设置了不同的外边距/内边距的默认值,还是会挺麻烦的。

一切应为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这两个属性,可以很方便地按比例缩放:

 
  1. img { 
  2.     width: 300px; 
  3.     height: 200px; 
  4.  
  5. div { 
  6.     width: 300px; 
  7.     height: 200px; 
  8.     background: url('http://cdn.tutorialzine.com/wp-content/uploads/2016/08/bicycle.jpg'); 
  9.     background-position: center center; 
  10.     background-size: cover; 
  11.  
  12. section
  13.     floatleft
  14.     margin: 15px; 
  15. }  

不过这种方式也是存在缺陷的,譬如你无法设置图片的懒加载、图片无法被搜索引擎或者其他类似的工具抓取到,有个不错的属性叫object-fit可以解决这个问题,不过该属性目前的浏览器支持并不是很完善。

Better Table Borders

HTML中使用Tables进行布局一直是个很头疼的问题,它们使用起来很简单,但是无法进行响应式操作,并且也不方便进行全局样式设置。譬如,如果你打算为Table的边与单元的边添加样式,可能得到的结果如下:

 
  1. table { 
  2.     width: 600px; 
  3.     border: 1px solid #505050; 
  4.     margin-bottom: 15px; 
  5.     color:#505050; 
  6.  
  7. td{ 
  8.     border: 1px solid #505050; 
  9.     padding: 10px; 
  10. }  

这里存在的问题是出现了很多的重复的边,会导致视觉上不协调的情况,那么我们可以通过设置border-collapse:collapse来进行处理:

注释格式优化

CSS虽然谈不上一门编程语言但是其仍然需要添加注释以保障整体代码的可读性,只要添加些简单的注释不仅可以方便你更好地组织整个样式表还能够让你的同事或者未来的自己更好地理解。对于CSS中整块的注释或者使用在Media-Query中的注释,建议是使用如下形式:

 
  1. /*--------------- 
  2.     #Header 
  3. ---------------*/header { }header nav { }/*--------------- 
  4.     #Slideshow 
  5. ---------------*/.slideshow { }  

而设计的细节说明或者一些不重要的组件可以用如下单行注释的方式:

 
  1. /*   Footer Buttons   */ 
  2. .footer button { } 
  3.  
  4. .footer button:hover { }  

同时,不要忘了CSS中是没有//这种注释方式的:

 
  1. /*  Do  */p { 
  2.     padding: 15px; 
  3.     /*border: 1px solid #222;*/ 
  4. }/*  Don't  */p { 
  5.     padding: 15px; 
  6.     // border: 1px solid #222;   
  7. }  

使用Kebab-case命名变量

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

 
  1. /*  Do     */ 
  2. .footer-column-left { } 
  3.  
  4. /*  Don't  */ 
  5. .footerColumnLeft { } 
  6.  
  7. .footer_column_left { }  

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

避免重复代码

大部分元素的CSS属性都是从DOM树根部继承而来,这也是其命名为级联样式表的由来。我们以font属性为例,该属性往往是继承自父属性,因此我们并不需要再单独地为元素设置该属性。我们只需要在html或者body中添加该属性然后使其层次传递下去即可:

 
  1. html { 
  2.     font: normal 16px/1.4 sans-serif; 
  3. }  

使用transform添加CSS Animations

不建议直接改变元素的width与height属性或者left/top/bottom/right这些属性来达到动画效果,而应该优先使用transform()属性来提供更平滑的变换效果,并且能使得代码的可读性会更好:

 
  1. .ball { 
  2.     left: 50px; 
  3.     transition: 0.4s ease-out
  4. }/* Not Cool*/.ball.slide-out { 
  5.     left: 500px; 
  6. }/* Cool*/.ball.slide-out { 
  7.     transform: translateX(450px); 
  8. }  

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

不要重复造轮子

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

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

并不是所有的CSS选择器的优先级都一样,很多初学者在使用CSS选择器的时候都是考虑以新的特性去复写全部的继承特性,不过这一点在某个元素多状态时就麻烦了,譬如下面这个例子:

 
  1. a{ 
  2.     color: #fff; 
  3.     padding: 15px; 
  4.  
  5. a#blue-btn { 
  6.     background-color: blue; 
  7.  
  8. a.active { 
  9.     background-color: red; 
  10. }  

我们本来希望将.active类添加到按钮上然后使其显示为红色,不过在上面这个例子中很明显起不了作用,因为button已经以ID选择器设置过了背景色,也就是所谓的Higher Selector Specificity。一般来说,选择器的优先级顺序为:ID(#id) > Class(.class) > Type(header)

避免使用!important

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

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

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

Em, Rem, 以及 Pixel

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

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

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

估计你肯定听说过 Sass, Less, PostCSS, Stylus这些预处理器与对应的语法。Preprocessors可以允许我们将未来的CSS特性应用在当前的代码开发中,譬如变量支持、函数、嵌套式的选择器以及很多其他的特性,这里我们以Sass为例:

 
  1. $accent-color: #2196F3; 
  2.  
  3. a { 
  4.     padding: 10px 15px; 
  5.     background-color: $accent-color; 
  6.  
  7. a:hover { 
  8.     background-color: darken($accent-color,10%); 
  9. }  

使用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)
作者:王下邀月熊_Chevalier
来源:51CTO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 相同的css属性_CSS中的order属性

css 相同的css属性CSS | 订单属性 (CSS | order Property) Introduction: 介绍&#xff1a; Web development is an ever-growing field that would never find its end, therefore it is equally necessary to learn new ways to deal with the elements of the web page or …

StoreServ的ASIC架构师必须面向未来做出决断

StoreServ阵列采用特殊硬件&#xff0c;即一套ASIC来加速存储阵列操作&#xff0c;而且其每代阵列都会在这方面进行重新设计。目前的设计为第五代。 作为惠普企业业务公司研究员兼StoreServ架构师&#xff0c;Siamak Nazari当下主要负责第六代ASIC的设计工作。 每代ASIC设计往往…

android网页省略分页器,Android轻量级网页风格分页器

博客同步自:个人博客主页轻量级仿网页风格分页器&#xff0c;和RecycleView封装一起配合使用&#xff0c;也可单独使用&#xff0c;喜欢就star、fork下吧&#xff5e;谢谢目录功能介绍效果图如何引入简单使用依赖github地址功能介绍支持延迟加载分页支持单独分页器组件使用&…

传统存储做到极致也惊人!看宏杉科技发布的CloudSAN

传统存储阵列首先考虑的是高可靠、高性能。那么在成本上、扩展上、部署上就差。 互联网企业带来分布式存储&#xff0c;扩展上、部署上是优势了&#xff0c;但是单节点的可靠性差、数据一致性差、IO延迟大、空间浪费严重&#xff0c;能耗大。 这两者的问题&#xff0c;我想很多…

keil lic_LIC的完整形式是什么?

keil licLIC&#xff1a;印度人寿保险公司 (LIC: Life Insurance Corporation of India) LIC is an abbreviation of the Life Insurance Corporation of India. It is a public segment insurance and investment group corporation in India that generally deals with life …

“云”上存储初显规模 如何架构是关键

在安防系统中&#xff0c;存储设备只是给数据提供存储空间&#xff0c;数据存储的意义更多是为了给上层应用提供二次挖掘。目前的智能分析、大数据、图帧等技术都是基于数据存储做的数据挖掘。为了将二次挖掘应用的性能提升到最高&#xff0c;在优化分析算法的同时&#xff0c;…

【干货】分享总结:MySQL数据一致性

0、导读 沃趣科技数据库工程师罗小波为大家全面分析如何保证MySQL的数据一致性。 1、活动总结 罗小波老师从MySQL的崩溃数据恢复安全性、MySQL复制原理及异步&semi sync复制原理、MySQL主从服务器如何保证数据一致性等多方面分析如何保证MySQL的数据一致性。 分享内容满满的…

设置html按钮点击事件无效果,css怎么设置按钮不能点击?

css怎么设置按钮不能点击&#xff1f;下面本篇文章就来给大家介绍一下使用CSS设置按钮不能点击的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。想要按钮不能点击可以通过设置按钮点击事件失效来实现&#xff1b;而在CSS中&…

计算机图形学与几何造型导论_计算机图形学导论

计算机图形学与几何造型导论历史 (History) The main forerunner sciences to the development of modern computer graphics were the advances in electrical engineering, electronics, and television that took place during the first half of the twentieth century whe…

android 继承listview,Android listView 继承ListActivity的用法

Android listView 继承ListActivity的用法 在手机中经常有列表方式。如果Activity中只有唯⼀⼀个List(这也是通常的情况)&#xff0c;可以继承ListActivity来实现。我们用两个例子来学习List。List例子⼀&#xff1a;利用Android自带的List格式步骤⼀&#xff1a;Android XML文…

html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式

oauth2 authorization code 大致流程用户打开客户端后&#xff0c;客户端要求用户给予授权。用户同意给予客户端授权。客户端使用授权得到的code&#xff0c;向认证服务器申请token令牌。认证服务器对客户端进行认证以后&#xff0c;确认无误&#xff0c;同意发放令牌。客户端请…

Net设计模式实例之代理模式(Proxy Pattern)

一、代理模式简介&#xff08;Brief Introduction&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;对其他对象提供一种代理以控制对这个对象的访问。 二、解决的问题&#xff08;What To Solve&#xff09; 1、远程代理 远程代理&#xff0c;也就是为了一个对象…

jsonp请求html页面,JavaScript中的JSON和JSONP

简单地使用json并不能支持跨域资源请求&#xff0c;为了解决这个问题&#xff0c;需要采用jsonp数据交互协议。众所周知&#xff0c;js文件的调用不受跨域与否的限制&#xff0c;因此如果想通过纯web端跨域访问数据&#xff0c;只能在远程服务器上设法将json数据封装进js格式的…

html导航栏点击不能跳转,无法单击导航栏中的链接CSS HTML

不确定是否允许您链接您的网站&#xff0c;但是如果允许。 因此&#xff0c;我可以将所有链接悬停在导航栏中&#xff0c;但我无法点击它们&#xff0c;并且S的图片是可移动的&#xff0c;但无法点击&#xff0c;我做错了什么&#xff1f;无法单击导航栏中的链接CSS HTMLNickeb…

JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址

2019独角兽企业重金招聘Python工程师标准>>> 在写Java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上 1.可以在servlet的init方法里 String path getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 :E:\eclipseM9\worksp…

关于细分到字段的权限系统_操作系统中的细分

关于细分到字段的权限系统为什么需要细分&#xff1f; (Why Segmentation is required?) In the Operating System, an important drawback of memory management is the separation of the users view of memory and the actual physical memory. Paging is the scheme which…

mba学什么书_MBA的完整形式是什么?

mba学什么书MBA&#xff1a;工商管理硕士 (MBA: Master of Business Administration) MBA is an abbreviation of a Master of Business Administration. It is a masters degree for post-graduation in business administration. This business masters degree program is a …

bca ac如何联合索引_BCA的完整形式是什么?

bca ac如何联合索引BCA&#xff1a;计算机应用学士学位 (BCA: Bachelor of Computer Applications) BCA is an abbreviation of Bachelor of Computer Applications. It is a three-year undergraduate program in Computer applications. It is considered equivalent to B.Te…

嘿,程序员,你该学点经济学了!

前言&#xff1a; 笔者一直认为&#xff0c;一个好的程序员&#xff0c;不仅仅是代码敲得好&#xff0c;其它方面的知识和能力相同非常重要。特别是随着年龄的增长。非常多人也慢慢的往管理层发展。这个时候沟通与协调能力变得更加重要&#xff0c;而一些策划&#xff0c;推广方…

Linux相关图解随记

01.dns解析过程02.用户访问网站流程03.局域网电脑上网流程04.网站架构图解转载于:https://blog.51cto.com/qinbin/1954149