Учусь на второй ступени Школы дизайнеров Бюро Горбунова.
Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».
🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Сверстаем простую страницу‑визитку с рассказом о себе. Вместо фотографии возьмём кружок‑заглушку. Начнём с разметки:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Чтобы сайт отображался в одинаковом масштабе на мобильных -->
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
Подключим ИБМ Плекс Санс и настроим базовую типографику:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@100;400;700&display=swap" rel="stylesheet">
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
:root {
--textColor: #282828; /* Введём ЦСС-переменные для цвета текста и фона. Они пригодятся нам, когда решим перекрашивать страницу в особых случаях */
--backgroundColor: rgba(247, 247, 247,.8);
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
Добавим резиновые отступы странице, чтобы текст не упирался в края окна:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem; /* Функция clamp() возвращает значение 2,5% ширины окна, зажатое между минимальным значение в 1,43rem и максимальным в 2,84rem. Где 1rem — кегль страницы на самом высоком уровне, по умолчанию равный 16 пк */
}Обёртка для страницы
Стилизуем ссылки:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff; /* Ключевой цвет страницы */
--linkColor: var(--textColor); /* Красим ссылки в цвет текста */
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0)); /* Подчёркивание делаем светлее ключевого цвета, смешивая его с прозрачным белым */
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em; /* Пусть толщина зависит от кегля. Чем больше кегль, тем толще подчеркивание */
text-underline-offset: 0.25em; /* Чуть сдвинем подчеркивание вниз */
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
Разложим шапку:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem; /* Увеличиваем кегль в 1,5 раза */
display: grid; /* Включаем гриды */
grid-template-columns: min-content 1fr; /* Отдаём логотипу минимум места, всё остальное — меню */
align-items: center; /* Выравниваем всё по центру */
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end; /* Прижимаем пункты меню к правому краю */
column-gap: 1rem; /* Задаём отступ между пунктами меню */
}
Стилизуем лид:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem;
display: grid;
grid-template-columns: min-content 1fr;
align-items: center;
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end;
column-gap: 1rem;
}
.lead {
font-size: clamp(2rem, 5vw, 5rem); /* Настраиваем кегль, равный 5% от ширины экрана, но в пределах 32—80 пк */
}
.lead p {
max-width: 18em; /* Ограничиваем абзацы в лиде по ширине, чтобы текст было удобно читать на широких экранах */
}
.about {
margin-top: 5vh; /* Добавляем отступ от шапки. Мы специально добавляем его здесь, а не в лиде, чтобы разделить ответственность. Наверняка нам захочется использовать лид на других страницах, в таком случае верхний маржин будет только мешать */
}Сверстаем простую страницу‑визитку с рассказом о себе. Вместо фотографии возьмём кружок‑заглушку. Начнём с разметки:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- Чтобы сайт отображался в одинаковом масштабе на мобильных -->
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
Подключим ИБМ Плекс Санс и настроим базовую типографику:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@100;400;700&display=swap" rel="stylesheet">
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
:root {
--textColor: #282828; /* Введём ЦСС-переменные для цвета текста и фона. Они пригодятся нам, когда решим перекрашивать страницу в особых случаях */
--backgroundColor: rgba(247, 247, 247,.8);
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
Добавим резиновые отступы странице, чтобы текст не упирался в края окна:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem; /* Функция clamp() возвращает значение 2,5% ширины окна, зажатое между минимальным значение в 1,43rem и максимальным в 2,84rem. Где 1rem — кегль страницы на самом высоком уровне, по умолчанию равный 16 пк */
}Обёртка для страницы
Стилизуем ссылки:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff; /* Ключевой цвет страницы */
--linkColor: var(--textColor); /* Красим ссылки в цвет текста */
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0)); /* Подчёркивание делаем светлее ключевого цвета, смешивая его с прозрачным белым */
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em; /* Пусть толщина зависит от кегля. Чем больше кегль, тем толще подчеркивание */
text-underline-offset: 0.25em; /* Чуть сдвинем подчеркивание вниз */
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
Разложим шапку:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem; /* Увеличиваем кегль в 1,5 раза */
display: grid; /* Включаем гриды */
grid-template-columns: min-content 1fr; /* Отдаём логотипу минимум места, всё остальное — меню */
align-items: center; /* Выравниваем всё по центру */
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end; /* Прижимаем пункты меню к правому краю */
column-gap: 1rem; /* Задаём отступ между пунктами меню */
}
Стилизуем лид:
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
min-height: 100vh;
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem;
display: grid;
grid-template-columns: min-content 1fr;
align-items: center;
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end;
column-gap: 1rem;
}
.lead {
font-size: clamp(2rem, 5vw, 5rem); /* Настраиваем кегль, равный 5% от ширины экрана, но в пределах 32—80 пк */
}
.lead p {
max-width: 18em; /* Ограничиваем абзацы в лиде по ширине, чтобы текст было удобно читать на широких экранах */
}
.about {
margin-top: 5vh; /* Добавляем отступ от шапки. Мы специально добавляем его здесь, а не в лиде, чтобы разделить ответственность. Наверняка нам захочется использовать лид на других страницах, в таком случае верхний маржин будет только мешать */
}Получилась страница, которая автоматически адаптируется к разной ширине экрана. Но на узких мобильных экранах есть пара проблем: меню не вмещается, лид превращается в высокую колонку из коротких строк. Чтобы исправить это, достаточно уменьшить кегль и поджать шапку медиавыражениями для устройств.
Точки излома
В случае с нашей страницей поддержим два типа устройств:
| Мобильные | < 768 пк |
| Лаптопы‑десктопы | ≥ 768 пк |
На мобильных уменьшим базовый размер шрифта до 14 пикселей:
@media (width < 768px) {
:root {
font-size: 14px;
}
}Уменьшим кегль в шапке:
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
}
Увеличим расстояние между пунктами меню, чтобы облегчить прицеливание:
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
.nav {
column-gap: 1.5em;
}
}
Привет! Я — Растин Спенсер Коул, дизайнер, музыкант и гроссмейстер. Проектирую сайты, приложения и системы навигации в общественных местах. Пишу музыку, играю в шахматы.
Получилась страница, которая автоматически адаптируется к разной ширине экрана. Но на узких мобильных экранах есть пара проблем: меню не вмещается, лид превращается в высокую колонку из коротких строк. Чтобы исправить это, достаточно уменьшить кегль и поджать шапку медиавыражениями для устройств.
Точки излома
В случае с нашей страницей поддержим два типа устройств:
| Мобильные | < 768 пк |
| Лаптопы‑десктопы | ≥ 768 пк |
На мобильных уменьшим базовый размер шрифта до 14 пикселей:
@media (width < 768px) {
:root {
font-size: 14px;
}
}Уменьшим кегль в шапке:
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
}
Увеличим расстояние между пунктами меню, чтобы облегчить прицеливание:
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
.nav {
column-gap: 1.5em;
}
}
Добавим тёмную тему, если клиент её предпочитает:
@media (prefers-color-scheme: dark) {
:root {
--textColor: #fff;
--backgroundColor: #0f0f0f;
}
}Медиавыражения
Добавим тёмную тему, если клиент её предпочитает:
@media (prefers-color-scheme: dark) {
:root {
--textColor: #fff;
--backgroundColor: #0f0f0f;
}
}Медиавыражения
Вот, что в итоге, у нас получилось:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@100;400;700&display=swap" rel="stylesheet">
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem;
display: grid;
grid-template-columns: min-content 1fr;
align-items: center;
}
.header a {
text-decoration: none;
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end;
column-gap: 1em;
}
.lead {
font-size: clamp(2rem, 5vw, 5rem);
}
.lead p {
max-width: 18em;
}
.about {
margin-top: 5vh;
}
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
.nav {
column-gap: 1.5em;
}
}
@media (prefers-color-scheme: dark) {
:root {
--textColor: #fff;
--backgroundColor: #0f0f0f;
}
}Порастягивайте окно и посмотрите, как меняется вёрстка и кегль лида
Привет! Я — Растин Спенсер Коул, дизайнер, музыкант и гроссмейстер. Проектирую сайты, приложения и системы навигации в общественных местах. Пишу музыку, играю в шахматы.
Вот, что в итоге, у нас получилось:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@100;400;700&display=swap" rel="stylesheet">
<title>Растин Спенсер Коул</title>
</head>
<body>
<div class="layoutContainer">
<header class="header">
<a href="/" class="logo">
<svg viewBox="0 0 64 64" width="64" height="64">
<circle cx="32" cy="32" r="30"></circle>
</svg>
</a>
<nav class="nav">
<a href="/design/">Дизайн</a>
<a href="/music/">Музыка</a>
<a href="/chess/">Шахматы</a>
</nav>
</header>
<section class="about">
<div class="lead">
<p>
Привет! Я — Растин Спенсер Коул,
дизайнер, музыкант и гроссмейстер. Проектирую <a href="/websites/">сайты</a>,
<a href="/apps/">приложения</a> и <a href="/wayfinding/">системы навигации</a>
в общественных местах.
Пишу <a href="https://www.last.fm/music/Mick+Gordon">музыку</a>,
играю <a href="https://chessarena.com/profile/218782">в шахматы</a>.
</p>
</div>
</section>
</div>
</body>
</html>
:root {
--textColor: #282828;
--backgroundColor: rgba(247, 247, 247,.8);
--keyColor: #00b2ff;
--linkColor: var(--textColor);
--linkUnderlineColor: color-mix(in srgb, var(--keyColor) 50%, rgba(255, 255, 255, 0));
}
body {
font: 1em/1.25 IBM Plex Sans, Helvetica Neue, Helvetica, Arial, sans-serif;
color: var(--textColor);
background-color: var(--backgroundColor);
}
a {
color: var(--linkColor);
text-decoration: underline;
text-decoration-color: var(--linkUnderlineColor);
text-decoration-thickness: .0625em;
text-underline-offset: 0.25em;
}
a:hover {
color: var(--keyColor);
}
.layoutContainer {
padding: .5rem clamp(1.43rem, 2.5vw, 2.84rem) 3rem;
}
.header {
font-size: 1.5rem;
display: grid;
grid-template-columns: min-content 1fr;
align-items: center;
}
.header a {
text-decoration: none;
}
.logo {
width: 1.75em;
height: 1.75em;
margin-right: 1em;
fill: var(--keyColor);
}
.nav {
display: grid;
grid-auto-flow: column;
grid-auto-columns: max-content;
justify-content: end;
column-gap: 1em;
}
.lead {
font-size: clamp(2rem, 5vw, 5rem);
}
.lead p {
max-width: 18em;
}
.about {
margin-top: 5vh;
}
@media (width < 768px) {
:root {
font-size: 14px;
}
.header {
font-size: 1.25rem;
}
.nav {
column-gap: 1.5em;
}
}
@media (prefers-color-scheme: dark) {
:root {
--textColor: #fff;
--backgroundColor: #0f0f0f;
}
}Сверстаем страницу‑визитку из работы Романа Жалялова в Школе Бюро Горбунова.
Начнём с разметки:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Роман Жалялов, дизайнер интерфейсов</title>
<link rel="stylesheet" href="reset.css">
</head><!-- Стили для сброса, метатеги и заголовок окна страницы -->
<body>
<div class="layoutContainer">
<section class="about">
<img class="photo" src="images/me.jpg"><!-- Будем хранить картинки в папке images -->
<h1>Роман Жалялов, дизайнер интерфейсов</h1>
<div class="text">
<p>Учусь на второй ступени Школы дизайнеров Бюро Горбунова.</p>
<p>Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».<!-- «травлю леску» склеили неразрывным пробелом --> </p>
</div>
<footer class="social">
<a href="">Telegram</a>
<a href="">Behance</a>
</footer>
</section>
</div>
</body>
</html>
Настроим раскладку страницы. Растянем основной контейнер на всю высоту окна и добавим поля. Заодно зададим фон и цвет текста:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
}Обёртка для страницы
Разобьём .about на 4 ячейки и расположим в них заголовок, фотографию, текст и социокнопки:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr; /* Две колонки, делящие свободное пространство в пропорции 77,5:22,5 */
grid-template-rows: min-content min-content; /* Два ряда высотой по содержимому */
gap: 20px 10px;
}
.about h1 {
grid-area: 2 / 1; /* Сокращённая форма записи grid-row: 1; grid-column: 2 */
}
.about .photo {
grid-area: 1 / 2; /* grid-row: 2; grid-column: 1 */
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
}
Наполируем раскладку. Отожмём строки к краям окна и поставим социокнопки на место:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between; /* Отожмём текст и фотографию к верхнему краю окна, а заголовок и социокнопки — к нижнему */
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
align-self: end; /* Социокнопки отожмём в правый нижний угол */
justify-self: end;
}
Настроим типографику. Зададим основной шрифт, стилизуем заголовок и текст:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw; /* Пусть кегль заголовка зависит от ширины окна */
line-height: .775; /* Уменьшаем интерлиньяж, чтобы попасть в макет */
letter-spacing: -.05em; /* Уменьшаем расстояния между буквами */
}
.text {
font-size: max(18px, 1.9vw); /* Пусть кегль текста также зависит от ширины окна, но с минимальным значением в 18 пикселей */
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Разобьём текст на 2 колонки:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw;
line-height: .775;
letter-spacing: -.05em;
}
.text {
font-size: max(18px, 1.9vw);
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
display: grid;
grid-template-columns: 1fr 1fr; /* Две колонки, делящие свободное пространство в пропорции 1:1 */
column-gap: 10px;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Ограничим текст по ширине и прижмём его к фотографии, чтобы получить узкие колонки, как в макете:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw;
line-height: .775;
letter-spacing: -.05em;
}
.text {
font-size: max(18px, 1.9vw);
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 10px;
max-width: max(280px, 50%);
justify-self: end;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Вёрстку социокнопок оставим читателю. Она почти не будет отличаться от вёрстки таких же кнопок в подвале.
Вёрстка подвала
Сверстаем страницу‑визитку из работы Романа Жалялова в Школе Бюро Горбунова.
Начнём с разметки:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Роман Жалялов, дизайнер интерфейсов</title>
<link rel="stylesheet" href="reset.css">
</head><!-- Стили для сброса, метатеги и заголовок окна страницы -->
<body>
<div class="layoutContainer">
<section class="about">
<img class="photo" src="images/me.jpg"><!-- Будем хранить картинки в папке images -->
<h1>Роман Жалялов, дизайнер интерфейсов</h1>
<div class="text">
<p>Учусь на второй ступени Школы дизайнеров Бюро Горбунова.</p>
<p>Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».<!-- «травлю леску» склеили неразрывным пробелом --> </p>
</div>
<footer class="social">
<a href="">Telegram</a>
<a href="">Behance</a>
</footer>
</section>
</div>
</body>
</html>
Настроим раскладку страницы. Растянем основной контейнер на всю высоту окна и добавим поля. Заодно зададим фон и цвет текста:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
}Обёртка для страницы
Разобьём .about на 4 ячейки и расположим в них заголовок, фотографию, текст и социокнопки:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr; /* Две колонки, делящие свободное пространство в пропорции 77,5:22,5 */
grid-template-rows: min-content min-content; /* Два ряда высотой по содержимому */
gap: 20px 10px;
}
.about h1 {
grid-area: 2 / 1; /* Сокращённая форма записи grid-row: 1; grid-column: 2 */
}
.about .photo {
grid-area: 1 / 2; /* grid-row: 2; grid-column: 1 */
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
}
Наполируем раскладку. Отожмём строки к краям окна и поставим социокнопки на место:
body {
background: #000;
color: #fff;
display: flex;
min-height: 100vh;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between; /* Отожмём текст и фотографию к верхнему краю окна, а заголовок и социокнопки — к нижнему */
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
align-self: end; /* Социокнопки отожмём в правый нижний угол */
justify-self: end;
}
Настроим типографику. Зададим основной шрифт, стилизуем заголовок и текст:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw; /* Пусть кегль заголовка зависит от ширины окна */
line-height: .775; /* Уменьшаем интерлиньяж, чтобы попасть в макет */
letter-spacing: -.05em; /* Уменьшаем расстояния между буквами */
}
.text {
font-size: max(18px, 1.9vw); /* Пусть кегль текста также зависит от ширины окна, но с минимальным значением в 18 пикселей */
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Разобьём текст на 2 колонки:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw;
line-height: .775;
letter-spacing: -.05em;
}
.text {
font-size: max(18px, 1.9vw);
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
display: grid;
grid-template-columns: 1fr 1fr; /* Две колонки, делящие свободное пространство в пропорции 1:1 */
column-gap: 10px;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Ограничим текст по ширине и прижмём его к фотографии, чтобы получить узкие колонки, как в макете:
body {
background: #000;
color: #fff;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
display: flex;
min-height: 100vh;
}
h1 {
font-size: 11vw;
line-height: .775;
letter-spacing: -.05em;
}
.text {
font-size: max(18px, 1.9vw);
line-height: 1;
}
.layoutContainer {
padding: 1.75% 2.625% 3.5%;
flex: 1;
}
.about {
min-height: 100%;
display: grid;
grid-template-columns: 77.5fr 22.5fr;
grid-template-rows: min-content min-content;
gap: 20px 10px;
align-content: space-between;
}
.about h1 {
grid-area: 2 / 1;
}
.about .photo {
grid-area: 1 / 2;
}
.about .text {
grid-area: 1 / 1;
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 10px;
max-width: max(280px, 50%);
justify-self: end;
}
.about .social {
grid-area: 2 / 2;
align-self: end;
justify-self: end;
}
Вёрстку социокнопок оставим читателю. Она почти не будет отличаться от вёрстки таких же кнопок в подвале.
Вёрстка подвала