🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру

Удобно листать не только прокруткой, но и клавишами‑стрелками:

 
между важными местами
Shift
между
разворотами
Васи­лий Полов­нёв, Игорь Пет­ров

ХТМЛ.
Вёрстка сайтов

Изда­тель­ство Бюро Гор­бу­нова
2021
Василий Половнёв, Игорь Петров

ХТМЛ.
Вёрстка сайтов

Издательство Бюро Горбунова
2021
удк 004.42
ббк З973.42
П52
Васи­лий Полов­нёв, Игорь Пет­ров
П52
ХТМЛ. Вёрстка сай­тов для дизай­не­ров, редак­то­ров и руко­во­ди­те­лей.—
М.: Изд‑во Бюро Гор­бу­нова, 2021

Эта книга — поша­го­вая инструк­ция по вёрстке сай­тов на язы­ках ХТМЛ и ЦСС. Вы узна­ете не только как свер­стать сайт, но и как опуб­ли­ко­вать его в интер­нете, настро­ить кра­си­вый шаринг в соц­сети и под­клю­чить системы аналитики.

Отдель­ный раз­дел книги посвя­щён работе с вер­сталь­щи­ком: как ста­вить задачи, полу­чать пред­ска­зу­е­мый резуль­тат и пра­вильно при­ни­мать и внед­рять вёрстку.

Оглавление

удк 004.42
ббк З973.42
П52
П52
Василий Половнёв, Игорь Петров
ХТМЛ. Вёрстка сайтов для дизайнеров, редакторов и руководителей.—
М.: Изд‑во Бюро Горбунова, 2021

Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.

Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.

Оглавление

Скрыто 130 разворотов

С помо­щью grid-auto-columns и grid-auto-flow можно собрать адап­тив­ные колонки, рав­но­мерно деля­щие доступ­ное пространство:

.cols {
  display: grid; /* Включаем гриды */
  grid-auto-columns: minmax(100px, 1fr); /* Пусть неявные колонки равномерно делят свободное пространство, сохраняя минимальную ширину в 100 пк */
  grid-auto-flow: column; /* Пусть невлезающие элементы выстраиваются в колонки */
  gap: 18px; /* Задаём межколонник в 18 пк */
  height: 100%; /* Растягиваем колонки по высоте */
}
<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Четвёртая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  <div>Вторая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Пятая колонка</div>
</div>
Пер­вая колонка
Вто­рая колонка
Тре­тья колонка
Чет­вёр­тая колонка
Пер­вая колонка
Вто­рая колонка
Пер­вая колонка
Вто­рая колонка
Тре­тья колонка
Чет­вёр­тая колонка
Пятая колонка
Первая колонка
Вторая колонка
Третья колонка
Чет­вёр­тая колонка
Первая колонка
Вторая колонка
Первая колонка
Вторая колонка
Третья колонка
Чет­вёр­тая колонка
Пятая колонка

С помощью grid-auto-columns и grid-auto-flow можно собрать адаптивные колонки, равномерно делящие доступное пространство:

.cols {
  display: grid; /* Включаем гриды */
  grid-auto-columns: minmax(100px, 1fr); /* Пусть неявные колонки равномерно делят свободное пространство, сохраняя минимальную ширину в 100 пк */
  grid-auto-flow: column; /* Пусть невлезающие элементы выстраиваются в колонки */
  gap: 18px; /* Задаём межколонник в 18 пк */
  height: 100%; /* Растягиваем колонки по высоте */
}
<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Четвёртая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  <div>Вторая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Пятая колонка</div>
</div>

Ком­би­на­цию grid-auto-columns с клю­че­выми сло­вами min-content, max-content или fit-content исполь­зуют для рас­кладки, в кото­рой ширина и коли­че­ство коло­нок зави­сит от содер­жи­мого. Напри­мер, при вёрстке гори­зон­таль­ного меню:

.menu {
  display: grid;
  grid-auto-flow: column; /* Автоматически раскладываем содержимое в колонки */
  grid-auto-columns: max-content; /* Автоматически создаём колонки по количеству пунктов меню с шириной по их содержимому. Мы используем max-content, а не min-content, чтобы пункты меню из нескольких слов всегда оставались в одну строку */
  column-gap: 20px; /* Задаём межколонник в 20 пк */
}

В слу­чае с тек­стом min‑content — это «займи так мало места, чтобы самое длин­ное слово вме­сти­лось», а max‑content — это «займи так много места, чтобы текст не при­ш­лось переносить».

Комбинацию grid-auto-columns с ключевыми словами min-content, max-content или fit-content используют для раскладки, в которой ширина и количество колонок зависит от содержимого. Например, при вёрстке горизонтального меню:

