On Github cagen / frontend-guideline
对于图片、媒体文件、样式文件、脚本的URL地址中忽略协议部分(https:, http:),除非该资源只能支持某一种协议类型。
原因:
<!-- Not recommended --> <script src="http://www.exmaple.com/js/example.js"></script> <!-- Recommended --> <script src="//www.google.com/autotrack.js"></script>
/* Recommended */ .example { background: url(http://www.google.com/images/example); } /* Not recommended */ .example { background: url(//www.google.com/images/example); }
使用空格缩进,一次缩进两个空格
不要使用tab或者混合使用tab和space进行缩进
所有的代码小写,包括:
去除行尾无用空格
行尾空格容易造成文件差异比较时的混乱
<!-- Not recommended --> <A HREF="/">Home</A> <!-- Recommended --> <img src="google.png" alt="Google">
/* Not recommended */ color: #E5E5E5; /* Recommended */ color: #e5e5e5;
使用UTF-8编码格式
更多关于编码格式及如何声明的问题,参见Handling character encodings in HTML and CSS
所有的代码小写,包括:
验证HTML有效性,如标签闭合,重复ID,无效属性等问题
可以使用W3C HTML validator来进行验证
根据目的使用对应的HTML元素(常被错误的称呼为HTML标签 例如:标题使用标题元素,段落使用p元素,链接使用a元素等等
使用HTML5的文档类型<!DOCTYPE html> (推荐使用HTML,对应的MIME类型为text/html。不推荐使用XHTML,对应的MIME类型为application/xhtml+xml,因为该类型缺少浏览器的支持,并且相较于HTML,会少了很多优化的空间) 并且对于HTML来说,不要关闭空元素,例如:使用<br>,而无需使用<br />
<!-- Not recommended --> <title>Test</title> <article>This is only a test. <!-- recommended --> <!DOCTYPE html> <meta charset="utf-8"> <title>Test</title> <article>This is only a test.</article>
<!-- Not recommended --> <div onclick="goToRecommendations();">All recommendations</div> <!-- Recommended --> <a href="recommendations/">All recommendations</a>
将结构(标记)、展示(样式)、行为(脚本)分离,并且尽量使这三者的交互减少到最小 保证文档和模板只包含HTML,并且HTML只作为页面结构的目的而使用,将所有的样式放入样式表,将所有的行为放入脚本中去 并且,在HTML模板中尽力减少外联样式和脚本的数量以保证三者的连接尽量简单 将样式和行为从结构中分离出来可提高代码的可维护性。因为修改HTML模板的代价远高于修改样式表和脚本。
对于图片、视频、canvas创建的动画对象等多媒体,提供替代的内容。 例如:对图片使用alt属性提供有意义的替代文字,对于视频音频,提供对应的字幕和标题。 例外:
<!-- Not recommended --> <!DOCTYPE html> <title>HTML sucks</title> <link rel="stylesheet" href="base.css" media="screen"> <link rel="stylesheet" href="grid.css" media="screen"> <link rel="stylesheet" href="print.css" media="print"> <h1 style="font-size: 1em;">HTML sucks</h1> <p>I’ve read about this on a few sites but now I’m sure: <u>HTML is stupid!!1</u> <center>I doing everything</center> <!-- Recommended --> <!DOCTYPE html> <title>My first CSS-only redesign</title> <link rel="stylesheet" href="default.css"> <h1>My first CSS-only redesign</h1> <p>I’ve read <p>It’s awesome!
<!-- Not recommended --> <img src="spreadsheet.png"> <!-- Recommended --> <img src="spreadsheet.png" alt="Spreadsheet screenshot.">
不要使用HTML字符实体引用 只要团队中使用的文件和编辑器都设置为UTF-8,则没有必要使用—、”、☺这样的实体引用 需要使用实体引用的情况有两种:
忽略样式表和脚本的type属性 HTML5规范中样式表和脚本的type属性默认分别为text/css和text/javascript。 对于老的浏览器,这么做也是可以的。 当然,如果样式表使用的不是CSS或者脚本使用的不是Javascript,则需要显示声明type属性
<!-- Not recommended --> <img src="spreadsheet.png"> <!-- Recommended --> <img src="spreadsheet.png" alt="Spreadsheet screenshot.">
对于所有的block、list、table元素,必须新起一行,并且缩进其子元素 对于block、list、table的子节点,都需要缩进。 如果使用时碰到list的项之间出现空格的问题,可以折中地将所有li元素写在一行。代码检查会出现警告,而非错误。
属性值使用双引号
<!-- Not recommended --> <a class='maia-button maia-button-secondary'>Sign in</a> <!-- Recommended --> <a class="maia-button maia-button-secondary">Sign in</a>
使用有效的CSS代码。 除非遇到特定的兼容性语法,如前缀、IE兼容语法等。 使用 W3C CSS validator测试有效性
避免使用类型选择器去限定ID和Class 除非有必要(例如使用Helper类时),不要将类型选择器与ID或Class同时使 减少不必要的祖先选择器对于性能来说 有所帮助。
避免使用UA检测和CSS Hack,优先尝试其他的解决方案 虽然使用UA检测或者特殊的CSS滤镜、Hack可以很方便地解决一些样式上的差异问题。但是为了编写和维护高效和可控的代码基础,这些方法只能作为最后的手段。 从项目的长远来看,如果轻易地给这些方法开绿灯,就会使得项目更加倾向于使用更多的这些方法,最终会导致项目代码完全无法维护。
/* Not recommended */ ul#example {} div.error {} /* Recommended */ #example {} .error {}
使用有意义或者通用的ID和Class命名。 ID和Class命名时最好能够表达出这一样式的目的,而不是使用表象的或者晦涩难懂的命名方式。 特定的或者能够表达出目的的命名容易理解而且不会轻易改变 通用的命名是为了那些没有特殊目的元素或者那些跟其相同的元素没有意义上差别的元素,他们就类似于Helper方法一样 使用通用的命名可以减少HTML代码改动的几率。 命名在保证易懂的前提下尽量简短 在能够描述清楚这一ID或Class时,尽力保持简短 这样命名ID和Class能够让代码更加易懂并提升代码效率
在ID和Class中使用-作为词语的分隔符 不要使用下划线或者驼峰等形式作为ID和Class的分隔形式,需要保持这种习惯,以提高代码的可读性和一致性。
/* Not recommended: meaningless */ #yee-1901 {} /* Not recommended: presentational */ .button-green {} .clear {} /* Recommended: specific */ #gallery {} #login {} .video {} /* Recommended: generic */ .aux {} .alt {} /* Not recommended */ #navigation {} .atr {} /* Recommended */ #nav {} .author {} /* Not recommended: does not separate the words */ .demoimage {} /* Not recommended: uses underscore instead of hyphen */ .error_status {} /* Recommended */ #video-id {} .ads-sample {}
尽可能使用属性简写 CSS提供了的某些简写形式(如font),就算只是显式设定其中一个值,也要使用缩写形式。 使用简写形式可以提高代码效率和可读性。
在属性值为0时,忽略单位,除非该单位是必须的。 当属性值在-1与1之间时,忽略前置的0
尽量使用3位16进制数更加短小简洁
/* Not recommended */ border-top-style: none; font-family: palatino, georgia, serif; font-size: 100%; line-height: 1.6; padding-bottom: 2em; padding-left: 1em; padding-right: 1em; padding-top: 0; /* Recommended */ border-top: 0; font: 100%/1.6 palatino, georgia, serif; padding: 0 1em 2em;
/* Recommended */ margin: 0; padding: 0; font-size: .8em;
/* Not recommended */ color: #eebbcc; /* Recommended */ color: #ebc;
按类型声明 相关的属性声明应当归为一组,并按照下面的顺序排列:
由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。 其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。 完整的属性列表及其排列顺序请参考 Recess。
.declaration-order { /* Positioning */ position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 100; /* Box-model */ display: block; float: right; width: 100px; height: 100px; /* Typography */ font: normal 13px "Helvetica Neue", sans-serif; line-height: 1.5; color: #333; text-align: center; /* Visual */ background-color: #f5f5f5; border: 1px solid #e5e5e5; border-radius: 3px; /* Misc */ opacity: 1; }
a:focus, a:active { position: relative; top: 1px; } h1, h2, h3 { font-weight: normal; line-height: 1.2; }
属性选择器和属性值都使用单引号,不要给URI值(url())加上任何引号 例外:如果你必须要使用@charset,可以使用双引号
/* Not recommended */ @import url("//www.google.com/css/maia.css"); html { font-family: "open sans", arial, sans-serif; } /* Recommended */ @import url(//www.google.com/css/maia.css); html { font-family: 'open sans', arial, sans-serif; }
在你修改一段代码之前,花几分钟看看这些代码的基本格式。 如果他们在所有的运算符前后都加了空格,那么你也应该加上。 如果代码的评论是用一圈#号围起来的,那么你的评论也该这么做。 制定并施行代码规范的目的在于,能建立一种通用的代码“语法”, 让人们能够专注于你的代码要表达什么,而不是怎么表达的。 我们在这里制订了全局的样式规范,让人们能够了解这一“语法”, 但如果你添加的代码与原有的代码差别很大,则要尽量注意保持与原有代码风格一致。