Manual:Coding conventions/CSS/zh

本页面记述了MediaWiki代码库中CSS和LESS样式表的代码编写约定.

检查
我们使用stylelint作为我们的代码质量工具，并为维基媒体定制配置（stylelint-config-wikimedia）. 你可以使用节点模块 来检查你的CSS和LESS，MediaWiki和大多数扩展将其作为的一部分运行. MediaWiki核心的设置可在 找到.

命名
用同样的方式命名Class：所有单词小写，用连接号分隔. 在MediaWiki核心中，用 前缀避免与用户在维基文本模板、章节标题、小工具以及其他软件库中添加的Class和Id冲突. 尽量使用Class，避免引入Id.

一些示例：

注意，单词用连接号分隔，是为了简化非英语母语者的代码可读性，并为依赖像屏幕阅读器之类辅助技术的程序员提供更好的体验. 是一个过去的Class名，可追溯到上述建议之前，因此它将是.

在扩展和皮肤中，使用或前缀.

一些示例：



构造Class名
当在代码中动态构造Class时，确保在上面放一个注释，列出所有可能的Class. 参见手册:代码编写约定#动态标识符. 例如：

优先级
尽量提供低优先级选择器，最好是单个Class的选择器. 这简化了他们在如某些扩展或用户脚本的特定上下文中重写他们的过程.

空格
这样添加空格：


 * 每个选择器后换行.
 * 每个属性声明后换行.
 * （最后一行）选择器与CSS声明块的大括号之间添加一个空格.
 * 用制表符缩进每个属性声明.
 * 冒号（ ）前不添加空格.
 * 冒号和值之间添加一个空格.
 * 在多个值的属性中，逗号（ ）后添加一个空格.
 * 在选择器（如 ）和属性（如 ）中，左括号（( ）后与右括号（ )）前添加一个空格.
 * 每行声明（包括最后一行）后的分号（ ）后换行.
 * 右大括号不缩进.
 * 和注释应放在他们单独的行上，所针对的CSS声明上方.
 * 两个CSS规则集之间空一行.

引号
维基媒体使用单引号表示引用的值. 例如CSS属性 中的值和属性选择器中的值.

声明的 参数中不必要引号. 这可能导致问题的唯一情况是路径中出现未转义的右括号，在这种情况下，你应该对这些字符进行URL转义.



颜色属性值
CSS3支持许多不同类型的CSS属性颜色值，如 、 、 等. 为了一致性和兼容性，只使用以下三种：


 * 十六进制颜色值，如 和 . (使用小写字母以获得更好的gzip压缩！ 尽量使用简略标记. )
 * 如果需要alpha透明度，使用 值，如 . (注意：IE8不支持 ，所以通常在这之前提供一个使用十六进制颜色值作为回退的匹配声明. )
 * 颜色关键词. (注意：IE8只支持 和 .  它渲染的 是黑色的. )

为了一致性和优化文件压缩，建议所有值都小写. 参见讨论页章节.

避免其他颜色值（包括颜色名/关键字——在使用 、 、 和 符号时考虑i18n）. 还要确保你的前景和背景（包括背景渐变和退色）的色彩对比度符合WCAG 2.0 AA级，最好是AAA级.

在MDN网络文档中阅读更多内容.



大小单位
维基媒体基金会旨在支持多样化的受众和广泛的技术与用例. 一个非常流行的可访问性用户设置是增加浏览器默认字体大小，同时为普通用户提供最佳设计. 它还减少了 计算的负担和将开发人员的可预测性降到最低. 对所有不直接影响阅读或理解的用户界面元素使用. 主要是 、 ，图标大小的 或.



变量命名
CSS and LESS variables are set to follow a naming logic, going from repeating property to application usage to possible modifier or in short. Variables are generally used for one property, like, there are very few variables that are able to be used in different contexts. For example size variables.

It's simpler, specifically in big projects with many CSS/LESS files to have single usage variables, even though that might result in a larger variables definition file. See archived discussion for problem description. It's also more fail-safe when the variable contents get changed (think of  versus   applications).

CSS变量示例：

LESS变量示例：

Vendor prefixes
Always put the standardised versions of CSS properties after vendor-prefixed versions. It is important for avoiding bugs in old implementation, like in the following example of. See also https://css-tricks.com/ordering-css3-properties/.

 Right, and including annotation: 

