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 от родителя, а также свойства выравнивания грид-контейнера.