.menu {
  display: grid;
  grid-auto-flow: column; /* Автоматически раскладываем содержимое в колонки */
  grid-auto-columns: max-content; /* Автоматически создаём колонки по количеству пунктов меню с шириной по их содержимому. Мы используем max-content, а не min-content, чтобы пункты меню из нескольких слов всегда оставались в одну строку */
  column-gap: 20px; /* Задаём межколонник в 20 пк */
}

В случае с текстом min‑content — это «займи так мало места, чтобы самое длинное слово вместилось», а max‑content — это «займи так много места, чтобы текст не пришлось переносить».

По умол­ча­нию эле­менты в грид‑кон­тей­нере после­до­ва­тельно запол­няют его ячей­кой за ячей­кой, дви­га­ясь слева‑направо и сверху‑вниз. Чтобы рас­тя­нуть эле­мент на несколько ячеек, исполь­зуют grid-column и grid-row. С помо­щью них мы ука­зы­ваем началь­ную и конеч­ную направ­ля­ю­щие, соот­вет­ственно, всё про­стран­ство между ними отда­ётся элементу:

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* Три колонки, равномерно делящие пространство */
  grid-template-rows: repeat(5, minmax(75px, auto)); /* Пять строк с минимальной высотой в 75 пк */
  gap: 20px;
}
.one {
  grid-column: 1 / 3; /* Займи колонки от первой до третьей направляющей */
  grid-row: 1; /* Встань в первый ряд */
}

.two {
  grid-column: 2 / span 2; /* Займи две колонки, начиная со второй направляющей */
  grid-row: 1 / span 2; /* Займи два ряда, начиная со второй направляющей */
}

.three {
  grid-column: 1; /* Встань в первую колонку */
  grid-row: 2 / 5; /* Займи строки от второй до пятой направляющей */
}

.four {
  grid-column: 3;
  grid-row: 3 / span 2;
}

.five {
  grid-column: 2;
  grid-row: 4 / span 2;
}

.six {
  grid-column: 1;
  grid-row: 5;
}

One
Two
Three
Four
Five
Six
One
Two
Three
Four
Five
Six

По умолчанию элементы в грид‑контейнере последовательно заполняют его ячейкой за ячейкой, двигаясь слева‑направо и сверху‑вниз. Чтобы растянуть элемент на несколько ячеек, используют grid-column и grid-row. С помощью них мы указываем начальную и конечную направляющие, соответственно, всё пространство между ними отдаётся элементу:

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* Три колонки, равномерно делящие пространство */
  grid-template-rows: repeat(5, minmax(75px, auto)); /* Пять строк с минимальной высотой в 75 пк */
  gap: 20px;
}
.one {
  grid-column: 1 / 3; /* Займи колонки от первой до третьей направляющей */
  grid-row: 1; /* Встань в первый ряд */
}

.two {
  grid-column: 2 / span 2; /* Займи две колонки, начиная со второй направляющей */
  grid-row: 1 / span 2; /* Займи два ряда, начиная со второй направляющей */
}

.three {
  grid-column: 1; /* Встань в первую колонку */
  grid-row: 2 / 5; /* Займи строки от второй до пятой направляющей */
}

.four {
  grid-column: 3;
  grid-row: 3 / span 2;
}

.five {
  grid-column: 2;
  grid-row: 4 / span 2;
}

.six {
  grid-column: 1;
  grid-row: 5;
}

Meet Dynamic Island

48MP Main camera

The mastermind behind it all

A battery that’s all in, all day.

Film like a Pro.

Shaky shots, stable video

Always‑On display

Tougher than any smartphone glass

Water resistance

Emergency SOS via satellite

A camera in a class by itselfie.

Если в каче­стве зна­че­ний grid‑column или grid‑row задать auto, бра­у­зер сам решит, что делать с эле­мен­том и его пози­цией: эле­менты раз­ме­стятся в том же порядке, что и в коде, зани­мая по одной ячейке. Но если исполь­зо­вать auto / span N, то эле­мент зай­мёт N коло­нок или строк, начи­ная с теку­щего места. Так можно полу­чить «пли­точ­ную вёрстку», в кото­рой поря­док и раз­меры эле­мен­тов опре­де­ля­ются их раз­мет­кой. Напри­мер, как на про­мо­стра­ни­цах Эпла.

Чтобы свер­стать похо­жие этажи, вклю­чим гриды, зада­дим направ­ля­ю­щие и вве­дём четыре вари­а­ции плиток:

.grid {
  display: grid; /* Включаем раскладку гридами  */
  grid-template-columns: 1.85fr 1fr 1.85fr; /* Задаём резиновые направляющие для колонок: первая и третья в 1,85 раза больше центральной */
  grid-auto-rows: 320px; /* Задаём автоматические направляющие для строк: каждые 320 пикселей */
  gap: 20px; /* Задаём межстрочник и межколонник в 20 пк */
  background: #161617;
}