.client-js and .client-nojs
MediaWiki outputs class  on the  element on every page. At runtime, JavaScript code replaces this with class. Hence you can use this class in your selector to conditionally show, hide, or customise certain elements depending on whether the browser has JavaScript enabled and is supported by. Note that for this to be useful, the stylesheet in question must be loaded with, not  (see )

Anti-patterns
Anti-patterns are mostly covered by use of central 'stylelint-config-wikimedia' already. Please also see the inline comments on master. Beyond there are some special properties/functionalities that deserve further explanation.

Don't rely on px unit based values
This is not a general rule, but it is general for a few properties. When a user increases their default font size preferences in a browser due to addressing visual impairments, a widely used accessibility feature, all sizes defined in  are not scaled. In order to let users scale text with this setting, rely on relative sizes like  or , specifically on properties that would result in non-scalable text like font-size or line-height or would overflow and be hidden, often with certain width or height limitations.

z-index
Avoid using  when possible. Instead, try to use the natural stacking order in the DOM.

When use of z-index is required, please use the appropriate Codex design token.

!important
Avoid using  (except for working around upstream code running on the same page that also uses , because only   can override  ).

In most cases you don't need it at all. In other cases it may be the result of a bug elsewhere in the program. In general, to override a rule you use the same selector as the original style rule. Since CSS cascades, this works naturally (styles applied later override styles applied earlier, selectors don't need to be of higher specificity).

If the overriding styles apply before the original styles, the styles got loaded in the wrong order. That should be addressed, but you may resort to workarounds to artificially increase the specificity:


 * Repeat the same selector to increase weight, like.
 * Add or repeat attribute selectors, like.
 * Use default elements as ancestor selector (e.g.,  ).

Add however many points you need. It will still allow multiple stylesheets to use the same technique and each express their specificity. Better than adding in ancestors classes not related to your code. ( And more maintainable as they won't change. )

LESS
Starting with, there is native support in for using LESS (with file extension  ) in place of CSS. Most of the LESS syntax can be formatted using the CSS conventions:


 * Indent nested blocks with 1 tab (same as for indenting declarations inside CSS rules).
 * Don't space-align declarations values inside mixins (same as for CSS rules).
 * No spaces on the outside of the parameter lists in function invocations, mixin uses and mixin definitions (same as for  in CSS).
 * No quotes around parameter values (same as for  in CSS).

Example:

There's a few new concepts that don't map to CSS conventions, outlined below.

Structure

 * Separate nested CSS rules from the parent declarations by 1 empty line.
 * tags must be on the line immediately above the declaration, as shown in the example above.

Import of LESS/CSS files

 * The filename of an import statement has to include the  file extension.
 * If the extension was omitted, in a folder with 'foo.css' and 'foo.less' LESS would import the latter.
 * If the code is ever used outside MediaWiki context, for example in Webpack as part of storybook, it will throw an error as it will assume it is a package with an index.css or index.js file meaning the code cannot be used.
 * Use  to load mixins and variables so that they may be used by the current LESS stylesheet; these are processed synchronously by LESS and will not be present in the generated CSS output. Load mixins first, variables second. Mixins should be free of variable values and parameters in mixin calls provide values with variables.
 * Don't use  to bundle stylesheets that are related to one another only conceptually; instead, reference the set of files in the   array of a ResourceLoader module.
 * Don't use  to import CSS files in LESS files, as the LESS parser will create an invalid import statement based on the physical location of the CSS file. Use   instead.

Troubleshooting import
If your LESS  doesn't work please check:


 * Does your code contain ? See this question on Stack Overflow about how to use @font-face with LESS.

Mixins
Mixin names should use hyphen-case, just like CSS class names, property keys and variable names.

They should be prefixed with  to avoid confusing developers who are familiar with CSS, but not LESS and distinguish them from classes, the syntax for which is similar.

As mentioned above, no spaces on the outside of the parameter list and avoid quoting values.

If you need to call a mixin with one or more arguments that contain a comma use a semicolon  in LESS to separate the arguments. This allows you to use commas in the literal value.

Built-in mixins
is a LESS library maintained as part of MediaWiki that is automatically available to any LESS stylesheet in MediaWiki. It can be imported from any LESS stylesheet in core, skins, and extensions.

Since, the built-in mixins contain utilities for using CSS Flexbox. Support is present all browsers that implemented at least one of the specs, including Internet Explorer 10. You need to specify your own fallback for older browsers, e.g. you can use floats for a more basic experience. Mixins available:

Example usage: