Skip to content

Latest commit

 

History

History
480 lines (383 loc) · 15.1 KB

css.md

File metadata and controls

480 lines (383 loc) · 15.1 KB

CSS

Статус: черновик.

Оглавление

  • Для отступов вместо пробелов используется семантичная табуляция. В любом редакторе кода размер можно настроить на своё усмотрение (например, размер табуляции 4).
    В этом примере ∙∙∙∙ - четыре пробела, а ―――― - один отступ с табуляцией.
/* Плохо */
.heading {
  ∙∙∙∙font-size: 32px;
}

/* Хорошо */
.heading {
  ――――font-size: 32px;
}
  • Каждый селектор на отдельной строке.
/* Плохо */
.header,
.main,
.footer {
  margin-left: auto;
  margin-right: auto;
}

/* Хорошо */
.header,
.main,
.footer {
  margin-left: auto;
  margin-right: auto;
}
  • 1 пробел перед {.
/* Плохо */
.heading {
  font-size: 32px;
}

/* Хорошо */
.heading {
  font-size: 32px;
}
  • 1 перенос на новою строку перед }.
/* Плохо */
.heading {
  font-size: 32px;
}

.heading {
  font-size: 32px;
}

/* Хорошо */
.heading {
  font-size: 32px;
}
  • 1 перенос на новую строку после } и между группами объявлений.
/* Плохо */
.heading {
  font-size: 32px;
}
.highlight {
  background-color: #f00;
}

/* Хорошо */
.heading {
  font-size: 32px;
}

.highlight {
  background-color: #f00;
}
  • 1 пробел после :.
/* Плохо */
.heading {
  font-size: 32px;
}

/* Хорошо */
.heading {
  font-size: 32px;
}
  • Все объявления завершаются с ;.
/* Плохо */
.heading {
  font-size: 32px;
}

/* Хорошо */
.heading {
  font-size: 32px;
}
  • 1 пробел после запятых в значениях свойств.
/* Плохо */
.header {
  background-color: rgba(0, 0, 0, 0.5);
}

/* Хорошо */
.header {
  background-color: rgba(0, 0, 0, 0.5);
}
  • Не добавляйте начальный ноль для значений.
/* Плохо */
.transparent {
  opacity: 0.5;
}

/* Хорошо */
.transparent {
  opacity: 0.5;
}
  • Все 16-ичные значения записывайте строчными буквами (в нижнем регистре). Строчные буквы гораздо легче различить при просмотре файла, поскольку они, как правило, имеют больше уникальных форм.
/* Плохо */
.white {
  background-color: #fff;
}

/* Хорошо */
.white {
  background-color: #fff;
}
  • Используйте короткие 16-ичные значения.
/* Плохо */
.highlight {
  color: #ffffff;
  background-color: #0088ff;
}

/* Хорошо */
.highlight {
  color: #fff;
  background-color: #08f;
}
  • " для значений атрибутов внутри селектора.
/* Плохо */
input[type="text"] {
  /* ... */
}

/* Хорошо */
input[type="text"] {
  /* ... */
}
  • Опускайте единицы измерения при нулевом значении.
/* Плохо */
.header {
  margin-top: 0px;
}

/* Хорошо */
.header {
  margin-top: 0;
}

Объявления логически связанных свойств должны быть сгруппированы в следующем порядке:

  • Позиционирование - может удалить элемент из нормального потока документа и переопределить блочную модель связанных стилей.
  • Расположение - задаются внешние и внутренние отступы.
  • Блочная модель - диктует размеры
  • Типографика - шрифты, стилизация текста
  • Отображение - цвет, фон и т.п.
  • Прочее - трансформации, поведение и т.п.

Полный список порядка свойст можно посмотреть в конфигурации CSScomb.

Небольшой пример:

.declaration-order {
  /* Позиционирование */
  position: absolute;
  z-index: 100;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;

  /* Расположение */
  margin-top: 20px;
  margin-left: auto;
  margin-right: auto;
  padding: 8px 16px;

  /* Блочная модель */
  display: block;
  float: left;
  width: 100px;
  height: 100px;

  /* Типографика */
  font-family: "Helvetica Neue", sans-serif;
  font-size: 14px;
  line-height: 24px;
  text-align: center;

  /* Отображение */
  color: #333;
  background-color: #f5f5f5;
  border: 1px solid #e5e5e5;
  border-radius: 3px;
  opacity: 1;

  /* Прочее */
  transition: 0.25s ease-out;
  transform: scale(0.75);
}

По сравнению с тегом <link> правило @import медленнее, создает дополнительные запросы и может вызвать иные непредвиденные проблемы. Избегайте это правило и используйте вместо него один из альтернативных подходов:

  • Склеивайте CSS-файлы в один файл и минифицируйте.
  • Компилируйте CSS-код в один файл с помощью препроцессоров, например, Stylus, Sass или Less.

Для получения дополнительной информации следует ознакомиться со статьей Стива Соудерса.

