CSS
Cascading Style Sheets – каскадные таблицы стилей.
Официальная спецификация – https://www.w3.org/Style/CSS/Overview.ru.html 
MDN Web Docs (справочник) – https://developer.mozilla.org/ru/ 
Структура CSS-элемента
h1 {
	font-size: 32px;
	color: white;
}h1 – селектор (по тегу);
font-size и color – свойства;
32px и white – значения свойств.
Шорткат (shortcut) – короткая запись свойства, содержащего несколько значений. Например: margin: 0 auto 20px 40px;.
Подключение стилей
- Инлайновые стили (inline styles)
 
<head></head>
<body>
	<h1 style="color: white">Заголовок</h1>
</body><head>
	<style>
		h1 {
			font-size: 32px;
			color: white;
		}
	</style>
<head>
<body>
	<h1>Заголовок</h1>
</body>- Из отдельного файла
 
<head>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
	<h1 class="title">Заголовок</h1>
</body>.title {
	font-size: 32px;
	color: white;
}Названия CSS-классов
| Категория | Названия класса | 
|---|---|
| Блоки | page, header, main, body, footer, section, content, sidebar, aside, article, widget | 
| Изображения | image, img, picture, pic, illustration, icon, logo, avatar, userpic, thmbnail, thumb | 
| Контейнеры | container, wrapper, wrap, overlay, inner, holder, box, grid, row, column, col | 
| Навигация | button, btn, control, ctrl, dropdown, nav, navbar, sidebar, menu, topmenu | 
| Размеры | tiny, small, medium, base, big, large, huge, narrow, wide, xs, sm, lg, xl, xxl, xxxl | 
| Разное | search, socials, advertisement, adv, commercial, promo, features, feat, benefits, slider, carousel, card, pagination, user, author, meta, basket, breadcrmbs, more, all, modal, popup, tooltip, tip, preview | 
| Состояния | active, current, visible, hidden, error, warning, success, pending | 
| Списки | list, items, item | 
| Текст | title, subtitle, heading, headline, lead, tagline, caption, slogan, text, description, desc, exerpt, quote, blockquote, snippet, link, copyright | 
CSS-директивы
@import
Синтаксис:
@import url(main.css);Особенности:
- Каждая обрабатываемая директива 
@importзагружается по очереди. Это может плохо отразиться на скорости загрузки сайта. Элемент<link>(в отличие от@import) позволяет загружать файлы параллельно. @importработает, когда написана в начале файла. Внешние файлы загружаются первыми. Следующие за ними стили могут их перезаписать.
Шрифты и типографика
Подключение к странице
Шрифт подключают в два этапа:
- Декларация шрифта.
 
@font-face {
    src: url(путь к файлу);
    font-family: 'Roboto'; 
}- Применение шрифта к элементу.
 
div {
    /* Если шрифт Roboto из файла не загрузится, 
		браузер применит Arial или Helvetica, 
		или любой шрифт без засечек в системе пользователя */
 
    font-family: 'Roboto', 'Arial', 'Helvetica', sans-serif;
    font-weight: bold;
    font-style: italic;
}Особенности
Каждое начертание шрифта требуется декларировать (подключать) отдельно:
@font-face {
    src: url(путь к файлу обычного начертания);
    font-family: 'Roboto';
}
@font-face {
    src: url(путь к файлу курсива);
    font-family: 'Roboto';
    font-style: italic;
}
@font-face {
    src: url(путь к файлу полужирного начертания);
    font-family: 'Roboto';
    font-weight: bold;
}
@font-face {
    src: url(путь к файлу полужирного курсива);
    font-family: 'Roboto';
    font-style: italic;
    font-weight: bold;
}Старые браузеры не умеют работать с WOFF2 и WOFF, поэтому нужно подключать список шрифтов в разных форматах. Для эго применяют параметр format. Браузер прочитает такой список и выберет первый найденный шрифт, с которым умеет работать.
@font-face {
    src: url(путь к файлу.woff2) format('woff2'),
             url(путь к файлу.woff) format('woff'),
             url(путь к файлу.ttf) format('truetype'),
             url(путь к файлу.eot) format('eot');
}Функция local() запрещает браузеру скачивать шрифт из интернета, если в системе пользователя уже имеется шрифт с таким же именем.
@font-face {
    src: local('Best font ever'),
             local('BestFontEver'),
             local('best-font-ever'),
             url(путь к файлу.woff2) format('woff2'),
             url(путь к файлу.woff) format('woff'),
             url(путь к файлу.ttf) format('truetype'),
             url(путь к файлу.eot) format('eot');
}Настройка .block {} позволяет браузеру отрисовать весь текст обычным шрифтом, пока скачивается основной.
@font-face {
    src: url(./Inter-regular.woff) format('woff');
    font-family: 'Inter';
}
 
