🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Аркадий Мильчин и Людмила Чельцова. Справочник издателя и автора
Вёрстка сложных таблиц требует особой внимательности и аккуратности, чтобы не запутаться и не сломать структуру. Из‑за особенностей работы табличных тегов, иногда приходится писать громоздкие стили, чтобы добиться результата.
Перед вёрсткой таблицы полезно сначала прикинуть её структуру на бумаге, а не бросаться сразу в код.
Внимательно изучите примеры. Попробуйте скопировать код, дополнить или изменить структуру и стили.
Для сдвига элементов группы «Виброустойчивость» заводим отдельный класс. Чтобы запретить переносы в названиях колонок и ячейках, используем атрибут nowrap, в отдельных значениях — тег nobr.
<h3>
Кнопки и переключатели кнопочные
</h3>
<table>
<thead>
<tr>
<th width="30%">Показатели</th>
<th nowrap>МПК 1-1, 2-1</th>
<th nowrap>КН</th>
<th nowrap>КМ А1-IV, 1-1, 2-1</th>
</tr>
</thead>
<tbody>
<tr>
<td>Схема коммутации</td>
<td><img src="schemes/mpk.svg"></td>
<td><img src="schemes/kn.svg"></td>
<td><img src="schemes/km.svg"></td>
</tr>
<tr>
<td>Напряжение коммутации, В</td>
<td>30</td>
<td>50</td>
<td>=30~220</td>
</tr>
<tr>
<td>Ток коммутации, A</td>
<td>0,5</td>
<td>1,5 (250 Вт)</td>
<td>=4~3</td>
</tr>
<tr>
<td>Температура, ˚C</td>
<td>−60…+100</td>
<td>−60…+85</td>
<td>−60…+85</td>
</tr>
<tr>
<td>Виброустойчивость:</td>
</tr>
<tr class="indented">
<td>частота, Гц</td>
<td>10…2 500</td>
<td>5…80</td>
<td>5…200</td>
</tr>
<tr class="indented">
<td>ускорение, g, <nobr>м/с²</nobr></td>
<td>12</td>
<td>6</td>
<td>7</td>
</tr>
<tr>
<td>Ускорение при ударной нагрузке, g, <nobr>м/с²</nobr></td>
<td>75</td>
<td>7</td>
<td>150</td>
</tr>
</tbody>
</table>
html {
font-family: Helvetica;
}
/* Стилизуем заголовок под обычный курсивный текст. Честный заголовок, а не просто теги p и i лучше в плане семантики */
h3 {
font-weight: normal;
font-style: italic;
}
/* Базовая дизайнерская гигиена таблицы: ужимаем по ширине, выравниваем всё по левому верхнему краю */
table {
border-collapse: collapse;
width: min-content;
font-size: inherit;
}
th,
td {
vertical-align: top;
text-align: left;
}
th,
tr td {
padding: 18px 18px 0 0;
}
/* Нижняя граница шапки задаётся в её ячейках */
th {
padding-top: 0;
padding-bottom: 9px;
border-bottom: 1px solid;
}
/* Правый падинг у последних ячеек не нужен */
td:last-child,
th:last-child {
padding-right: 0;
}
/* Трюки с группой, сдвигаем элементы группы правее */
tr.indented td:first-child {
padding-left: 18px;
}
/* Уменьшаем верхние отступы группы и элементов */
tr:not(.indented) + tr.indented td {
padding-top: 9px;
}
tr.indented td {
padding-top: 13px;
}
Тут без хитростей, располагаем таблицы внутри контейнера в ряд. Обратите внимание на тег нижнего индекса sub в подписи таблицы. Для верхнего индекса используется его брат sup.
<div class="doubleTable">
<table>
<thead>
<tr>
<th>Тип панели</th>
<th>Высота цилиндрической части баллона лампы, мм</th>
</tr>
</thead>
<tbody>
<tr>
<td nowrap>ПЛК9-Д-31</td>
<td>28—31</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-40</td>
<td>37—43</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-55</td>
<td>52—58</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-60</td>
<td>57—63</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Тип панели</th>
<th>Высота цилиндрической части баллона лампы, мм</th>
</tr>
</thead>
<tbody>
<tr>
<td nowrap>ПЛК9-Э-46</td>
<td>28—34</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-55</td>
<td>37—43</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-70</td>
<td>52—58</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-75</td>
<td>57—63</td>
</tr>
</tbody>
</table>
</div>
<p>
<i>Примечание.</i> Размер H<sub>макс</sub> (мм) — последние две цифры марки.
</p>
/* Основные стили таблицы как в прошлых примерах */
.doubleTable {
display: flex;
align-items: flex-start;
justify-content: flex-start;
flex-wrap: nowrap;
}
.doubleTable table:not(:last-child) {
border-right: 1px solid;
margin-right: 18px;
}
Поскольку групп много, проще по умолчанию сдвигать все строки влево, убирая сдвиг для заголовков групп и увеличивая их верхний отступ.
<table>
<thead>
<tr>
<th rowspan="2">Вид литья и литейные сплавы (металлы)</th>
<th class="borderBottom" colspan="7">Площадь сплошной поверхности отливки, см²</th>
</tr>
<tr>
<td>≤25</td>
<td>>25</td>
<td>>100</td>
<td>>225</td>
<td>>400</td>
<td>>1000</td>
<td>>1600</td>
</tr>
</thead>
<tbody>
<tr class="groupStart">
<td colspan="8">В песчаные формы</td>
</tr>
<tr>
<td>АЛ2</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
</tr>
<tr>
<td>МЛ5</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>4,5</td>
<td>5,0</td>
<td>6,0</td>
<td>7,0</td>
</tr>
<tr>
<td>Чугун</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td>7,0</td>
</tr>
<tr class="groupStart">
<td colspan="8">В кокиль</td>
</tr>
<tr>
<td>АЛ2</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>МЛ5</td>
<td>3,0</td>
<td>3,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td></td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">В оболочковые формы</td>
</tr>
<tr>
<td>Алюминиевые</td>
<td>2,0</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
</tr>
<tr>
<td>Медные</td>
<td>2,0</td>
<td>2,0</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
</tr>
<tr>
<td>Сталь</td>
<td>2,0</td>
<td>2,0</td>
<td>4,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">Под давлением</td>
</tr>
<tr>
<td>Оловянистые</td>
<td>0,6</td>
<td>0,7</td>
<td>1,1</td>
<td>1,5</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Цинковые</td>
<td>0,8</td>
<td>1,0</td>
<td>1,5</td>
<td>2,0</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Магниевые</td>
<td>1,3</td>
<td>1,8</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Алюминиевые</td>
<td>1,0</td>
<td>1,5</td>
<td>2,0</td>
<td>2,5</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Медные</td>
<td>1,5</td>
<td>2,0</td>
<td>3,0</td>
<td>3,5</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">По выплавляемым моделям</td>
</tr>
<tr>
<td>Сталь</td>
<td>1,5</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
/* Основные стили таблицы как в прошлых примерах */
/* Конкретно в этой таблице нужна первая колонка пошире, задаём ей минимальную ширину */
th:first-child {
min-width: 200px;
}
/* Увеличенный верхний отступ между группами */
tr.groupStart td {
padding-top: 18px;
}
/* По умолчанию сдвигаем все первые ячейки, если они в теле таблицы и не вложены в .groupStart */
tbody tr:not(.groupStart) td:first-child {
padding-left: 18px;
}
.borderBottom {
border-bottom: 1px solid;
}Вёрстка сложных таблиц требует особой внимательности и аккуратности, чтобы не запутаться и не сломать структуру. Из‑за особенностей работы табличных тегов, иногда приходится писать громоздкие стили, чтобы добиться результата.
Перед вёрсткой таблицы полезно сначала прикинуть её структуру на бумаге, а не бросаться сразу в код.
Внимательно изучите примеры. Попробуйте скопировать код, дополнить или изменить структуру и стили.
Для сдвига элементов группы «Виброустойчивость» заводим отдельный класс. Чтобы запретить переносы в названиях колонок и ячейках, используем атрибут nowrap, в отдельных значениях — тег nobr.
<h3>
Кнопки и переключатели кнопочные
</h3>
<table>
<thead>
<tr>
<th width="30%">Показатели</th>
<th nowrap>МПК 1-1, 2-1</th>
<th nowrap>КН</th>
<th nowrap>КМ А1-IV, 1-1, 2-1</th>
</tr>
</thead>
<tbody>
<tr>
<td>Схема коммутации</td>
<td><img src="schemes/mpk.svg"></td>
<td><img src="schemes/kn.svg"></td>
<td><img src="schemes/km.svg"></td>
</tr>
<tr>
<td>Напряжение коммутации, В</td>
<td>30</td>
<td>50</td>
<td>=30~220</td>
</tr>
<tr>
<td>Ток коммутации, A</td>
<td>0,5</td>
<td>1,5 (250 Вт)</td>
<td>=4~3</td>
</tr>
<tr>
<td>Температура, ˚C</td>
<td>−60…+100</td>
<td>−60…+85</td>
<td>−60…+85</td>
</tr>
<tr>
<td>Виброустойчивость:</td>
</tr>
<tr class="indented">
<td>частота, Гц</td>
<td>10…2 500</td>
<td>5…80</td>
<td>5…200</td>
</tr>
<tr class="indented">
<td>ускорение, g, <nobr>м/с²</nobr></td>
<td>12</td>
<td>6</td>
<td>7</td>
</tr>
<tr>
<td>Ускорение при ударной нагрузке, g, <nobr>м/с²</nobr></td>
<td>75</td>
<td>7</td>
<td>150</td>
</tr>
</tbody>
</table>
Аркадий Мильчин и Людмила Чельцова. Справочник издателя и автора
html {
font-family: Helvetica;
}
/* Стилизуем заголовок под обычный курсивный текст. Честный заголовок, а не просто теги p и i лучше в плане семантики */
h3 {
font-weight: normal;
font-style: italic;
}
/* Базовая дизайнерская гигиена таблицы: ужимаем по ширине, выравниваем всё по левому верхнему краю */
table {
border-collapse: collapse;
width: min-content;
font-size: inherit;
}
th,
td {
vertical-align: top;
text-align: left;
}
th,
tr td {
padding: 18px 18px 0 0;
}
/* Нижняя граница шапки задаётся в её ячейках */
th {
padding-top: 0;
padding-bottom: 9px;
border-bottom: 1px solid;
}
/* Правый падинг у последних ячеек не нужен */
td:last-child,
th:last-child {
padding-right: 0;
}
/* Трюки с группой, сдвигаем элементы группы правее */
tr.indented td:first-child {
padding-left: 18px;
}
/* Уменьшаем верхние отступы группы и элементов */
tr:not(.indented) + tr.indented td {
padding-top: 9px;
}
tr.indented td {
padding-top: 13px;
}
Тут без хитростей, располагаем таблицы внутри контейнера в ряд. Обратите внимание на тег нижнего индекса sub в подписи таблицы. Для верхнего индекса используется его брат sup.
<div class="doubleTable">
<table>
<thead>
<tr>
<th>Тип панели</th>
<th>Высота цилиндрической части баллона лампы, мм</th>
</tr>
</thead>
<tbody>
<tr>
<td nowrap>ПЛК9-Д-31</td>
<td>28—31</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-40</td>
<td>37—43</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-55</td>
<td>52—58</td>
</tr>
<tr>
<td nowrap>ПЛК9-Д-60</td>
<td>57—63</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Тип панели</th>
<th>Высота цилиндрической части баллона лампы, мм</th>
</tr>
</thead>
<tbody>
<tr>
<td nowrap>ПЛК9-Э-46</td>
<td>28—34</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-55</td>
<td>37—43</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-70</td>
<td>52—58</td>
</tr>
<tr>
<td nowrap>ПЛК9-Э-75</td>
<td>57—63</td>
</tr>
</tbody>
</table>
</div>
<p>
<i>Примечание.</i> Размер H<sub>макс</sub> (мм) — последние две цифры марки.
</p>
/* Основные стили таблицы как в прошлых примерах */
.doubleTable {
display: flex;
align-items: flex-start;
justify-content: flex-start;
flex-wrap: nowrap;
}
.doubleTable table:not(:last-child) {
border-right: 1px solid;
margin-right: 18px;
}
Поскольку групп много, проще по умолчанию сдвигать все строки влево, убирая сдвиг для заголовков групп и увеличивая их верхний отступ.
<table>
<thead>
<tr>
<th rowspan="2">Вид литья и литейные сплавы (металлы)</th>
<th class="borderBottom" colspan="7">Площадь сплошной поверхности отливки, см²</th>
</tr>
<tr>
<td>≤25</td>
<td>>25</td>
<td>>100</td>
<td>>225</td>
<td>>400</td>
<td>>1000</td>
<td>>1600</td>
</tr>
</thead>
<tbody>
<tr class="groupStart">
<td colspan="8">В песчаные формы</td>
</tr>
<tr>
<td>АЛ2</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
</tr>
<tr>
<td>МЛ5</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>4,5</td>
<td>5,0</td>
<td>6,0</td>
<td>7,0</td>
</tr>
<tr>
<td>Чугун</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td>7,0</td>
</tr>
<tr class="groupStart">
<td colspan="8">В кокиль</td>
</tr>
<tr>
<td>АЛ2</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>МЛ5</td>
<td>3,0</td>
<td>3,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td></td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">В оболочковые формы</td>
</tr>
<tr>
<td>Алюминиевые</td>
<td>2,0</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
</tr>
<tr>
<td>Медные</td>
<td>2,0</td>
<td>2,0</td>
<td>3,0</td>
<td>3,5</td>
<td>4,0</td>
<td>4,0</td>
<td></td>
</tr>
<tr>
<td>Сталь</td>
<td>2,0</td>
<td>2,0</td>
<td>4,0</td>
<td>4,0</td>
<td>5,0</td>
<td>6,0</td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">Под давлением</td>
</tr>
<tr>
<td>Оловянистые</td>
<td>0,6</td>
<td>0,7</td>
<td>1,1</td>
<td>1,5</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Цинковые</td>
<td>0,8</td>
<td>1,0</td>
<td>1,5</td>
<td>2,0</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Магниевые</td>
<td>1,3</td>
<td>1,8</td>
<td>2,5</td>
<td>3,0</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Алюминиевые</td>
<td>1,0</td>
<td>1,5</td>
<td>2,0</td>
<td>2,5</td>
<td>4,0</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Медные</td>
<td>1,5</td>
<td>2,0</td>
<td>3,0</td>
<td>3,5</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr class="groupStart">
<td colspan="8">По выплавляемым моделям</td>
</tr>
<tr>
<td>Сталь</td>
<td>1,5</td>
<td>2,0</td>
<td>2,5</td>
<td>3,0</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
/* Основные стили таблицы как в прошлых примерах */
/* Конкретно в этой таблице нужна первая колонка пошире, задаём ей минимальную ширину */
th:first-child {
min-width: 200px;
}
/* Увеличенный верхний отступ между группами */
tr.groupStart td {
padding-top: 18px;
}
/* По умолчанию сдвигаем все первые ячейки, если они в теле таблицы и не вложены в .groupStart */
tbody tr:not(.groupStart) td:first-child {
padding-left: 18px;
}
.borderBottom {
border-bottom: 1px solid;
}Лучше не использовать табличные теги в папках писем и других интерфейсных списках, иначе код станет громоздким и неуправляемым. Технологичнее использовать обычные дивы.
ХТМЛ‑таблицы — хрупкий материал. Они подходят для справочных таблиц, но за пределами этой задачи начинаются проблемы. Ориентироваться в структуре табличных тегах заметно сложнее, чем в структуре обычных дивов. В таблицах тяжело управлять отступами между ячейками и выстроить надёжную и гибкую систему отступов.
В интерфейсах лучше не городить табличную структуру, а использовать обычные дивы. Управлять их отступами и позицией гораздо проще — в дивах работают все ЦСС‑свойства, в отличие от табличных тегов.
<h2>Входящие</h2>
<div class="mailbox">
<div class="mailRow">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">☆</button>
<span class="mailRow__sender">Яндекс.Практикум</span>
<strong class="mailRow__subj">Платёж успешно выполнен</strong>
<span class="mailRow__date">13 августа</span>
</div>
</div>
<div class="mailRow is__active">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">☆</button>
<span class="mailRow__sender">hoster.by</span>
<span class="mailRow__subj">Дарим наггетсы за участие в опросе</span>
<span class="mailRow__date">10 августа</span>
</div>
<div class="mailRow__in">
<h1>Дарим наггетсы за участие в опросе</h1>
<p>Привет! Вы нас может уже и не помните, а вот мы вас частенько вспоминаем.</p>
<p>Нет времени объяснять — нам нужно всего 6 минут вашего времени, чтобы узнать, как вы к нам относитесь. За ответы на вопросы подарим промокод на бесплатные наггетсы от наших друзей из Burger King.</p>
<a href="#">Ответить на вопросы</a>
</div>
</div>
<div class="mailRow">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">★</button>
<span class="mailRow__sender">Фонотека</span>
<span class="mailRow__subj">Кругосветка за четыре дня: -30% на немецкий краут, американский блюз, японский винил</span>
<span class="mailRow__date">9 августа</span>
</div>
</div>
<-- … -->
</div>
body {
font-family: Helvetica;
}
.mailbox {
font-size: .8em;
}
.mailRow {
border-bottom: 1px solid rgba(0, 0, 0, .05);
}
.mailRow.is__active {
background: rgba(0, 0, 0, .05)
}
.mailRow__preview {
display: flex;
align-items: center;
justify-content: flex-start;
gap: .15em;
flex-wrap: nowrap;
white-space: pre-wrap;
padding: .3em .5em .7em;
box-sizing: border-box;
}
.mailRow__sender {
width: 25%;
}
/* Тут рюк с многоточием для длинных строк */
.mailRow__subj {
flex-grow: 1;
/* Ограничиваем ширину */
max-width: 50%;
/* Запрещаем перенос строки */
white-space: nowrap;
/* Обрезаем всё, что вылезло за ширину, а текст обрезаем многоточием */
overflow: hidden;
text-overflow: ellipsis;
}
.mailRow__date {
flex-grow: 1;
text-align: right;
}
.mailRow__in {
width: 100%;
font-size: .9em;
padding: 1em 1em 2em;
box-sizing: border-box;
}
.mailRow h1 {
margin-top: 0;
}
.mailRow__in a {
color: inherit;
}
/* Сбрасываем стандартные стили кнопки */
.btnStar {
border: none;
background: none;
}Лучше не использовать табличные теги в папках писем и других интерфейсных списках, иначе код станет громоздким и неуправляемым. Технологичнее использовать обычные дивы.
ХТМЛ‑таблицы — хрупкий материал. Они подходят для справочных таблиц, но за пределами этой задачи начинаются проблемы. Ориентироваться в структуре табличных тегах заметно сложнее, чем в структуре обычных дивов. В таблицах тяжело управлять отступами между ячейками и выстроить надёжную и гибкую систему отступов.
В интерфейсах лучше не городить табличную структуру, а использовать обычные дивы. Управлять их отступами и позицией гораздо проще — в дивах работают все ЦСС‑свойства, в отличие от табличных тегов.
<h2>Входящие</h2>
<div class="mailbox">
<div class="mailRow">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">☆</button>
<span class="mailRow__sender">Яндекс.Практикум</span>
<strong class="mailRow__subj">Платёж успешно выполнен</strong>
<span class="mailRow__date">13 августа</span>
</div>
</div>
<div class="mailRow is__active">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">☆</button>
<span class="mailRow__sender">hoster.by</span>
<span class="mailRow__subj">Дарим наггетсы за участие в опросе</span>
<span class="mailRow__date">10 августа</span>
</div>
<div class="mailRow__in">
<h1>Дарим наггетсы за участие в опросе</h1>
<p>Привет! Вы нас может уже и не помните, а вот мы вас частенько вспоминаем.</p>
<p>Нет времени объяснять — нам нужно всего 6 минут вашего времени, чтобы узнать, как вы к нам относитесь. За ответы на вопросы подарим промокод на бесплатные наггетсы от наших друзей из Burger King.</p>
<a href="#">Ответить на вопросы</a>
</div>
</div>
<div class="mailRow">
<div class="mailRow__preview">
<input type="checkbox">
<button type="button" class="btnStar">★</button>
<span class="mailRow__sender">Фонотека</span>
<span class="mailRow__subj">Кругосветка за четыре дня: -30% на немецкий краут, американский блюз, японский винил</span>
<span class="mailRow__date">9 августа</span>
</div>
</div>
<-- … -->
</div>
body {
font-family: Helvetica;
}
.mailbox {
font-size: .8em;
}
.mailRow {
border-bottom: 1px solid rgba(0, 0, 0, .05);
}
.mailRow.is__active {
background: rgba(0, 0, 0, .05)
}
.mailRow__preview {
display: flex;
align-items: center;
justify-content: flex-start;
gap: .15em;
flex-wrap: nowrap;
white-space: pre-wrap;
padding: .3em .5em .7em;
box-sizing: border-box;
}
.mailRow__sender {
width: 25%;
}
/* Тут рюк с многоточием для длинных строк */
.mailRow__subj {
flex-grow: 1;
/* Ограничиваем ширину */
max-width: 50%;
/* Запрещаем перенос строки */
white-space: nowrap;
/* Обрезаем всё, что вылезло за ширину, а текст обрезаем многоточием */
overflow: hidden;
text-overflow: ellipsis;
}
.mailRow__date {
flex-grow: 1;
text-align: right;
}
.mailRow__in {
width: 100%;
font-size: .9em;
padding: 1em 1em 2em;
box-sizing: border-box;
}
.mailRow h1 {
margin-top: 0;
}
.mailRow__in a {
color: inherit;
}
/* Сбрасываем стандартные стили кнопки */
.btnStar {
border: none;
background: none;
}ХТМЛ позволяет сверстать и базово настроить поведение формы.
Чтобы оживить форму и отправлять данные из неё на сервер, понадобится сам сервер и дополнительное программирование.
Мы не будем подробно останавливаться на программировании форм — это выходит далеко за рамки книги. Но научимся собирать данные формы с помощью сервиса «Формкип».
Можно и вовсе не верстать форму, а использовать сервисы‑конструкторы. В них вы собираете форму из типовых элементов, а затем получаете кусок кода для встраивания формы на сайт. Чаще всего, формы собирают в Гугль‑ и Яндекс‑формах или в «Формкипе».
ХТМЛ позволяет сверстать и базово настроить поведение формы.
Чтобы оживить форму и отправлять данные из неё на сервер, понадобится сам сервер и дополнительное программирование.
Мы не будем подробно останавливаться на программировании форм — это выходит далеко за рамки книги. Но научимся собирать данные формы с помощью сервиса «Формкип».
Можно и вовсе не верстать форму, а использовать сервисы‑конструкторы. В них вы собираете форму из типовых элементов, а затем получаете кусок кода для встраивания формы на сайт. Чаще всего, формы собирают в Гугль‑ и Яндекс‑формах или в «Формкипе».
Форму верстают внутри одноимённого тега‑обёртки. Это облегчит жизнь, когда дело дойдёт до отправки данных формы.
Внутри обёртки помещают элементы формы. У них много уникальных атрибутов, часть из них нужна только при программировании отправки формы, другие атрибуты влияют на внешний вид и поведение полей.
Скоро мы ближе познакомимся с элементами формы и их атрибутами, а пока внимательно изучите код формы‑примера с комментариями.
Флексбоксы
<form>
<!-- placeholder видно в поле до начала ввода -->
<input type="text" placeholder="Логин" />
<!-- type="password" прячет вводимые символы -->
<input type="password" placeholder="Пароль" />
<button type="submit">Войти</button>
</form>
form {
/* Расставим элементы в колонку с отступами */
display: flex;
flex-direction: column;
align-items: flex-start;
gap: .5em;
}
/* Особым псевдоклассом перекрасим плейсхолдеры */
::placeholder {
color: #ddd;
}
/* Выделим общие стили для полей и кнопок */
input,
button {
font-size: 1.8em;
border-radius: 8px;
}
input {
padding: 0.3em;
border: 2px solid #ddd;
}
button {
padding: 0.3em 1.15em;
/* Уберём обводку, которую браузер добавляет кнопкам по умолчанию */
border: none;
background: #ff5722;
color: #fff;
}
Форму верстают внутри одноимённого тега‑обёртки. Это облегчит жизнь, когда дело дойдёт до отправки данных формы.
Внутри обёртки помещают элементы формы. У них много уникальных атрибутов, часть из них нужна только при программировании отправки формы, другие атрибуты влияют на внешний вид и поведение полей.
Скоро мы ближе познакомимся с элементами формы и их атрибутами, а пока внимательно изучите код формы‑примера с комментариями.
Флексбоксы
<form>
<!-- placeholder видно в поле до начала ввода -->
<input type="text" placeholder="Логин" />
<!-- type="password" прячет вводимые символы -->
<input type="password" placeholder="Пароль" />
<button type="submit">Войти</button>
</form>
form {
/* Расставим элементы в колонку с отступами */
display: flex;
flex-direction: column;
align-items: flex-start;
gap: .5em;
}
/* Особым псевдоклассом перекрасим плейсхолдеры */
::placeholder {
color: #ddd;
}
/* Выделим общие стили для полей и кнопок */
input,
button {
font-size: 1.8em;
border-radius: 8px;
}
input {
padding: 0.3em;
border: 2px solid #ddd;
}
button {
padding: 0.3em 1.15em;
/* Уберём обводку, которую браузер добавляет кнопкам по умолчанию */
border: none;
background: #ff5722;
color: #fff;
}
В ХТМЛ‑формах элементы ввода дают человеку ввести или уточнить данные: поля, чекбоксы, радиокнопки, выпадающие списки и другие элементы. Разработчики называют элементы ввода инпутами, потому что почти всегда это тег input.
Инпуты отличаются типами — атрибутом type. Тип влияет на внешний вид инпута и форматирование вводимых данных.
Инпут с type="password" скроет вводимый текст, type="number" не даст ввести буквы, а type="date" покажет формат ввода даты, а в некоторых браузерах добавит кнопку вызова календарика. Файловый инпут поддерживает перетягивание файла на себя, а инпут цвета открывает палитру выбора цвета.
Особняком среди инпутов стоят чекбоксы, радиокнопки и выпадающие списки. Их вёрстка отличается от вёрстки остальных инпутов, поэтому далее мы разберём их отдельно.
В некоторых браузерах стандартные стили инпутов выглядят странно и аляповато. Позже мы поговорим о том, что с этим можно сделать и нужно ли это делать
<input type="text">
type="text"
type="number"
type="password"
type="date"
type="datetime‑local"
type="time"
type="file"
type="color"
type="range"
В ХТМЛ‑формах элементы ввода дают человеку ввести или уточнить данные: поля, чекбоксы, радиокнопки, выпадающие списки и другие элементы. Разработчики называют элементы ввода инпутами, потому что почти всегда это тег input.
Инпуты отличаются типами — атрибутом type. Тип влияет на внешний вид инпута и форматирование вводимых данных.
Инпут с type="password" скроет вводимый текст, type="number" не даст ввести буквы, а type="date" покажет формат ввода даты, а в некоторых браузерах добавит кнопку вызова календарика. Файловый инпут поддерживает перетягивание файла на себя, а инпут цвета открывает палитру выбора цвета.
Особняком среди инпутов стоят чекбоксы, радиокнопки и выпадающие списки. Их вёрстка отличается от вёрстки остальных инпутов, поэтому далее мы разберём их отдельно.
В некоторых браузерах стандартные стили инпутов выглядят странно и аляповато. Позже мы поговорим о том, что с этим можно сделать и нужно ли это делать
<input type="text">
type="text"
type="number"
type="password"
type="date"
type="datetime‑local"
type="time"
type="file"
type="color"
type="range"