<!-- Используйте тег link -->
<link rel="stylesheet" href="assets/styles/main.min.css">

<!-- Избегайте @import -->
<style>
    @import url(assets/styles/main.css);
</style>

Помещайте медиавыражения настолько близко к соответствующим наборам правил, насколько это возможно. Не объединяйте их в отдельную таблицу стилей. Не помещайте их в конце файла, для этого можно использовать специальный сборщик в Grunt или Gulp. В противном случае это приведет к тому, что медиавыражения будут не замечены в будущем.

Вот типичная структура:

.element {
  /* ... */
}
.element-avatar {
  /* ... */
}
.element-selected {
  /* ... */
}

@media only screen and (min-width: 480px) {
  .element {
    /* ... */
  }
  .element-avatar {
    /* ... */
  }
  .element-selected {
    /* ... */
  }
}

Свойства с префиксами Когда вы используете свойства с префиксами вендоров, оставляйте отступы для каждого свойства так, чтобы значения объявлений выстраивались в вертикальную линию. Это упрощает многострочное редактирование.

/* Свойства с префиксами */
.selector {
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}

В случаях, когда набор правил включает в себя только одно объявление, рекомендуется оставить переносы строк, иначе в будущем при добавлении новых свойств потребуется добавлять переносы. Любой набор правил с несколькими объявлениями должен быть разделен на отдельные строки.

Ключевым фактором здесь является обнаружение ошибок — например, валидатор CSS сообщает вам, что в строке 183 есть синтаксическая ошибка. С одиночным объявлением не возникнет сложности с исправлением. В случае с несколькими объявлениями, разделенными на строки, так же проблем не возникнет. Но если несколько объявлений будут записаны в одну строку, то вам будет сложнее понять какое именно объявление вызвало синтаксическую ошибку.

/* Плохо */
.sprite {
  display: inline-block;
  width: 16px;
  height: 16px;
  background-image: url(../images/sprite.png);
}
.sprite-home {
  background-position: 0 -20px;
}
.sprite-account {
  background-position: 0 -40px;
}

/* Хорошо */
.sprite {
  display: inline-block;
  width: 16px;
  height: 16px;
  background-image: url(../img/sprite.png);
}

.sprite-home {
  background-position: 0 -20px;
}

.sprite-account {
  background-position: 0 -40px;
}

Старайтесь ограничить использование сокращенных объявлений в тех случаях, когда необходимо явно задать все доступные значения. Наиболее часто злоупотребляют сокращением следующих свойств:

  • padding
  • margin
  • font
  • background
  • border
  • border-radius

Часто нам не нужно устанавливать все значения сокращенной записи свойства. Например, HTML заголовки устанавливают только отступы сверху и снизу, таким образом, в случае необходимости нужно переопределить только эти два значения. Чрезмерное использование сокращенной записи свойств часто приводит к грязному коду с ненужными переопределения и непреднамеренными побочными эффектами.

На сайте Mozilla Developer Network есть отличная статья о сокращенной записи свойств для тех кто не знаком с такой формой записи.

/* Плохо */
.element {
  margin: 0 0 10px;
  background: red;
  background: url(../img/image.jpg);
  border-radius: 3px 3px 0 0;
}

/* Хорошо */
.element {
  margin-bottom: 10px;
  background-color: red;
  background-image: url(../img/image.jpg);
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
}
  • Пишите комментарии только по мере необходимости, передающие контекст и цель кода, а не просто повторение названия класса или компонента.
  • Всё комментировать не нужно.
  • Комментарии только на английском языке.
  • Используйте только классы вместо тегов для оптимальной производительности отображения.
  • Не используйте селекторы по атрибуту (например, [class^="..."]) для часто встречающихся компонентов. Это негативно повлияет на производительность браузера.
  • Не используйте идентификаторы.
  • Используйте короткие селекторы.
  • Не используйте каскад (вложенность селекторов).
  • Вложенность селекторов допускается только в случае необходимости, например, когда нужно изменить свойства при наведении (:hover) или другом подобного псевдоселекторе, и при использовании специальных глобальных классов.

Дополнительно к прочтению:

/* Плохо */
span {
  /* ... */
}
a.link {
  /* ... */
}
#logo {
  /* ... */
}
.page-container #stream .stream-item .tweet .tweet-header .username {
  /* ... */
}
.user {
  /* ... */
}

/* Хорошо */
.link {
  /* ... */
}

.user {
  /* ... */
}

.user:hover .user__name {
  /* ... */
}
  • Разделите CSS-код на несколько файлов со своими состовляющими:
    • Сброс стилей.
    • Шрифты.
    • Базовые стили.
    • Общие стили:
      • Шапка.
      • Подвал.
    • Блоки.
    • Компоненты.
  • Ориентируйтесь на блоки и компоненты, а не на страницы, которые могут быть переработаны, а блоки и компоненты могут перемещаться с одной страницы на другую.