.block {
    font-family:  'Inter', 'Arial', sans-serif;
}Свойство font-display указывает браузеру, что делать, если шрифт не скачивается:
font-display: block;– отрисовать текст прозрачным альтернативным шрифтом, дождаться загрузки и перерисовать весь текст видимым скачанным шрифтом.font-display: swap;– сразу отрисовать текст альтернативным шрифтом, дождаться загрузки и перерисовать весь текст скачанным шрифтом.
Подробнее см. в Доке – https://doka.guide/css/font-display/
Пример
@font-face {
  font-family: 'IBM Plex Serif';
  src:
    local('IBM Plex Serif'), local('IBMPlexSerif'),
    local('IBM Plex Serif SemiBold'),
    url(https://___.woff2)
      format('woff2'),
    url(https://___.woff)
      format('woff'),
    url(https://___.ttf)
      format('truetype');
  font-weight: bold;
  font-display: swap;
}
 
@font-face {
  font-family: Ubuntu;
  src:
    local('Ubuntu'), local('ubuntu'),
    url(https://___.woff2) format('woff2'),
    url(https://___.woff) format('woff'),
    url(https://___.ttf) format('truetype');
  font-weight: normal;
  font-display: swap;
}
 
@font-face {
  font-family: 'Istok Web';
  src:
    local('Istok'), local('Istok Regular'), local('istok'),
    local('istokregular'), local('Istok Web'),
    url(https://___.woff2) format('woff2'),
    url(https://___.woff) format('woff'),
    url(https:/___.ttf)
      format('truetype');
  font-weight: normal;
  font-display: swap;
}.title {
  font-family: 'Istok Web', serif;
}
 
.subtitle {
  font-family: Ubuntu, sans-serif;
}
 
.content {
  font-family: 'IBM Plex Serif', serif;
}Оформление текста
text-transform:uppercase,lowercase,capitalizeи др.letter-spacing– межбуквенное расстояние.line-height– межстрочное расстояние.text-decoration– подчеркивание и пр. оформление.font-family– название шрифта.font-weight– насыщенность шрифта.font-size– размер шрифта.line-height– высота строки.columns– шорткат дляcolumn-countиcolumn-widht.
Переполнение блока
Обрезать текст, в конце отобразить многоточие:
.text {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}Перенести часть слова на новую строку:
.text {
	overflow-wrap: break-word;
}Позиционирование
Все элементы на странице находятся в потоке. Блочные отрисовываются каждый с новой строки, строчные располагаются рядом друг с другом. Элемент с inline-block встаёт в строку с соседними строчными или строчно-блочными элементами, но при этом реагирует на свойства ширины и высоту.
Взаимное расположение элементов называется позиционированием и по умолчанию описывается правилом: position: static.
Подробнее про поток документа см. Доку – https://doka.guide/html/flow/ , про позиционирование – https://doka.guide/css/position/
Когда элемент остается в потоке, но смещается относительно самого себя, это называется относительным позиционированием и задается правилом:
div {
	position: relative;
	top: 10px;
	right: 20px;
	bottom: 40px;
	left: 20px;
}При этом сдвигается только сам элемент, но выделенная под него область остается в потоке.
При абсолютном позиционировании (position: absolute) элемент вырывается из потока и располагается относительно другого спозиционированного элемента, начиная от своего родителя и вверх к body.
При фиксированном позиционировании (position: fixed) элемент также вырывается из потока. Но располагается относительно окна браузера (viewport).
При липком позиционировании (position: sticky) элемент фиксируется в заданном месте. При скроле не сдвигается.
Свойство z-index позволяет переопределить положение элементов, наложенных друг на друга, по оси Z.
z-index не работает с элементом, который не спозиционирован или спозиционирован статично (position: static), за одним исключением. Если элемент находится внутри flex или grid контейнера, то z-index будет работать во всех случаях.
Свойство inset – это шорткат для top, right, bottom и left. Например: inset: 0 равнозначно inset: 0 0 0 0. По аналогии с margin и padding.
Flexbox
Игра для изучения Флексбокс – https://flexboxfroggy.com/#ru
Теория
- Флекс-контейнер – родительский элемент. Задается свойством 
display: flex. - Флекс-элементы – дочерние элементы флекс-контейнера.
 
Флекс-элементы подчиняются только своему родителю. Настройки флекс-контейнеров более высокого уровня ими не наследуются.
Внутри контейнера элементы выстраиваются по 2-м осям:
- Основная ось.
 - Поперечная ось (перпендикулярна основной).
 
Изменить направление осей можно свойством flex-direction. Значения: raw, raw-reverse, column, column-reverse.
Для выравнивания элементов по основной оси используется свойство justify-content. Значения: start, end, center, space-between, space-around, space-evenly.
Для выравнивания элементов по поперечной оси используется свойство align-items. Значения: stretch, start, center, baseline.
Свойства justify-content и align-items управляют контекстом в целом, а, например, margin: auto – отдельным элементом. Управление контекстом – более универсально.
Для переноса элементов используется свойство flex-wrap: wrap. Однако при этом возникает проблема с равномерным распределением боковых отступов. Свойства justify-content: space-around, justify-content: space-between и margin для решения этой проблемы не подходят. Лучше применять row-gap, column-gap и align-content.
Свойство align-content отвечает за поведение элементов при включенном flex-wrap. Значения: stretch, start, end, center, space-between, space-around, space-evenly. При этом важно, чтобы высота флекс-контейнера была больше высоты вложенных в него элементов (чтобы оставалось свободное пространство для распределения).
Свойство flex-flow объединяет собой два свойства: flex-direction и flex-wrap. Например, flex-flow: column wrap.
Для управления порядком отображения элементов на странице можно применить свойство order (к каждому из них, к отдельным или к одному конкретному элементу). Управлять поведением отдельного элемента также можно через свойство align-self. Значения: stretch, start, center, baseline.
Практика
- Прижать 
footerк низу страницы 
.body {
	display: flex;
	flex-direction: column;
	min-height: 100%;
}
 
.main {
	flex-grow: 1;
}
 flex-grow: 1 отдает блоку .main всё оставшееся по высоте свободное пространство.
Если всем флекс-элементам задать flex-grow: 1, то свободное пространство равномерно распределится между ними. При этом, если одному элементу задать flex-grow: 2, то он заберёт себе в два раза больше свободного пространства, чем элементы с flex-grow: 1.
- Есть 5 карточек. Нужно разместить 3 карточки в первой строке, а 2 растянуть по ширине во второй строке.
 
.cards {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 20px;
	width: 100%;
	max-width: 1200px;
	padding: 10px;
}
 
.card {
	flex-basis: 300px;
	flex-grow: 1;
	min-height: 200px;
	border: 2px solid #000;
	text-align: center;
}Свойство flex-basis устанавлиет базовый размер элемента (до расширения). При нехватке ширины страницы карточки переносятся на новую строку и занимают свободное пространство, учитывая значение свойства flex-grow.
Свойство flex-shrink отвечает за сжатие элемента (от базового значения flex-basis). Оно выполняет роль, обратную flex-grow.
Значения по умолчанию: flex: 0 1 auto, что означает:
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;Grid Layout
Онлайн-сервис для проверки исполнения кода – https://codepen.io Игра для изучения Grid Layout – https://cssgridgarden.com/#ru
По умолчанию грид-контейнер состоит из одной строки и одного столбца. Для каждого дочернего элемента создается новая строка. Grid ведет себя как блочный элемент, а inline-grid – как строчный, т.е. занимает лишь то пространство, которое необходимо для размещения вложенных в него элементов.
Треки
Грид-контейнер можно разделить на столбцы и строки (т.н. “треки”):
.container {
	display: grid;
	grid-template-columns: 120px 80px 340px;
	grid-template-rows: 160px 100px 160px;
	gap: 10px 20px;
}
 
/* Создает грид-контейнер, состоящий из трех строк и трех столбцов */Для сокращения записи применяют свойство repeat():
grid-template-columns: 25% 25% 25% 25%;
/* или можно сократить: */
grid-template-columns: repeat(4, 25%);
 
/* Создает грид-контейнер, состоящий из 4-х колонок шириной по 25% от viewport */Пример дизайнерской сетки из 12-ти колонок:
.grid {
  position: fixed;
  inset: 0;
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 12px;
  padding: 0 12px;
}
 
/* Дизайнеры обычно используют сетку из 6-ти или 12-ти колонок */Грид-линии
Растянуть элементы можно при помощи грид-линий:
grid-column-startиgrid-column-end– для вертикальных грид-линий;grid-row-startиgrid-row-end– для горизонтальных грид-линий.
Шорткат через /. Если указать только одно значение, второе по умолчанию будет auto:
grid-row: 1;grid-column; 2/3;
Например, в сетке из шести элементов первый элемент занимает 2/3 столбцов и 5/5 строк:
<div class="container">
  <div class="block block_large">1</div>
  <div class="block">2</div>
  <div class="block">3</div>
  <div class="block">4</div>
  <div class="block">5</div>
  <div class="block">6</div>
</div>.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  gap: 40px 5px;
}
 
.block {
  border: 1px solid black;
}
 
.block_large {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 6;
}Также можно использовать отрицательные значения:
.block_large {
  grid-column-start: -1;
  grid-column-end: -3;
  grid-row-start: 1;
  grid-row-end: 6;
}Грид-линиям можно назначать имена:
grid-template-rows: [aside-start] 300px [aside-end];или
grid-row: aside-start / 4;Ключевым словом span указывают количество строк или столбцов, которое должен занимать элемент до или после какой-то линии:
.block {
	grid-column-start: 2;
	grid-column-end: span 2;
	grid-row-start: span 2;
	grid-row-end: 3;
}Грид-области
Вместо грид-линий для построения сетки можно применять грид-области (прямоугольные области, состоящие из одной или нескольких грид-ячеек).
Грид-область должна быть прямоугольником. Каждой области нужно задать свое уникальное имя. Для одного имени можно создать только одну область. Точкой, как правило, обозначается пустая ячейка. Например:
.container {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	grid-template-rows: repeat(4, 1fr);
	grid-template-areas:
	"header header header"
	"news news aside"
	"promo promo aside"
	". footer footer";
}Выравнивание элементов
- Выравнивание сетки в грид-контейнере:
 
.container {
	align-content: center;
	justify-content: space-between;
}или сокращенно:
.container {
	place-content: center space-between;
}Если в place-content указать только одно значение, оно применится к обеим осям:
.container {
	place-content: space-evenly;
}- Выравнивание содержимого грид-областей:
 
Свойство justify-items выравнивает элементы по направлению колонок, align-items — по направлению строк.
.container {
	align-items: center;
	justify-items: space-between;
}или сокращенно:
.container {
	place-items: center space-between;
}- Выравнивание содержимого внутри грид-области:
 
Свойство justify-self управляет горизонтальным выравниванием, align-self — вертикальным.
Наложение элементов
.grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(12, 1fr);
  width: 600px;
  height: 400px;
}
 
.grid__overlay {
  z-index: 1;
  grid-column: 1/5;
  grid-row: -1/-6;
  width: 100%;
  height: 100%;
}subgrid
Применяется в качестве значения свойств grid-template-columns и grid-template-rows. Позволяет вложенным элементам наследовать значение gap от родителя, а также свойства выравнивания грид-контейнера.