Как �вер�тать ново�тной портал
Ðта Ñ�татьÑ� оÑ�нована на одном из практичеÑ�ких заданий verstaem.online.
Вы можете читать материал как обычное руковод�тво или �начала попробовать выполнить задание �амо�то�тельно, а затем �равнить �вое решение � подробным разбором.
Перейти к заданиюВ �том задании мы �вер�таем главную �траницу ново�тного портала. Зде�ь �разу в�тречает�� не�колько разных типов блоков: больша� главна� ново�ть, бокова� колонка � по�ледними публикаци�ми, карточки �татей и полноценна� �етка контента.
Создаем HTML-разметку
Сначала �оздадим базовую HTML-разметку � помощью Emmet. Дл� �того до�таточно вве�ти ! и нажать Tab. Обратите внимание на атрибут lang. По�кольку о�новной контент �траницы напи�ан на ру��ком �зыке, зде�ь и�пользуем значение ru.
<!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>
</body>
</html>
Ðто задание макÑ�имально похоже на наÑ�тоÑ�щий Ñ�айт, а не его фрагмент, поÑ�тому мы будем верÑ�тать его также — Ñ� иÑ�пользованием шапки, main и так далее.
Шапку как раз делаем тегом <header>. Внутри нее ра�положим контейнер, который выровн�ет по центру ве�ь контент, а уже внутри него — о�новное �одержимое. Именно блоку внутри контейнера мы зададим обводку �низу, как на макете.
Ð�у, а в шапке добавлÑ�ем дату, заголовок, и меню. Меню, конечно, реализуем через <nav>, а внутри иÑ�пользуем Ñ�пиÑ�ок. Ðто макÑ�имально Ñ�емантичный вариант верÑ�тки меню, когда Ñ�кринридер поймет и что Ñ�то навигациÑ�, и что здеÑ�ÑŒ еÑ�ть Ñ�пиÑ�ок и у него определенное количеÑ�тво Ñ�лементов.
<header class="header">
<div class="container">
<div class="header__inner">
<div class="header__date">22 июн� 2026</div>
<h1 class="header__title">Ежедневные ново�ти</h1>
<nav class="nav">
<ul class="nav__list">
<li class="nav__item">
<a href="#" class="nav__link">Политика</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">Ðкономика</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">Технологии</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">�аука</a>
</li>
<li class="nav__item">
<a href="#" class="nav__link">Культура</a>
</li>
</ul>
</nav>
</div>
</div>
</header>
Далее у на� идут �татьи — о�новное �одержимое �айта. По�тому их �тоит заключить в тег <main>. � �ами �татьи еще дополнительно в <section>.
ПоÑ�кольку Ñ�екции обÑ�зательно должны иметь внутри Ñ�ебÑ� заголовок — делаем его. Даже еÑ�ли его нет в макете. Мы проÑ�то Ñ�кроем его, иÑ�пользуÑ� паттерн visually-hidden. Ðтот паттерн подразумевает, что Ñ�лемент внешне Ñ�крываетÑ�Ñ�, но оÑ�таетÑ�Ñ� читаем длÑ� Ñ�кринридеров. И конечно же, не забудьте container вмеÑ�те Ñ� клаÑ�Ñ�ом grid.
<main>
<section class="news">
<h2 class="visually-hidden">Спи�ок ново�тей</h2>
<div class="container grid">
</div>
</section>
</main>
Сделаем Ñ�татью через <article>, а боковую колонку через <aside>, В оÑ�тальном тут вÑ�е Ñ�тандартно, разве что рекомендую обратить внимание на уровни заголовков. КÑ�тати, заметьте, что в данной Ñ�татье изображение Ñ�делано не фоном, как могло показатьÑ�Ñ�, а через <img>, и при Ñ�том у него не заполнен alt. Ðто Ñ�делано Ñ�пециально, чтобы показать, что таким образом тоже можно делать фон. Ð� aria-hidden как раз Ñ�крывает изображение от Ñ�кринридеров полноÑ�тью, поÑ�тому и заполнение alt необÑ�зательно.
<article class="news__main">
<img src="img/1.png" aria-hidden="true" alt="" class="news__pic" />
<div class="news__text">
<a href="#" class="news__category">Технологии</a>
<h3 class="news__title">
<a href="#" class="news__link">
И�ку��твенный интеллект мен�ет привычные подходы к разработке
</a>
</h3>
<p class="news__descr">
Компании активно внедр�ют новые ин�трументы, повыша� �коро�ть
�оздани� цифровых продуктов.
</p>
</div>
</article>
<aside class="news__aside">
<h3 class="news__subtitle">По�ледние ново�ти</h3>
<ul class="news__list">
<li class="news__item">
<article class="news-mini-card">
<a href="#" class="news-mini-card__category">Ðкономика</a>
<h4 class="news-mini-card__title">
<a href="#" class="news-mini-card__link">
Рынок показывает уверенный ро�т второй ме��ц подр�д.
</a>
</h4>
</article>
</li>
<li class="news__item">
<article class="news-mini-card">
<a href="#" class="news-mini-card__category">�аука</a>
<h4 class="news-mini-card__title">
<a href="#" class="news-mini-card__link">
Учёные пред�тавили новый материал дл� аккумул�торов.
</a>
</h4>
</article>
</li>
<li class="news__item">
<article class="news-mini-card">
<a href="#" class="news-mini-card__category">Спорт</a>
<h4 class="news-mini-card__title">
<a href="#" class="news-mini-card__link">
Финал чемпионата завершил�� неожиданной победой.
</a>
</h4>
</article>
</li>
<li class="news__item">
<article class="news-mini-card">
<a href="#" class="news-mini-card__category">Культура</a>
<h4 class="news-mini-card__title">
<a href="#" class="news-mini-card__link">
Открыла�ь вы�тавка �овременного и�ку��тва.
</a>
</h4>
</article>
</li>
</ul>
</aside>
Также, не забудьте, что �татьи мы делаем через <article>, именно по�тому он и�пользует�� и внутри боковой панели.
�у, а ниже у на� кла��иче�кий �пи�ок из не�кольких �лементов-�татей. Зде�ь в�е довольно про�то, главное указывать alt изображени�м и вложить ��ылки внутрь заголовок �татей, иначе �татьи будут некликабельными, и потер�ют �вой �мы�л. Также, мы задаем �пи�ку еще один кла�� grid, чтобы �делать �етку внутри �пи�ка. И конечно, по�ледним двум �лементам �пи�ка мы добавл�ем дополнительный кла�� news__item--big, чтобы � помощью гридов �делать им другой размер.
<ul class="news__items grid">
<li class="news__item">
<article class="news-card">
<img
src="img/2.png"
alt="За�едание в Думе"
class="news-card__pic"
/>
<div class="news-card__text">
<h3 class="news-card__title">
<a href="#" class="news-card__link"> Политика </a>
</h3>
<p class="news-card__descr">
Обзор ключевых �обытий за по�ледние �утки.
</p>
</div>
</article>
</li>
<li class="news__item">
<article class="news-card">
<img
src="img/3.png"
alt="Материн�ка� плата"
class="news-card__pic"
/>
<div class="news-card__text">
<h3 class="news-card__title">
<a href="#" class="news-card__link"> Технологии </a>
</h3>
<p class="news-card__descr">
Обзор ключевых �обытий за по�ледние �утки.
</p>
</div>
</article>
</li>
<li class="news__item">
<article class="news-card">
<img
src="img/4.png"
alt="Под�чет финан�ов"
class="news-card__pic"
/>
<div class="news-card__text">
<h3 class="news-card__title">
<a href="#" class="news-card__link"> Бизне� </a>
</h3>
<p class="news-card__descr">
Главные �обыти� финан�ового рынка.
</p>
</div>
</article>
</li>
<li class="news__item news__item--big">
<article class="news-card">
<img
src="img/5.png"
alt="Человек читает газету"
class="news-card__pic"
/>
<div class="news-card__text">
<h3 class="news-card__title">
<a href="#" class="news-card__link">
Большой материал недели
</a>
</h3>
<p class="news-card__descr">
Подробный разбор главной темы � комментари�ми �к�пертов и
аналитикой.
</p>
</div>
</article>
</li>
<li class="news__item">
<article class="news-card">
<img
src="img/6.png"
alt="Человек �мотрит в камеру"
class="news-card__pic"
/>
<div class="news-card__text">
<h3 class="news-card__title">
<a href="#" class="news-card__link"> Интервью </a>
</h3>
<p class="news-card__descr">
Разговор � руководителем крупной технологиче�кой компании.
</p>
</div>
</article>
</li>
</ul>
Добавл�ем �тили
Подключим файл �тилей через <link> и зададим не�колько базовых правил. Дл� �того задани� до�таточно переопределить box-sizing, �бро�ить от�туп у <body> и подключить шрифты, которые и�пользуют�� в макете.
* {
box-sizing: border-box;
}
@font-face {
font-family: "Segoe UI";
src: url("../fonts/SegoeUI.woff2");
font-display: swap;
font-weight: 400;
}
@font-face {
font-family: "Segoe UI";
src: url("../fonts/SegoeUISemiBold.woff2");
font-display: swap;
font-weight: 600;
}
@font-face {
font-family: "Segoe UI";
src: url("../fonts/SegoeUIBold.woff2");
font-display: swap;
font-weight: 700;
}
@font-face {
font-family: "PT Serif";
src: url("../fonts/PTSerifBold.woff2");
font-display: swap;
font-weight: 700;
}
body {
margin: 0;
background: #f5f3ee;
font-family: "Segoe UI", sans-serif;
}
.container {
margin: 0 auto;
padding: 0 15px;
max-width: 1150px;
}
.grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 24px;
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
border: 0;
padding: 0;
white-space: nowrap;
clip-path: inset(100%);
clip: rect(0 0 0 0);
overflow: hidden;
}
Обратите внимание на подключение шрифтов. В макете и�пользует�� два — PT Serif дл� заголовок, и Segoe UI как о�новной. Именно по�тому он указан у <body>. Также, по�мотрите на �тили �етки. Мы у�танавливаем 12 колонок, как в макете.
И конечно, отдельное внимание на visually-hidden. Именно � помощью �тих �тилей мы полно�тью �крываем �лемент, но он в�е еще о�тает�� до�тупен дл� �кринридеров.
Идем дальше, и можно �тилизовать шапку. Зде�ь нет ничего �ложного, про�то не забывайте, что заголовкам нам нужно вручную указывать font-family, т. к. у них �вой шрифт.
.header__inner {
border-bottom: 2px solid #ddd5ca;
padding: 24px 0px;
}
.header__date {
margin-bottom: 8px;
font-weight: 400;
font-size: 16px;
line-height: 100%;
color: #6f6f6f;
}
.header__title {
margin: 0;
margin-bottom: 20px;
font-family: "PT Serif", sans-serif;
font-weight: 700;
font-size: 44px;
line-height: 100%;
text-transform: uppercase;
color: #222;
}
.nav__list {
margin: 0;
padding: 0;
list-style: none;
display: flex;
gap: 24px;
}
.nav__link {
font-weight: 600;
font-size: 16px;
line-height: 100%;
text-decoration: none;
color: #222;
}
Далее поработаем � главной ново�тью. С помощью align-items: flex-end мы прибьем контент карточки к нижней ча�ти, а � помощью grid-column: 8 span �делаем ширину у �амой карточки, чтобы она равн�ла�ь 8 колонкам.
Изображение в данном �лучае �делано через <img>, а значит нам нужно как-то разме�тить его в фоне. И�пользуем аб�олютное позиционирование, inset, и ра�т�гиваем изображение на 100% ширины и вы�оты. Также �тоит добавить object-fit. В о�тальном в �тил�х карточки мы в�е берем из макета.
.news {
padding-top: 36px;
padding-bottom: 24px;
}
.news__main {
position: relative;
display: flex;
align-items: flex-end;
border-radius: 16px;
padding: 28px;
min-height: 430px;
grid-column: 8 span;
}
.news__text {
position: relative;
z-index: 2;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.news__pic {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.news__category {
border-radius: 100px;
padding: 6px 12px;
font-weight: 400;
font-size: 12px;
line-height: 100%;
text-transform: uppercase;
text-decoration: none;
color: #fff;
background: rgba(255, 255, 255, 0.18);
}
.news__title {
margin: 0;
font-family: "PT Serif", sans-serif;
font-weight: 700;
font-size: 36px;
line-height: 120%;
color: #fff;
}
.news__link {
color: inherit;
text-decoration: none;
}
.news__descr {
margin: 0;
font-weight: 400;
font-size: 16px;
line-height: 120%;
color: #fff;
}
Далее у на� права� колонка. Задаем ей �вой grid-column, чтобы управл�ть ее размером. Внутри в�е по �тандарту, только по�мотрите, как у�троена обводка у карточки. Мы задаем ее �низу дл� в�ех карточек, а затем, и�пользу� .news__item:last-child .news-mini-card { мы находим по�ледний �лемент �пи�ка, а в нем карточку, и �вно убираем обводку, чтобы приве�ти в�е в �оответ�твие � макетом.
.news__aside {
grid-column: 4 span;
border: 1px solid #ddd5ca;
border-radius: 16px;
padding: 20px;
background: #fff;
}
.news__subtitle {
margin: 0;
margin-bottom: 12px;
font-family: "PT Serif", sans-serif;
font-weight: 700;
font-size: 24px;
line-height: 100%;
color: #222;
}
.news__list {
margin: 0;
padding: 0;
list-style: none;
}
.news__item:last-child .news-mini-card {
border: none;
}
.news-mini-card {
border-bottom: 1px solid #ece7df;
padding: 12px 0px;
}
.news-mini-card__category {
margin-bottom: 4px;
font-weight: 700;
font-size: 12px;
line-height: 120%;
text-decoration: none;
color: #8d2d2d;
}
.news-mini-card__title {
margin: 0;
font-weight: 400;
font-size: 16px;
line-height: 120%;
color: #222;
}
.news-mini-card__link {
text-decoration: none;
color: inherit;
}
�у и по�леднее, что нам нужно �делать — �то �пи�ок из одинаковых карточек. Зде�ь мы �бро�им у �пи�ка в�е ненужные �тили, а также ра�т�нем его на 100% ширины блока, и�пользу� grid-column: 12 span. По�кольку мы уже задавали кла�� grid �пи�ку, он уже «гридовый». По�тому, нам �тоит лишь дать пон�ть браузеру, �колько какой �лемент �пи�ка колонок должен занимать.
.news__items {
margin: 0;
padding: 0;
list-style: none;
grid-column: 12 span;
}
.news__item {
grid-column: 4 span;
}
.news__item--big {
grid-column: 8 span;
}
О�тает�� про�та� карточка � изображением и тек�том. Из интере�ного зде�ь — ра�т�гивание ��ылки на в�ю карточку. �е�мотр� на то, что ��ылка ограничена лишь �вои размером, � помощью п�евдо�лемента мы можем ее «ра�т�нуть». Дл� �того в�ей карточке задаем position: relative, а у ��ылки делаем п�евдо�лемент � position: absolute и inset: 0. Таким образом, п�евдо�лемент ра�т�гивает�� именно отно�ительно карточки.
.news-card {
position: relative;
overflow: hidden;
border: 1px solid #ddd5ca;
border-radius: 16px;
background: #fff;
}
.news-card__pic {
display: block;
max-width: 100%;
}
.news-card__text {
padding: 20px;
}
.news-card__title {
margin: 0;
margin-bottom: 8px;
font-family: "PT Serif", sans-serif;
font-weight: 700;
font-size: 20px;
line-height: 120%;
color: #222;
}
.news-card__link {
color: inherit;
text-decoration: none;
}
.news-card__link:after {
content: "";
position: absolute;
inset: 0;
}
.news-card__descr {
margin: 0;
min-height: 38px;
font-weight: 400;
font-size: 16px;
line-height: 120%;
color: #222;
}
В �том задании мы �вер�тали главную �траницу ново�тного портала и познакомили�ь � не�колькими важными приемами по�троени� �ложных интерфей�ов. Разобрали �емантиче�кую �труктуру �траницы, по�троили композицию на CSS Grid, научили�ь комбинировать Grid и Flexbox, оформили карточки ново�тей и реализовали боковую колонку � по�ледними публикаци�ми.