├── .gitignore
├── README.md
├── _config.yml
├── _includes
├── css
│ ├── class-names.css
│ ├── comments.css
│ ├── declaration-order.css
│ ├── import.html
│ ├── media-queries.css
│ ├── nesting.scss
│ ├── organization-comments.css
│ ├── organization-files.txt
│ ├── prefixed-properties.css
│ ├── selectors.css
│ ├── shorthand.css
│ ├── single-declarations.css
│ └── syntax.css
├── footer.html
├── header.html
├── html
│ ├── attribute-order.html
│ ├── boolean-attributes.html
│ ├── doctype.html
│ ├── encoding.html
│ ├── ie-compatibility-mode.html
│ ├── lang.html
│ ├── naming.html
│ ├── reducing-markup.html
│ ├── style-script.html
│ └── syntax.html
├── js.html
├── syntax.css
└── tweet-button.html
├── _layouts
├── default.html
└── post.html
├── code-guide.css
├── font
├── fontello.eot
├── fontello.svg
├── fontello.ttf
└── fontello.woff
└── index.html
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore docs files
2 | _gh_pages
3 | _site
4 | .ruby-version
5 |
6 | # Numerous always-ignore extensions
7 | *.diff
8 | *.err
9 | *.orig
10 | *.log
11 | *.rej
12 | *.swo
13 | *.swp
14 | *.zip
15 | *.vi
16 | *~
17 |
18 | # OS or Editor folders
19 | .DS_Store
20 | ._*
21 | Thumbs.db
22 | .cache
23 | .project
24 | .settings
25 | .tmproj
26 | *.esproj
27 | nbproject
28 | *.sublime-project
29 | *.sublime-workspace
30 | .idea
31 |
32 | # Komodo
33 | *.komodoproject
34 | .komodotools
35 |
36 | # grunt-html-validation
37 | validation-status.json
38 | validation-report.json
39 |
40 | # Folders to ignore
41 | node_modules
42 | bower_components
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Code Guide
2 |
3 | Code Guide is a project for documenting standards for developing flexible, durable, and sustainable HTML and CSS. It comes from years of experience writing code on projects of all sizes. It's not the end-all be-all, but it's a start.
4 |
5 | **[Start reading ☞](http://mdo.github.io/code-guide)**
6 |
7 | ---
8 |
9 | ### License
10 |
11 | Released under MIT by, and copyright 2014, @mdo.
12 |
13 | ### Thanks
14 |
15 | Heavily inspired by [Idiomatic CSS](https://github.com/necolas/idiomatic-css) and the [GitHub Styleguide](http://github.com/styleguide).
16 |
17 | ### Translations
18 |
19 | Translations are maintained by their creators and may not always be up to date with the original here.
20 |
21 | - [Portuguese](http://diegoeis.github.io/code-guide/) - Translated by [Diego Eis](http://tableless.com.br/)
22 | - [Spanish](http://adrianayala.mx/code-guide/es/) - Translated by [Adrian Ayala](http://adrianayala.mx/)
23 | - [Indonesian](http://diagramatics.github.io/code-guide-id) - Translated by [Steven Sinatra](http://diagramatics.me)
24 | - [Chinese](http://zoomzhao.github.io/code-guide/) - Translated by [Zoom Zhao](https://github.com/ZoomZhao)
25 | - [Italian](http://alessandro1997.github.io/code-guide/) - Translated by [Alessandro Desantis](https://github.com/alessandro1997)
26 | - [Russian](http://sadcitizen.github.io/code-guide/) - Translated by [Eugene Abrosimov](https://github.com/sadcitizen)
27 |
28 | Have a translation you'd like to link to? Open a pull request to add it.
29 |
30 | <3
31 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | name: Руководство по написанию кода от @mdo
2 | description: Стандарты для разработки гибкого, надежного и поддерживаемого кода на HTML и CSS.
3 | url: http://mdo.github.com/code-guide
4 |
5 | markdown: rdiscount
6 | permalink: pretty
7 | pygments: true
8 |
--------------------------------------------------------------------------------
/_includes/css/class-names.css:
--------------------------------------------------------------------------------
1 | /* Плохой пример */
2 | .t { ... }
3 | .red { ... }
4 | .header { ... }
5 |
6 | /* Хороший пример */
7 | .tweet { ... }
8 | .important { ... }
9 | .tweet-header { ... }
10 |
--------------------------------------------------------------------------------
/_includes/css/comments.css:
--------------------------------------------------------------------------------
1 | /* Плохой пример */
2 | /* Modal header */
3 | .modal-header {
4 | ...
5 | }
6 |
7 | /* Хороший пример */
8 | /* Обертывающий элемент для .modal-title и .modal-close */
9 | .modal-header {
10 | ...
11 | }
12 |
--------------------------------------------------------------------------------
/_includes/css/declaration-order.css:
--------------------------------------------------------------------------------
1 | .declaration-order {
2 | /* Позиционирование */
3 | position: absolute;
4 | top: 0;
5 | right: 0;
6 | bottom: 0;
7 | left: 0;
8 | z-index: 100;
9 |
10 | /* Блочная модель */
11 | display: block;
12 | float: right;
13 | width: 100px;
14 | height: 100px;
15 |
16 | /* Типографика */
17 | font: normal 13px "Helvetica Neue", sans-serif;
18 | line-height: 1.5;
19 | color: #333;
20 | text-align: center;
21 |
22 | /* Отображение */
23 | background-color: #f5f5f5;
24 | border: 1px solid #e5e5e5;
25 | border-radius: 3px;
26 |
27 | /* Прочее */
28 | opacity: 1;
29 | }
30 |
--------------------------------------------------------------------------------
/_includes/css/import.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/_includes/css/media-queries.css:
--------------------------------------------------------------------------------
1 | .element { ... }
2 | .element-avatar { ... }
3 | .element-selected { ... }
4 |
5 | @media (min-width: 480px) {
6 | .element { ...}
7 | .element-avatar { ... }
8 | .element-selected { ... }
9 | }
10 |
--------------------------------------------------------------------------------
/_includes/css/nesting.scss:
--------------------------------------------------------------------------------
1 | // Без вложенности
2 | .table > thead > tr > th { … }
3 | .table > thead > tr > td { … }
4 |
5 | // С вложенностью
6 | .table > thead > tr {
7 | > th { … }
8 | > td { … }
9 | }
10 |
--------------------------------------------------------------------------------
/_includes/css/organization-comments.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Заголовок раздела для компонента
3 | */
4 |
5 | .element { ... }
6 |
7 |
8 | /*
9 | * Заголовок раздела для компонента
10 | *
11 | * Иногда возникает необходимость включения дополнительного контекста для всего компонента. Сделайте это в этом месте, если это достаточно важно.
12 | */
13 |
14 | .element { ... }
15 |
16 | /* Контекстный под-компонент или модификатор */
17 | .element-heading { ... }
18 |
--------------------------------------------------------------------------------
/_includes/css/organization-files.txt:
--------------------------------------------------------------------------------
1 | stylesheets/
2 | ├── normalize.css
3 | ├── buttons.css
4 | ├── forms.css
5 | ├── grid.css
6 | ├── header.css
7 | ├── footer.css
8 | ├── pagination.css
9 | └── input-group.css
10 |
--------------------------------------------------------------------------------
/_includes/css/prefixed-properties.css:
--------------------------------------------------------------------------------
1 | /* Свойства с префиксами */
2 | .selector {
3 | -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
4 | box-shadow: 0 1px 2px rgba(0,0,0,.15);
5 | }
6 |
--------------------------------------------------------------------------------
/_includes/css/selectors.css:
--------------------------------------------------------------------------------
1 | /* Плохой пример */
2 | span { ... }
3 | .page-container #stream .stream-item .tweet .tweet-header .username { ... }
4 | .avatar { ... }
5 |
6 | /* Хороший пример */
7 | .avatar { ... }
8 | .tweet-header .username { ... }
9 | .tweet .avatar { ... }
10 |
--------------------------------------------------------------------------------
/_includes/css/shorthand.css:
--------------------------------------------------------------------------------
1 | /* Плохой пример */
2 | .element {
3 | margin: 0 0 10px;
4 | background: red;
5 | background: url("image.jpg");
6 | border-radius: 3px 3px 0 0;
7 | }
8 |
9 | /* Хороший пример */
10 | .element {
11 | margin-bottom: 10px;
12 | background-color: red;
13 | background-image: url("image.jpg");
14 | border-top-left-radius: 3px;
15 | border-top-right-radius: 3px;
16 | }
17 |
--------------------------------------------------------------------------------
/_includes/css/single-declarations.css:
--------------------------------------------------------------------------------
1 | /* Одиночные объявления в одну строчку */
2 | .span1 { width: 60px; }
3 | .span2 { width: 140px; }
4 | .span3 { width: 220px; }
5 |
6 | /* Несколько объявлений, по одному на каждую строчку */
7 | .sprite {
8 | display: inline-block;
9 | width: 16px;
10 | height: 15px;
11 | background-image: url(../img/sprite.png);
12 | }
13 | .icon { background-position: 0 0; }
14 | .icon-home { background-position: 0 -20px; }
15 | .icon-account { background-position: 0 -40px; }
16 |
--------------------------------------------------------------------------------
/_includes/css/syntax.css:
--------------------------------------------------------------------------------
1 | /* Плохой CSS */
2 | .selector, .selector-secondary, .selector[type=text] {
3 | padding:15px;
4 | margin:0px 0px 15px;
5 | background-color:rgba(0, 0, 0, 0.5);
6 | box-shadow:0 1px 2px #CCC,inset 0 1px 0 #FFFFFF
7 | }
8 |
9 | /* Хороший CSS */
10 | .selector,
11 | .selector-secondary,
12 | .selector[type="text"] {
13 | padding: 15px;
14 | margin: 0 0 15px;
15 | background-color: rgba(0,0,0,.5);
16 | box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
17 | }
18 |
--------------------------------------------------------------------------------
/_includes/footer.html:
--------------------------------------------------------------------------------
1 |
23 |
--------------------------------------------------------------------------------
/_includes/header.html:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/_includes/html/boolean-attributes.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
--------------------------------------------------------------------------------
/_includes/html/doctype.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Строго соблюдайте предложенные здесь или свои собственные соглашения. Если вы нашли ошибку, будь она большая или маленькая, сразу сообщите об этом. Если у вас есть что дополнить или вы хотите принять участие в разработке этих соглашений, пожалуйста, создайте issue на GitHub.
50 |53 |55 |Каждая строка кода должна казаться написанной только одним человеком, вне зависимости от количества разработчиков.
54 |
</li>
или </body>
).Укажите в начале каждой вашей HTML-страницы этот тип документа. Это заставит браузер работать в режиме соответствия стандартам, что обеспечит единообразное отображение ваших страниц в разных браузерах.
84 |Из спецификации HTML5:
94 |95 |97 |Для указания языка документа авторам рекомендуется прописывать атрибут языка в корневом элементе html. Это поможет инструментам синтеза речи определить какое произношение использовать, а инструментам перевода - какие правила, и так далее.
96 |
Подробнее познакомиться с атрибутом lang
можно в спецификации.
Список кодов различных языков на Sitepoint.
99 |IE поддерживает использование специального <meta>
-тега, который указывает в режиме совместимости с какой версией IE следует отрендерить страницу. Если обстоятельства не требуют какой-то специальной версии IE, то самым правильным будет заставить браузер использовать режим самой последней версии (edge mode).
Для получения дополнительной информации следует познакомиться со статьей на Stack Overflow.
110 |Явно объявив кодировку символов, вы быстро и легко обеспечите правильное отображение вашего контента. При этом, вы сможете избежать использования символьных сущностей в вашем HTML-коде, при условии, что их кодировка совпадает с кодировкой документа (как правило, UTF-8).
120 |Согласно спецификации HTML5, при подключении CSS и JavaScript файлов не требуется указание атрибута type
, так как text/css
и text/javascript
являются значениями по умолчанию.
Старайтесь соблюдать стандарты HTML и семантику, но не за счет практичности. Используйте меньшее количество разметки с наименьшим числом тонкостей, когда это возможно.
146 |Для удобства чтения HTML-атрибуты должны быть указаны именно в этом порядке:
153 |class
id
, name
data-*
src
, for
, type
, href
title
, alt
aria-*
, role
Классы создают для многократно используемых компонентов верстки, поэтому они идут первыми. Идентификаторы более специфичны и должны использоваться умеренно (например, для закладок на странице), поэтому они следуют вторыми.
162 |Логические атрибуты одни из тех, которые не требуют объявленного значения. XHTML требует от вас задать значение, но в HTML5 нет такого требования.
172 |За подробной информацией обратимся к разделу о логических атрибутах на WhatWG:
173 |174 |176 |Наличие логического атрибута у элемента говорит об истинном его значении, а отсутствие атрибута — о ложном.
175 |
Если вы должны указать значение атрибута, но вам это не нужно, следуйте этой рекомендации от WhatWG:
177 |178 |180 |Если атрибут присутствует, его значение должно быть либо пустой строкой или [...] каноническим именем атрибута без начальных или конечных пробелов.
179 |
Если коротко, то не указывайте значение логическому атрибуту.
181 |Всякий раз, когда это возможно, избегайте лишних родительских элементов. Во многих случаях это требует повторения и рефакторинга, но позволяет создать меньшее количество разметки. Посмотрите на следующий пример:
191 |Создание разметки с помощью JavaScript делает ее менее производительной, сложной для поиска и редактирования. По возможности избегайте этого.
201 |:
для каждого объявления.box-shadow
).rgb()
, rgba()
, hsl()
, hsla()
, или rect()
. Это помогает различать различные цветовые значения (запятая без пробела) от нескольких значений одного свойства (запятая с пробелом)..5
вместо 0.5
).#fff
. Строчные буквы гораздо легче различить при просмотре файла, поскольку они, как правило, имеют больше уникальных форм.#fff
вместо #ffffff
.input[type="text"]
. В некоторых случаях это делать необязательно, но это является хорошей практикой для поддержки согласованности.margin: 0;
вместо margin: 0px;
.Есть вопросы по перечисленным соглашениям? Ознакомьтесь с разделом о синтаксисе статьи о каскадных таблицах стилей на Википедии.
230 |Объявления логически связанных свойств должны быть сгруппированы в следующем порядке:
240 |Позиционирование следует первым потому, что оно может удалить элемент из нормального потока документа и переопределить блочную модель связанных стилей. Блочная модель идет следующей, так как она диктует размеры и расположение компонента.
247 |Все остальные объявления, выполняющиеся внутри компонента или не оказывающие влияния на предыдущие два раздела, следуют в последнюю очередь.
248 |Для ознакомления с полным списком свойств и их порядком обратитесь к Recess.
249 |@import
По сравнению с тегом <link>
правило @import
медленнее, создает дополнительные запросы и может вызвать иные непредвиденные проблемы. Избегайте это правило и используйте вместо него один из альтернативных подходов:
<link>
Для получения дополнительной информации следует познакомиться со статьей Стива Соудерса.
265 |Помещайте media queries настолько близко к соответствующим наборам правил, насколько это возможно. Не объединяйте их в отдельную таблицу стилей. Не помещайте их в конце файла. В противном случае это приведет к тому, что media queries будут не замечены в будущем. Вот типичная структура:
275 |Когда вы используете свойства с префиксами вендоров, оставляйте отступы для каждого свойства так, чтобы значения объявлений выстраивались в вертикальную линию. Это упрощает многострочное редактирование.
285 |В Textmate используйте Text → Edit Each Line in Selection (⌃⌘A). В Sublime Text 2, используйте Selection → Add Previous Line (⌃⇧↑) и Selection → Add Next Line (⌃⇧↓).
286 |В случаях, когда набор правил включает в себя только одно объявление, рекомендуется удалить переносы строк для удобства чтения и редактирования. Любой набор правил с несколькими объявлениями должен быть разделен на отдельные строки.
296 |Ключевым фактором здесь является обнаружение ошибок — например, валидатор CSS сообщает вам, что в строке 183 есть синтаксическая ошибка. С одиночным объявлением не возникнет сложности с исправлением. В случае с несколькими объявлениями, разделенными на строки, так же проблем не возникнет. Но если несколько объявлений будут записаны в одну строку, то вам будет сложнее понять какое именно объявление вызвало синтаксическую ошибку.
297 |Старайтесь ограничить использование сокращенных объявлений в тех случаях, когда необходимо явно задать все доступные значения. Наиболее часто злоупотребляют сокращением следующих свойств:
307 |padding
margin
font
background
border
border-radius
Часто нам не нужно устанавливать все значения сокращенной записи свойства. Например, HTML заголовки устанавливают только отступы сверху и снизу, таким образом, в случае необходимости нужно переопределить только эти два значения. Чрезмерное использование сокращенной записи свойств часто приводит к грязному коду с ненужными переопределения и непреднамеренными побочными эффектами.
316 |На сайте Mozilla Developer Network есть отличная статья о сокращенной записи свойств для тех кто не знаком с такой формой записи.
317 |Избегайте излишнюю вложенность. То, что вы можете ее использовать, не означает, что вы всегда должны это делать. Применяйте вложенность только если вам нужно сократить область видимости стилей до родительского элемента, а также при наличии нескольких элементов, которые должны быть вложены.
327 |Код написан и поддерживается людьми. Убедитесь, что ваш код является описательным, хорошо прокомментирован и доступным (понятным) для других. Хорошие комментарии к коду передают контекст и цель кода, а не просто повторяют название класса или компонента.
337 |Обязательно пишите законченные предложения для больших комментариев и короткие фразы для общих замечаний.
338 |.btn
и .btn-danger
)..btn
подойдет для button, но .s
не означает ничего..js-*
для обозначения поведения (в отличие от стиля), но не используйте эти классы в вашем CSS.Также будет полезно использовать многие из приведенных рекомендаций для имен переменных в препроцессорах Sass и Less.
356 |[class^="..."]
) для часто встречающихся компонентов. Это негативно повлияет на производительность браузера.Дополнительно к прочтению:
372 |Установите в вашем редакторе следующие настройки, которые помогут избежать распространенных несогласованностей в коде и грязи:
401 |Подумайте над документированием и применением этих настроек в файле .editorconfig
вашего проекта. Для примера, ознакомьтесь с файлом настроек для Bootstrap. Узнайте больше об EditorConfig.