Normes de codage CSS
Le but de ce document est de rendre le style de code CSS cohérent et facile à comprendre et à maintenir. Si vous n'avez pas cette habitude, veuillez choisir le vôtre. IDE avec précaution, arrêtez d'utiliser un "éditeur de texte".
Bien que ce document soit conçu pour CSS, lors de l'utilisation de divers précompilateurs CSS (tels que less, sass, stylus, etc.), les parties applicables doivent également suivre autant que possible les conventions de ce document.
1 Style de code
1.1 Fichiers
[Recommandation] Utilisez l'encodage UTF-8 sans nomenclature pour les fichiers CSS.
Explication :
L'encodage UTF-8 a une plus grande adaptabilité. Les nomenclatures peuvent provoquer des interférences inutiles lors de l'utilisation de programmes ou d'outils pour traiter des fichiers.
1.2 Indentation
[Obligatoire] Utilisez 2 espaces comme niveau d'indentation, les caractères de tabulation ne sont pas autorisés.
Exemple :
.selector { margin: 0; padding: 0; }
1.3 Espace
[Obligatoire] Il doit y avoir un espace entre le sélecteur et {.
Exemple :
.selector { }
[Obligatoire] Aucun espace n'est autorisé entre le nom de l'attribut et ce qui suit :, et il doit y avoir des espaces entre : et la valeur de l'attribut.
Exemple :
margin: 0;
[Obligatoire] Lorsque la valeur de l'attribut de liste est écrite sur une seule ligne, le , doit être suivi d'un espace.
Exemple :
font-family: Arial, sans-serif;
Longueur de ligne de 1,4
[Obligatoire] Chaque ligne ne doit pas dépasser 120 caractères, sauf si une seule ligne est indivisible.
Explication :
Un scénario indivisible courant est celui où l'URL est trop longue.
[Recommandation] Pour les styles très longs, enveloppez la valeur du style dans un espace ou après , et il est recommandé de la regrouper logiquement.
Exemple :
/* 不同属性值按逻辑分组 */ background: transparent url(aVeryVeryVeryLongUrlIsPlacedHere) no-repeat 0 0; /* 可重复多次的属性,每次重复一行 */ background-image: url(aVeryVeryVeryLongUrlIsPlacedHere) url(anotherVeryVeryVeryLongUrlIsPlacedHere); /* 类似函数的属性值可以根据函数调用的缩进进行 */ background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0.04, rgb(88,94,124)), color-stop(0.52, rgb(115,123,162)) );
1.5 Sélecteur
[Obligatoire] Lorsqu'une règle contient plusieurs sélecteurs, chaque déclaration de sélecteur doit occuper sa propre ligne.
Exemple :
/* good */ .post, .page, .comment { line-height: 1.5; } /* bad */ .post, .page, .comment { line-height: 1.5; }
[Obligatoire] >, +, ~ Laisser un espace de part et d'autre du sélecteur.
Exemple :
/* good */ main > nav { padding: 10px; } label + input { margin-left: 5px; } input:checked ~ button { background-color: #69C; } /* bad */ main>nav { padding: 10px; } label+input { margin-left: 5px; } input:checked~button { background-color: #69C; }
[Obligatoire] Les valeurs dans les sélecteurs d'attributs doivent être entourées de guillemets doubles.
Explication :
Les guillemets simples ne sont pas autorisés, et aucun guillemet n'est autorisé.
Exemple :
/* good */ article[character="juliet"] { voice-family: "Vivien Leigh", victoria, female; } /* bad */ article[character='juliet'] { voice-family: "Vivien Leigh", victoria, female; }
1.6 Attributs
[Obligatoire] Plusieurs définitions d'attributs doivent figurer sur une nouvelle ligne.
Exemple :
/* good */ .selector { margin: 0; padding: 0; } /* bad */ .selector { margin: 0; padding: 0; }
[Obligatoire] La définition de l'attribut doit se terminer par un point-virgule.
Exemple :
/* good */ .selector { margin: 0; } /* bad */ .selector { margin: 0 }
2 Universel
2.1 Sélecteur
[Obligatoire] si non nécessaire, il n'est pas autorisé d'ajouter des sélecteurs de type pour limiter les sélecteurs d'identifiant et de classe.
Explication :
a un certain impact sur les performances et la maintenabilité.
Exemple :
/* good */ #error, .danger-message { font-color: #c00; } /* bad */ dialog#error, p.danger-message { font-color: #c00; }
[Recommandation] Le niveau d'imbrication des sélecteurs ne doit pas être supérieur à 4 niveaux, et les conditions de qualification situées plus loin doivent être les plus précises possibles.
Exemple :
/* good */ #username input {} .comment .avatar {} /* bad */ .page .header .login #username input {} .comment div * {}
2.2 Abréviation d'attribut
[Recommandation] Lorsque des abréviations peuvent être utilisées, essayez d'utiliser des abréviations d'attribut.
Exemple :
/* good */ .post { font: 12px/1.5 arial, sans-serif; } /* bad */ .post { font-family: arial, sans-serif; font-size: 12px; line-height: 1.5; }
[Recommandation] Lorsque vous utilisez des abréviations telles que border / margin / padding, vous devez faire attention à l'impact de la valeur implicite sur la valeur réelle et ne l'utiliser que lorsque vous avez vraiment besoin de définir des valeurs dans plusieurs directions d'abréviation.
Explication : les abréviations telles que
border / margin / padding définiront les valeurs de plusieurs propriétés en même temps, et il est facile de remplacer les paramètres qui n'ont pas besoin de l'être. être annulé. Si certaines directions doivent hériter des valeurs d'autres déclarations, elles doivent être définies séparément.
Exemple :
/* centering <article class="page"> horizontally and highlight featured ones */ article { margin: 5px; border: 1px solid #999; } /* good */ .page { margin-right: auto; margin-left: auto; } .featured { border-color: #69c; } /* bad */ .page { margin: 5px auto; /* introducing redundancy */ } .featured { border: 1px solid #69c; /* introducing redundancy */ }
2.3 Ordre d'écriture des attributs
[Recommandation] Lors de l'écriture d'attributs sous le même ensemble de règles, ils doivent être regroupés par fonction et formatés avec la méthode du modèle de formatage, emplacement) > Modèle de boîte (taille) > Typographique (lié au texte) > Ordre visuel (effets visuels) pour améliorer la lisibilité du code.
Explication :
Les propriétés liées au modèle de formatage incluent : position / haut / droite / bas / gauche / flotteur / affichage / débordement, etc.
Les propriétés liées au modèle de boîte incluent : border / margin / padding / width / height, etc.
Les propriétés typographiques incluent : font / line-height / text-align / word-wrap, etc.
Les propriétés visuelles incluent : arrière-plan / couleur / transition / style de liste, etc.
Les divers attributs associés incluent : opacité / décoration de texte / espace blanc / retour à la ligne, etc.
De plus, si le L'attribut content est inclus, il doit être placé au premier plan.
Exemple :
.sidebar { /* formatting model: positioning schemes / offsets / z-indexes / display / ... */ position: absolute; top: 50px; left: 0; overflow-x: hidden; display: block; /* box model: sizes / margins / paddings / borders / ... */ width: 200px; padding: 5px; border: 1px solid #ddd; /* typographic: font / aligns / text styles / ... */ font-size: 14px; line-height: 20px; /* visual: colors / shadows / gradients / ... */ background: #f5f5f5; color: #333; -webkit-transition: color 1s; -moz-transition: color 1s; transition: color 1s; /* Misc */ opacity: 1; text-decoration: none; white-space: nowrap; word-wrap: normal; cursor: pointer; }
2.4 Effacer les flotteurs
[Suggestion] Lorsqu'un élément doit être élevé pour contenir des éléments flottants internes, utiliser le pseudo Clearfix est effectué en définissant clairement en classe ou en déclenchant BFC. Essayez de ne pas ajouter de balises vides.
Explication :
Il existe de nombreuses façons de déclencher le BFC, les plus courantes sont :
float 非 none position 非 static overflow 非 visible
Si vous souhaitez utiliser une méthode de compensation flottante avec des effets secondaires plus faibles, voir Un nouveau micro clearfix hack article.
Notez également que les éléments qui ont déjà déclenché BFC n'ont pas besoin d'être effacés.
Exemple :
<div class="fn-clear"> <div class="fn-left"></div> <div class="fn-left"></div> </div>
2.5 !important
[Recommandation] Essayez de ne pas utiliser l'instruction !important.
[Recommandation] Lorsque vous devez forcer le style spécifié et n'autoriser aucun remplacement de scène, définissez le style via la balise en ligne et !important.
Explication :
Il convient de noter que le style !important en ligne ne doit être utilisé que si la conception ne permet à aucun autre scénario de remplacer le style. Ce schéma est généralement utilisé dans les applications dans des environnements tiers. La section z-index ci-dessous est un exemple typique de l'un de ces scénarios spéciaux.
2.6 z-index
[建议] 将 z-index 进行分层,对文档流外绝对定位元素的视觉层级关系进行管理。
解释:
同层的多个元素,如多个由用户输入触发的 Dialog,在该层级内使用相同的 z-index 或递增 z-index。
建议每层包含100个 z-index 来容纳足够的元素,如果每层元素较多,可以调整这个数值。
[建议] 在可控环境下,期望显示在最上层的元素,z-index 指定为 9999。
解释:
可控环境分成两种,一种是自身产品线环境;还有一种是可能会被其他产品线引用,但是不会被外部第三方的产品引用。
不建议取值为 2147483647。以便于自身产品线被其他产品线引用时,当遇到层级覆盖冲突的情况,留出向上调整的空间。
[建议] 在第三方环境下,期望显示在最上层的元素,通过标签内联和 !important,将 z-index 指定为 2147483647。
解释:
第三方环境对于开发者来说完全不可控。在第三方环境下的元素,为了保证元素不被其页面其他样式定义覆盖,需要采用此做法。
3 值与单位
3.1 文本
[强制] 文本内容必须用双引号包围。
解释:
文本类型的内容可能在选择器、属性值等内容中。
示例:
/* good */ html[lang|="zh"] q:before { font-family: "Microsoft YaHei", sans-serif; content: "“"; } html[lang|="zh"] q:after { font-family: "Microsoft YaHei", sans-serif; content: "”"; } /* bad */ html[lang|=zh] q:before { font-family: 'Microsoft YaHei', sans-serif; content: '“'; } html[lang|=zh] q:after { font-family: "Microsoft YaHei", sans-serif; content: "”"; }
3.2 数值
[强制] 当数值为 0 - 1 之间的小数时,省略整数部分的 0。
示例:
/* good */ panel { opacity: .8 } /* bad */ panel { opacity: 0.8 }
3.3 url()
[强制] url() 函数中的路径不加引号。
示例:
/* good */ body { background: url(bg.png); } /* bad */ body { background: url("bg.png"); }
[强制] url() 函数中的绝对路径可省去协议名。
示例:
body { background: url(//w.zuzuche.com/img/bg.png) no-repeat 0 0; }
3.4 长度
[强制] 长度为 0 时须省略单位。 (也只有长度单位可省)
示例:
/* good */ body { padding: 0 5px; } /* bad */ body { padding: 0px 5px; }
3.5 颜色
[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb。不允许使用 rgb()。
解释:
带有alpha的颜色信息可以使用 rgba()。使用 rgba() 时每个逗号后必须保留一个空格。
示例:
/* good */ .success { box-shadow: 0 0 2px rgba(0, 128, 0, .3); border-color: #008000; } /* bad */ .success { box-shadow: 0 0 2px rgba(0,128,0,.3); border-color: rgb(0, 128, 0); }
[强制] 颜色值可以缩写时,必须使用缩写形式。
示例:
/* good */ .success { background-color: #aca; } /* bad */ .success { background-color: #aaccaa; }
[强制] 颜色值不允许使用命名色值。
示例:
/* good */ .success { color: #90ee90; } /* bad */ .success { color: lightgreen; }
[建议] 颜色值中的英文字符采用小写。如不用小写也需要保证同一项目内保持大小写一致。
示例:
/* good */ .success { background-color: #aca; color: #90ee90; } /* good */ .success { background-color: #ACA; color: #90EE90; } /* bad */ .success { background-color: #ACA; color: #90ee90; }
3.6 2D 位置
[强制] 必须同时给出水平和垂直方向的位置。
解释:
2D 位置初始值为 0% 0%,但在只有一个方向的值时,另一个方向的值会被解析为 center。为避免理解上的困扰,应同时给出两个方向的值。background-position属性值的定义
示例:
/* good */ body { background-position: center top; /* 50% 0% */ } /* bad */ body { background-position: top; /* 50% 0% */ }
4 文本编排
4.1 字体族
[强制] font-family 属性中的字体族名称应使用字体的英文 Family Name,其中如有空格,须放置在引号中。
解释:
所谓英文 Family Name,为字体文件的一个元数据,常见名称如下:
字体操作系统Family Name 宋体 (中易宋体)WindowsSimSun 黑体 (中易黑体)WindowsSimHei 微软雅黑WindowsMicrosoft YaHei 微软正黑WindowsMicrosoft JhengHei 华文黑体Mac/iOSSTHeiti 冬青黑体Mac/iOSHiragino Sans GB 文泉驿正黑LinuxWenQuanYi Zen Hei 文泉驿微米黑LinuxWenQuanYi Micro Hei
示例:
h1 { font-family: "Microsoft YaHei"; }
[强制] font-family 按「西文字体在前、中文字体在后」、「效果佳 (质量高/更能满足需求) 的字体在前、效果一般的字体在后」的顺序编写,最后必须指定一个通用字体族( serif / sans-serif )。
解释:
更详细说明可参考本文。
示例:
/* Display according to platform */ .article { font-family: Arial, sans-serif; } /* Specific for most platforms */ h1 { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "WenQuanYi Micro Hei", "Microsoft YaHei", sans-serif; }
[强制] font-family 不区分大小写,但在同一个项目中,同样的 Family Name 大小写必须统一。
示例:
/* good */ body { font-family: Arial, sans-serif; } h1 { font-family: Arial, "Microsoft YaHei", sans-serif; } /* bad */ body { font-family: arial, sans-serif; } h1 { font-family: Arial, "Microsoft YaHei", sans-serif; }
4.2 字号
[强制] 需要在 Windows 平台显示的中文内容,其字号应不小于 12px。
解释:
由于 Windows 的字体渲染机制,小于 12px 的文字显示效果极差、难以辨认。
4.3 字体风格
[建议] 需要在 Windows 平台显示的中文内容,不要使用除 normal 外的 font-style。其他平台也应慎用。
解释:
由于中文字体没有 italic 风格的实现,所有浏览器下都会 fallback 到 obilique 实现 (自动拟合为斜体),小字号下 (特别是 Windows 下会在小字号下使用点阵字体的情况下) 显示效果差,造成阅读困难。
4.4 字重
[强制] font-weight 属性必须使用数值方式描述。
解释:
CSS 的字重分 100 – 900 共九档,但目前受字体本身质量和浏览器的限制,实际上支持 400 和 700 两档,分别等价于关键词 normal 和 bold。
浏览器本身使用一系列启发式规则来进行匹配,在 <700 时一般匹配字体的 Regular 字重,>=700 时匹配 Bold 字重。
但已有浏览器开始支持 =600 时匹配 Semibold 字重 (见此表),故使用数值描述增加了灵活性,也更简短。
示例:
/* good */ h1 { font-weight: 700; } /* bad */ h1 { font-weight: bold; }
4.5 行高
[建议] line-height 在定义文本段落时,应使用数值。
解释:
将 line-height 设置为数值,浏览器会基于当前元素设置的 font-size 进行再次计算。在不同字号的文本段落组合中,能达到较为舒适的行间间隔效果,避免在每个设置了 font-size 都需要设置 line-height。
当 line-height 用于控制垂直居中时,还是应该设置成与容器高度一致。
示例:
.container { line-height: 1.5; }
5 变换与动画
[强制] 使用 transition 时应指定 transition-property。
示例:
/* good */ .box { transition: color 1s, border-color 1s; } /* bad */ .box { transition: all 1s; }
[建议] 尽可能在浏览器能高效实现的属性上添加过渡和动画。
解释:
见本文,在可能的情况下应选择这样四种变换:
transform: translate(npx, npx); transform: scale(n); transform: rotate(ndeg); opacity: 0..1;
典型的,可以使用 translate 来代替 left 作为动画属性。
示例:
/* good */ .box { transition: transform 1s; } .box:hover { transform: translate(20px); /* move right for 20px */ } /* bad */ .box { left: 0; transition: left 1s; } .box:hover { left: 20px; /* move right for 20px */ }
6 响应式
[强制] Media Query 不得单独编排,必须与相关的规则一起定义。
示例:
/* Good */ /* header styles */ @media (...) { /* header styles */ } /* main styles */ @media (...) { /* main styles */ } /* footer styles */ @media (...) { /* footer styles */ } /* Bad */ /* header styles */ /* main styles */ /* footer styles */ @media (...) { /* header styles */ /* main styles */ /* footer styles */ }
[强制] Media Query 如果有多个逗号分隔的条件时,应将每个条件放在单独一行中。
示例:
@media (-webkit-min-device-pixel-ratio: 2), /* Webkit-based browsers */ (min--moz-device-pixel-ratio: 2), /* Older Firefox browsers (prior to Firefox 16) */ (min-resolution: 2dppx), /* The standard way */ (min-resolution: 192dpi) { /* dppx fallback */ /* Retina-specific stuff here */ }
[建议] 尽可能给出在高分辨率设备 (Retina) 下效果更佳的样式。
7 兼容性
7.1 属性前缀
[建议] 带私有前缀的属性由长到短排列,按冒号位置对齐。
解释:
标准属性放在最后,按冒号对齐方便阅读,也便于在编辑器内进行多行编辑。
在 Sublime Text 2 中, 使用 Selection → Add Previous Line (⌃⇧↑) 和 Selection → Add Next Line (⌃⇧↓)。
示例:
.box { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
7.2 Hack
[建议] 需要添加 hack 时应尽可能考虑是否可以采用其他方式解决。
解释:
如果能通过合理的 HTML 结构或使用其他的 CSS 定义达到理想的样式,则不应该使用 hack 手段解决问题。通常 hack 会导致维护成本的增加。
[建议] 尽量使用 选择器 hack 处理兼容性,而非 属性 hack。
解释:
尽量使用符合 CSS 语法的 selector hack,可以避免一些第三方库无法识别 hack 语法的问题。
示例:
/* IE 7 */ *:first-child + html #header { margin-top: 3px; padding: 5px; } /* IE 6 */ * html #header { margin-top: 5px; padding: 4px; }
[建议] 尽量使用简单的 属性 hack。
示例:
.box { _display: inline; /* fix double margin */ float: left; margin-left: 20px; } .container { overflow: hidden; *zoom: 1; /* triggering hasLayout */ }
7.3 Expression
[强制] 禁止使用 Expression。
7.4 @import
[强制] 禁止使用 @import。
解释:与 相比, @import 更慢,需要额外的页面请求,并且可能引发其他的意想不到的问题。应该避免使用他们,而选择其他的方案:
● 使用多个 元素
● 使用 CSS 预处理器例如 Sass 或 Less 将样式编译到一个文件中
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!