Как сверстать панель пользователя

Эта статья основана на одном из практических заданий 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>

Давайте сверстаем сам блок. Разметим сам блок как <div> и разделим его на три части. Первая — это левая часть, где у нас аватар и данные пользователя. Вторая — статус «в сети», и третья — ссылка. Здесь можно было пойти и другим путем — сделать две части — левую и правую, но я хочу показать этот способ.

Итак, получается, внутри панели будет два дива и ссылка. А внутри первого дива добавим изображение, а также имя и должность пользователя.

<div class="user-panel">
  <div class="user-panel__info">
    <img src="img/avatar.png" alt="Илья Морозов" class="user-panel__avatar">
    <div class="user-panel__text">
      <div class="user-panel__name">
        Илья Морозов
      </div>
      <div class="user-panel__position">
        Motion Designer
      </div>
    </div>
  </div>
  <div class="user-panel__status">
    В сети
  </div>
  <a href="#" class="user-panel__link">
    Открыть профиль
  </a>
</div>

Не забывайте заполнять alt, это важный атрибут как для поисковых систем, так и для дсотупности.

Добавляем стили

Подключим файл стилей через <link> и зададим несколько базовых правил. Для этого задания достаточно переопределить box-sizing, сбросить отступ у <body> и подключить шрифт Inter, который используется в макете.

* {
  box-sizing: border-box;
}

@font-face {
  font-family: "Inter";
  src: url("../fonts/InterRegular.woff2");
  font-display: swap;
  font-weight: 400;
}

@font-face {
  font-family: "Inter";
  src: url("../fonts/InterMedium.woff2");
  font-display: swap;
  font-weight: 500;
}

@font-face {
  font-family: "Inter";
  src: url("../fonts/InterSemiBold.woff2");
  font-display: swap;
  font-weight: 600;
}

@font-face {
  font-family: "Inter";
  src: url("../fonts/InterBold.woff2");
  font-display: swap;
  font-weight: 700;
}

body {
  margin: 0;
  padding: 20px;
  font-family: "Inter", sans-serif;
  background: #111;
}

Обращаю ваше внимание на подключение шрифтов. В font-family мы указываем одно значение — Inter, а в font-weight — разные. Так браузеру будет понятно, какое именно начертание использовать, а нам не придется задавать каждому элементу свое семейство шрифтов.

Идем дальше, а дальше мы сделаем стили для самой панели. тут все забираем из макета, а также добавляем flexbox вместе с `align-items: center, делая весь контент по центру по вертикали.

.user-panel {
  display: flex;
  align-items: center;
  border: 1px solid #2a2a2a;
  border-radius: 32px;
  padding: 16px;
  gap: 16px;
  margin: 0 auto;
  max-width: 920px;
  background: #1a1a1a;
}

Далее, сделаем левую часть. Для нее также пригодится flexbox и align-items: center. Для изображения обязательно зададим размеры, display, object-fit и border-radius, это позволит добавлять сюда любые изображения, и они встанут адекватно. Помимо этого, конечно, добавим стили для текста.

.user-panel__info {
  display: inline-flex;
  align-items: center;
  gap: 16px;
}

.user-panel__avatar {
  display: block;
  border-radius: 16px;
  width: 72px;
  height: 72px;
  object-fit: cover;
}

.user-panel__name {
  margin-bottom: 8px;
  font-weight: 700;
  font-size: 20px;
  color: #fff;
}

.user-panel__position {
  font-weight: 400;
  font-size: 14px;
  color: #a1a1aa;
}

Теперь — статус. Сам элемент статуса сделать несложно, но как сделать кружок? Тут я всегда руководствуюсь один правилом: если декоративный элемент можно сделать без изменения разметки — надо так и делать. Поэтому, мы можем на весь блок добавить display: inline-flex, а кружок сделать с помощью псевдоэлемента ::before. Зададим ему стили из макета, а фон сделаем currentColor, таким образом кружок всегда будет равен цвету текста. Например, если статус будет «Не в сети», красным цветом, то и кружок сам станет красным.

И самое важное, что здесь нужно — это отступ. Мы не делили разметку на две части, о чем описано выше. А значит, использовать justify-content: space-between мы не можем, иначе статус будет ближе к центру панели. Поэтому пойдем другим путем и зададим статусу margin-left: auto. Значение auto у флекс-элемента позволяет задать отступ, равный всему доступному пространству в блоке. То есть, мы по сути просто сдвигаем статус, а вместе с ним и ссылку вправо.

.user-panel__status {
  display: inline-flex;
  align-items: center;
  margin-left: auto;
  font-weight: 600;
  font-size: 14px;
  color: #a2f916;
  gap: 8px;
}

.user-panel__status::before {
  content: "";
  display: block;
  border-radius: 100%;
  width: 10px;
  height: 10px;
  background: currentColor;
}

Остается ссылка. Добавляем стили и сверху пишем :hover, чтобы было красивее и удобнее.

.user-panel__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 16px;
  padding: 16px;
  font-weight: 500;
  font-size: 16px;
  text-decoration: none;
  color: #fff;
  background: #27272a;
  transition: background 0.3s;
}

.user-panel__link:hover {
  background: #343438;
}

Обратите внимание на внутренние элементы панели. Им всем я задал не просто display: flex, а именно display: inline-flex, то есть сделал их строчными для соседей, поэтому каждый из элементов займет лишь размер своего контента.

Теперь вы умеете создавать панель пользователя с несколькими логическими зонами: информацией о профиле, статусом и кнопкой действия. Подобные компоненты часто используются в личных кабинетах, мессенджерах, CRM-системах и административных панелях.

Решение задачи

предыдущий пост следующий пост