Коллекция советов, которые помогут вам стать лучше в CSS.
Вы найдете больше классных списков под кураторством [@sindresorhus](https://github.com/sindresorhus/).
box-sizing
      unset вместо сброса всех свойств
      :not() для добавления / удаления границ в
          меню навигации
      line-height в body
      :focus для элементов формы
      nth-child
      max-height для ползунков на чистом CSS
      rem для глобальных размеров; Используйте
          em для локальных размеров
      :root для шрифтов
      font-size для элементов формы, чтобы
          оптимизировать просмотр на мобильных устройствах
      display: none на разрывы строк, используемые
          как интервалы
      Сброс CSS помогает обеспечить согласованность стилей между различными браузерами и с чистого листа начать оформление элементов. Вы можете использовать CSS библиотеки сброса такие как Normalize и др., или вы можете использовать более простой способ сброса:
      Теперь для всех элементов свойства margin и padding будут равны нулю, а
      box-sizing: border-box позволяет указывать размеры всему
      блоку, а не его содержимому.
    
      Примечание: Если вы будете следовать совету
      Наследуйте box-sizing, то вы можете не
      включать свойство box-sizing в ваш CSS Reset.
    
box-sizingПусть box-sizing будет унаследован от html:
      Так значительно проще изменять box-sizing в плагинах или
      других компонентах, которые задают иное поведение.
    
unset вместо сброса всех свойств
    При сбросе свойств элемента нет необходимости сбросить каждое отдельное свойство:
button {
  background: none;
  border: none;
  color: inherit;
  font: inherit;
  outline: none;
  padding: 0;
}
    
      Вы можете указать все свойства элемента, используя сокращенное выражение
      all. Установка значения unset изменяет свойства
      элемента на их начальные значения:
    
      Примечание: сокращенные обозначения all и
      unset не поддерживаются в IE11.
    
:not() для добавления / удаления границ в меню
      навигации
    Вместо того, чтобы добавлять границу…
…а затем убирать её с последнего элемента…
      …используйте псевдокласс :not(), чтобы добавить только к
      нужным элементам:
    
Селектор CSS определяет границу так, как ее описывает человек.
Вы можете проверить, установлен ли шрифт локально, прежде чем извлекать его удаленно, что также является хорошим показателем производительности.
@font-face {
  font-family: "Dank Mono";
  src:
    /* Full name */
    local("Dank Mono"),
    /* Postscript name */
    local("Dank Mono"),
    /* Otherwise, download it! */
    url("//...a.server/fonts/DankMono.woff");
}
code {
  font-family: "Dank Mono", system-ui-monospace;
}
    Шляпный совет Адаму Аргайлу за то, что он поделился этим опытом и примером.
line-height в body
    
      Вам вовсе не требуется добавлять свойство line-height к
      каждому <р>, <h*>, и т.д..
      по отдельности. Вместо этого добавьте его в body:
    
      Таким образом текстовые элементы легко могут наследовать свойство от
      body.
    
:focus для элементов формы
    Приоритетные пользователи клавиатуры полагаются на фокус, чтобы определить, где события клавиатуры идут на странице. Сделайте фокус для элементов формы выделяющимися и последовательными, а затем реализацией браузера по умолчанию:
a:focus,
button:focus,
input:focus,
select:focus,
textarea:focus {
  box-shadow: none;
  outline: #000 dotted 2px;
  outline-offset: .05em;
}
    Нет, это не черная магия, вы действительно можете расположить элементы по центру по вертикали:
html,
body {
  height: 100%;
  margin: 0;
}
body {
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
  display: -webkit-flex;
  display: flex;
}
    …а также с помощью CSS Grid:
Хотите разместить по центру что-то еще? Вертикально, горизонтально…что угодно, в любое время и в любом месте? У нас есть хорошая статья которая научит всему этому.
Примечание: Будьте осторожны с некоторыми багами flexbox в IE11.
Сделайте список похожим на настоящий, разделенный запятыми список:
      Используйте псевдокласс :not() чтобы не добавлять запятую к
      последнему пункту.
    
Примечание: Этот совет не всегда даёт лучший результат, например, могут возникнуть проблемы у экранного диктора. Да и копирование / вставка из браузера не всегда работают со сгенерированным CSS контентом. Следует быть осторожным.
nth-child
    
      Используйте отрицательные значения в nth-child в CSS для
      выбора элементов с 1 по n.
    
li {
  display: none;
}
/* выбирает и отображает элементы с 1 по 3 */
li:nth-child(-n+3) {
  display: block;
}
    
      Или, так как вы уже немного познакомились
      с :not(), попробуйте:
    
/* выберите все элементы, кроме первых 3, и покажите их */
li:not(:nth-child(-n+3)) {
  display: none;
}
    Что же, это было довольно легко.
Нет ни одной причины, чтобы не использовать SVG для значков:
SVG хорошо масштабируется для всех разрешений и поддерживается во всех браузерах включая IE9 и выше. Так выбросите же ваши .png, .jpg или .gif-jif-что-угодно файлы.
Примечание: Если у вас есть кнопки, содержащие только SVG пиктограммы, и SVG не удается загрузить, то это поможет сохранить доступность кнопки:
      Название, безусловно, странное, но используя универсальный селектор
      (*) с соседним селектором (+), мы получаем
      мощное правило CSS:
    
      В этом примере все элементы в потоке документа, которые следуют другие
      элементы получат margin-top: 1.5em.
    
Более подробную информацию о селекторе “Лоботомированная сова”, можно найти в статье Heydon Pickering на A List Apart.
max-height для ползунков на чистом CSS
    
      Реализация ползунков на чистом CSS с помощью max-height и
      overflow hidden:
    
.slider {
  max-height: 200px;
  overflow-y: hidden;
  width: 300px;
}
.slider:hover {
  max-height: 600px;
  overflow-y: scroll;
}
    
      При наведении элемент расширяется до значения max-height, а
      всё что не влезло, можно прокрутить.
    
      Иногда работа с таблицами приносит боль, в таких случаях попробуйте задать
      table-layout: fixed чтобы ячейки были одинаковой ширины:
    
Даешь макеты таблиц без боли!
      При работе с пробелами между колонок вы можете избавиться от псевдоклассов
      nth, first- и
      last-child воспользовавшись свойством flexbox
      space-between:
    
Теперь пробелы между колонками будут одного размера.
      Отображайте ссылки, когда элемент <a> пустой, но есть
      ссылка в атрибуте href:
    
Это очень удобно.
Добавьте для ссылок стиль “по умолчанию”:
      Теперь ссылки, вставленные через CMS, которые, как правило, не имеют
      атрибута class, будут иметь отличительный признак без влияния
      на каскад.
    
Чтобы создать блок с собственным отношением сторон, все, что вам нужно сделать, это добавить верхний или нижний padding к DIV:
.container {
  height: 0;
  padding-bottom: 20%;
  position: relative;
}
.container div {
  border: 2px dashed #ddd;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}
    Использование padding 20% делает высоту параллелепипеда равной 20% от его ширины. Независимо от ширины окна, дочерний DIV будет сохранять соотношение сторон (100% / 20% = 5:1).
Сделайте поломанные изображения эстетически приятнее с CSS:
img {
  display: block;
  font-family: sans-serif;
  font-weight: 300;
  height: auto;
  line-height: 2;
  position: relative;
  text-align: center;
  width: 100%;
}
    Теперь добавьте правила псевдо-элементов для отображения сообщения пользователю и URL-ссылки поломаного изображения:
img:before {
  content: "Упс, изображение ниже поломалось :(";
  display: block;
  margin-bottom: 10px;
}
img::after {
  content: "(url: " attr(src) ")";
  display: block;
  font-size: 12px;
}
    Подробнее об этой модели в исходной статье Ire Aderinokun.
rem для глобальных размеров; Используйте
      em для локальных размеров
    
      После установки базового размера шрифта всего проекта (html { font-size: 100%; }), установите размер шрифта для текстовых элементов через
      em:
    
Затем установите размер шрифта для модулей через rem:
Теперь каждый модуль становится разобщенным и проще в настройке, более легким в обслуживании и гибче.
Это отличный трюк для пользовательских стилей. Избегайте раздражения пользователя звуком из видео, которое воспроизводится автоматически при загрузке страницы. Если звук не приглушен, то не показывайте видео:
      И снова мы воспользовались помощью псевдокласса
      :not().
    
:root для шрифтов
    
      Размер шрифта должен подстраиваться под каждый возможный размер экрана. Вы
      можете рассчитывать размер шрифта, основываясь на высоте и ширине экрана с
      помощью :root:
    
      Теперь вы можете использовать единицу root em на основе
      значения, рассчитанного с помощью :root:
    
font-size для элементов формы, чтобы
      оптимизировать просмотр на мобильных устройствах
    
      Чтобы избежать масштабирования мобильными браузерами (iOS Safari,
      и др.) элементов HTML формы, когда раскрывающийся список
      <select> нажат, добавьте font-size правило
      селектору:
    
:dancer:
[События указателя] (https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events) позволяют указать, как мышь взаимодействует с элементом, который он трогает. Чтобы отключить событие указателя по умолчанию на кнопке, например:
Это так просто.
display: none на разрывы строк, используемые как
      интервалы
    Как отметил [Гарри Робертс] (https://twitter.com/csswizardry/status/1170835532584235008), это может помочь пользователям CMS использовать дополнительные разрывы строк для пробелов:
Текущие версии Chrome, Firefox, Safari, Opera, Edge, и IE11.