.tile {
  padding: 15px;
  border-radius: 15px;
  background: #000;
  color: #ffb6ff;
}

/* «Плитка» на одну ячейку */
.tile-1-cols-1-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 1;
}

/* Плитка на одну колонку и две строки */
.tile-1-cols-2-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 2;
}

/* Плитка на две колонки и одну строку */
.tile-2-cols-1-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 1;
}

/* Плитка на 2 колонки и 2 строки */
.tile-2-cols-2-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 2;
}
<div class="grid">
  <div class="tile tile-2-cols-2-rows">
    <h2>Meet Dynamic Island</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>48MP Main camera</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>The mastermind behind it all</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <p>A battery that’s all in, all day.</p>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>Film like a Pro.</p>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <p>Shaky shots, stable video</p>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Always-On display</h2>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Tougher than any smartphone glass</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>Water resistance</h2>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <h2>Emergency SOS via satellite</h2>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>A camera in a class by itselfie.</p>
  </div>
</div>

Meet Dynamic Island

48MP Main camera

The mastermind behind it all

A battery that’s all in, all day.

Film like a Pro.

Shaky shots, stable video

Always‑On display

Tougher than any smartphone glass

Water resistance

Emergency SOS via satellite

A camera in a class by itselfie.

Если в качестве значений grid‑column или grid‑row задать auto, браузер сам решит, что делать с элементом и его позицией: элементы разместятся в том же порядке, что и в коде, занимая по одной ячейке. Но если использовать auto / span N, то элемент займёт N колонок или строк, начиная с текущего места. Так можно получить «плиточную вёрстку», в которой порядок и размеры элементов определяются их разметкой. Например, как на промостраницах Эпла.

Чтобы сверстать похожие этажи, включим гриды, зададим направляющие и введём четыре вариации плиток:

.grid {
  display: grid; /* Включаем раскладку гридами  */
  grid-template-columns: 1.85fr 1fr 1.85fr; /* Задаём резиновые направляющие для колонок: первая и третья в 1,85 раза больше центральной */
  grid-auto-rows: 320px; /* Задаём автоматические направляющие для строк: каждые 320 пикселей */
  gap: 20px; /* Задаём межстрочник и межколонник в 20 пк */
  background: #161617;
}

.tile {
  padding: 15px;
  border-radius: 15px;
  background: #000;
  color: #ffb6ff;
}

/* «Плитка» на одну ячейку */
.tile-1-cols-1-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 1;
}

/* Плитка на одну колонку и две строки */
.tile-1-cols-2-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 2;
}

/* Плитка на две колонки и одну строку */
.tile-2-cols-1-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 1;
}

/* Плитка на 2 колонки и 2 строки */
.tile-2-cols-2-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 2;
}
<div class="grid">
  <div class="tile tile-2-cols-2-rows">
    <h2>Meet Dynamic Island</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>48MP Main camera</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>The mastermind behind it all</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <p>A battery that’s all in, all day.</p>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>Film like a Pro.</p>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <p>Shaky shots, stable video</p>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Always-On display</h2>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Tougher than any smartphone glass</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>Water resistance</h2>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <h2>Emergency SOS via satellite</h2>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>A camera in a class by itselfie.</p>
  </div>
</div>

justify‑items: stretch, по умолчанию

🕑

justify‑items: center

🕑

justify‑items: start

🕑

justify‑items: end

🕑

Выравнивание

Чтобы выров­нять грид‑эле­менты внутри ячеек, исполь­зуем justify-items у грид‑кон­тей­нера. По умол­ча­нию эле­менты рас­тя­ги­ва­ются на всю ячейку, но можно при­жать их к началу, концу или цен­тру ячейки.

Похо­жее свой­ство во флек­с­бок­сах назы­ва­лось justify-content, но у justify-items свои вари­анты зна­че­ний, и оно не зави­сит от оси рас­кладки — все­гда вырав­ни­вает эле­менты по горизонтали.

Выравнивание

Чтобы выровнять грид‑элементы внутри ячеек, используем justify-items у грид‑контейнера. По умолчанию элементы растягиваются на всю ячейку, но можно прижать их к началу, концу или центру ячейки.

Похожее свойство во флексбоксах называлось justify-content, но у justify-items свои варианты значений, и оно не зависит от оси раскладки — всегда выравнивает элементы по горизонтали.

justify‑items: stretch, по умолчанию

🕑

justify‑items: start

🕑

justify‑items: center

🕑

justify‑items: end

🕑
Скрыто 85 разворотов