Создание формы обратной связи на сайте Furniro

Ссылка на дизайн в Figma: https://www.figma.com/design/

Мы видим, что отправка запроса происходит во новом окне, которое открывается на новой странице. Но бывают варианты, когда окно регистрации или отправки заявки появляется прям поверх страницы.

Есть два вида таких окон - всплывающие и модальные .

Всплывающие окна позволяют продолжать взаимодействие со страницей, не блокируя её. Это окно может находиться в любой части страницы и его можно закрыть.

Модальные окна блокируют страницу и вам на выбор остается два пути - заполнить форму и нажать кнопку "Отправить" или Закрыть модальное окно.

Это делается с помощью JavaScript - языка программирования, который мы будем изучать дальше.

Но в данном макете мы будем использовать новую страницу для оформления запроса на обратную связь. Для начала создадим новый .html файл в корневой папке нашего проекта.

В файле CSS в самом низу добавьте разделяющий комментарий, который нужно закомменировать. Это нужно для того чтобы визуально отделять код для разных файлов.

Скопируйте из файла index.html весь код и удалите лишнее. Обратите внимание, что на новой странице <header> и <footer> такие же, как и на главное, поэтому их можно оставить. А вот то, что находится в части <main> меняется - это можно удалить.

Первым блоком в <main> идёт баннер. Создадим для него отдельный <article> . И зададим классы.

Скачайте изображение стрелки в папку img . Изображение логотипа у вас уже есть в папке.

Скачайте изображение баннера в папке img . Чтобы не усложнять себе жизнь настройками фильтров для приглушения фона, просто скачайте уже полупрозрачную картинку от дизайнера в формате .png .

HTML
Код скопирован в буфер обмена copy

 <article class="contacts_banner">
      <div class="container">
           <img class="contacts_logo" src="img/logo.png" alt="Логотип">
           <h1 class="contacts_title">Контакты</h1>
           <a class="breadcrumbs" href="#">Главная</a>
           <img class="breadcrumbs" src="img/arrow.png" alt="Стрелка">
           <span class="breadcrumbs">Контакты</span>
      </div>
 </article>

Далее настраиваем классы.

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

CSS
Код скопирован в буфер обмена copy

.contacts_banner {
      background-image: url(../img/contacts-banner.png);
      background-repeat: no-repeat;
      background-position: center;
      background-size: cover;
      padding: 61px 0 98px;
}

Блок с классом container позволит нам расположить его по центру страницы со всеми его элементами внутри.

CSS
Код скопирован в буфер обмена copy

.container {
      text-align: center;
}

Далее логотип. Если вы посмотрите на макете, то дизайнер не упростил нам работу, так как не задал правильно размеры элементов. Сейчас мы оставим логотип таким же размером, как он у нас сохранён ранее, не будем ничего менять. Только зададим нижний отступ.

CSS
Код скопирован в буфер обмена copy

.contacts_logo {
      margin-bottom: 15px;
}

Далее заголовок. Я использовала тег <h1> , так как у нас новая страница и поэтому по правилам синтаксиса мы можем использовать заголовок этого уровня на каждой новой странице только один раз.

CSS
Код скопирован в буфер обмена copy

.contacts_title {
      margin: 0;
      margin-bottom: 20px;
      font-size: 48px;
}

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

CSS
Код скопирован в буфер обмена copy

.breadcrumbs {
      vertical-align: middle;
}
.breadcrumbs:not(:last-child) {
      margin-right: 6px;
}

Отлично, блок с баннером готов. Потом эту основу можно использовать для других второстепенных страниц.

Далее переходим к блоку с формой отправки заявки.

Если посмотреть внимательно на этот раздел, то мы можем увидеть, что слева располагается блок с контактами, а справа форма. Учитываем это при формировании вёрстки.

Сначала разберёмся с левой частью блока.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form">
      <ul class="list_reset contacts_list">
           <li class="contacts_list_item">
                <img src="img/list-img-1.png" alt="Адрес">
                <h2 class="contacts_list_title">Адрес</h2>
                <span class="contacts_list_text">Москва, 3 Микрорайон, д. 18, оф. 15</span>
           </li>
           <li class="contacts_list_item">
                <img src="img/list-img-2.png" alt="Телефон">
                <h2 class="contacts_list_title">Телефон</h2>
                <span class="contacts_list_text">офис: <a href="tel:+845466789">+(84) 546-6789</a></span><br>
                <span class="contacts_list_text">магазин: <a href="tel:+844566789">+(84) 456-6789</a></span>
           </li>
           <li class="contacts_list_item">
                <img src="img/list-img-3.png" alt="Время">
                <h2 class="contacts_list_title">Время работы</h2>
                <span class="contacts_list_text">Пн-Пт: 9:00 - 22:00</span><br>
                <span class="contacts_list_text">Сб-Вс: 9:00 - 21:00</span>
           </li>
      </ul>
</article>

Позиционируем весь блок по центру.

CSS
Код скопирован в буфер обмена copy

.contacts_form {
      text-align: center;
}

Далее работаем с основой списка <ul> . Нам нужно чтобы контент был прижат к левому краю.

CSS
Код скопирован в буфер обмена copy

.contacts_list {
      display: inline-block;
      text-align: left;
}

Между элементами списка необходимо задать расстояние.

CSS
Код скопирован в буфер обмена copy

.contacts_list_item:not(:last-child) {
      margin-bottom: 50px;
}

Чтобы сделать следующий шаг и разместить контент внутри элементов списка есть несколько способов:

  • объединить первую строку (иконка + заголовок);
  • оставить иконку отдельно и объединить заголовок + текст

От выбора будут зависеть стили для позиционирования. Я объединю текстовые блоки. Для этого в код HTML нужно добавить теги и класс.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form">
      <ul class="list_reset contacts_list">
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-1.png" alt="Адрес">
                <div>
                     <h2 class="contacts_list_title">Адрес</h2>
                     <span class="contacts_list_text">Москва, 3 Микрорайон, д. 18, оф. 15</span>
                </div>
           </li>
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-2.png" alt="Телефон">
                <div>
                     <h2 class="contacts_list_title">Телефон</h2>
                     <span class="contacts_list_text">офис: <a href="tel:+845466789">+(84) 546-6789</a></span><br>
                     <span class="contacts_list_text">магазин: <a href="tel:+844566789">+(84) 456-6789</a></span>
                </div>
           </li>
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-3.png" alt="Время">
                <div>
                     <h2 class="contacts_list_title">Время работы</h2>
                     <span class="contacts_list_text">Пн-Пт: 9:00 - 22:00</span><br>
                     <span class="contacts_list_text">Сб-Вс: 9:00 - 21:00</span>
                </div>
           </li>
      </ul>
</article>

Зададим размер иконкам и расстояние межу иконкой и текстом.

CSS
Код скопирован в буфер обмена copy

.contacts_list_item {
      gap: 30px;
}
.contacts_list_icon {
      height: 23px;
}

Далее работаем с текстовыми блоками. Для этого нужно сделать его flex-блоком. И незабудьте удалить принудительные переносы строки ( <br> ) в телефонах и времени работы, а вот в адресе, наоборот, перенос нужно добавить.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form">
      <ul class="list_reset contacts_list">
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-1.png" alt="Адрес">
                <div class="flex contacts_list_block">
                     <h2 class="contacts_list_title">Адрес</h2>
                     <span class="contacts_list_text">Москва, 3 Микрорайон,<br> д. 18, оф. 15</span>
                </div>
           </li>
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-2.png" alt="Телефон">
                <div class="flex contacts_list_block">
                     <h2 class="contacts_list_title">Телефон</h2>
                     <span class="contacts_list_text">офис: <a href="tel:+845466789">+(84) 546-6789</a></span>
                     <span class="contacts_list_text">магазин: <a href="tel:+844566789">+(84) 456-6789</a></span>
                </div>
           </li>
           <li class="contacts_list_item flex">
                <img class="contacts_list_icon" src="img/list-img-3.png" alt="Время">
                <div class="flex contacts_list_block">
                     <h2 class="contacts_list_title">Время работы</h2>
                     <span class="contacts_list_text">Пн-Пт: 9:00 - 22:00</span>
                     <span class="contacts_list_text">Сб-Вс: 9:00 - 21:00</span>
                </div>
           </li>
      </ul>
</article>

CSS
Код скопирован в буфер обмена copy

.contacts_list_block {
      flex-direction: column;
      gap: 10px;
}

Сделаем отступ справа, чтобы отделить контакты от формы.

CSS
Код скопирован в буфер обмена copy

.contacts_list {
      display: inline-block;
      text-align: left;
      margin-right: 110px;
}

Далее работаем с формой.

В форму ставим ссылку для проверки корректности отправки данных - https://jsonplaceholder.typicode.com/posts а так же пишем метод отправки данных "post".

Внутри формы на макете мы видим 5 элементов, будем добавлять их последовательно.

Форма для ввода данных - <input> . Для того чтобы правильно оформить заголовок для поля с вводом данных, используем тег <label> .

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form">
      <ul class="list_reset contacts_list">
...
      </ul>
      <form action="https://jsonplaceholder.typicode.com/posts" method="post">
           <label for="username">Имя Фамилия
                <input type="text" placeholder="Иванова Светлана" required>
           </label>
      </form>
</article>

Сейчас мы видим не корректное позиционирование двух блоков. Исправим это. Для этого нужно вернуться к общему родительскому блоку и сделать его flex-блоком.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form flex">
      <ul class="list_reset contacts_list">
...
      </ul>
      <form action="https://jsonplaceholder.typicode.com/posts" method="post">
           <label for="username">Имя Фамилия
                <input type="text" placeholder="Иванова Светлана" required>
           </label>
      </form>
</article>

Как видим, блоки встали как нам нужно, но центральное позиционирование пропало. Чтобы это исправить нам просто нужно заменить свойство.

CSS
Код скопирован в буфер обмена copy

.contacts_form {
      justify-content: center;
}

Теперь, всё на своих местах. Продолжаем работать с формой.

Зададим новый класс для <label> . А так же сделаем его flex-блоком.

Зададим новый класс для <input> .

HTML
Код скопирован в буфер обмена copy

<form action="https://jsonplaceholder.typicode.com/posts" method="post">
     <label class="flex form_item" for="username">Имя Фамилия
          <input class="form_input" type="text" placeholder="Иванова Светлана" required>
     </label>
</form>

CSS
Код скопирован в буфер обмена copy

.form_item {
     flex-direction: column;
}

Расстояние между заголовком и самим полем ввода в данном случае можно реализовать только через верхний отступ у поля ввода. Так же зададим размеры блока ввода данных и добавим внутренние отступы.

CSS
Код скопирован в буфер обмена copy

.form_input {
      margin-top: 22px;
      width: 530px;
      min-height: 53px;
      border-style: none;
      border: 1px solid #9F9F9F;
      border-radius: 10px;
      padding: 25px 28px;
}
.form_input::placeholder {
      color: #9F9F9F;
}

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

HTML
Код скопирован в буфер обмена copy

<form action="https://jsonplaceholder.typicode.com/posts" method="post">
     <label class="flex form_item" for="username">Имя Фамилия
          <input class="form_input" type="text" placeholder="Иванова Светлана" required>
     </label>
     <label class="flex form_item" for="username">Ваш email адрес
          <input class="form_input" type="email" placeholder="example@gmail.com" required>
     </label>
     <label class="flex form_item" for="username">Тема вопроса
          <input class="form_input" type="text" placeholder="Краткое описание вопроса" required>
     </label>
</form>

Если сейчас кликнуть в одно из полей ввода, то мы увидим синюю рамку.

Так как у нас в дизайне нет такого цвета, то логичнее будет заменить его на один из цветов сайта. Сначала уберем стандартную обводку, а затем настроим собственную.

CSS
Код скопирован в буфер обмена copy

.form_input:focus {
      outline: none;
      border: 2px solid #AA8633;
}

Далее у нас идёт поле для ввода текста. Поэтому ему нужно будет задать соответствующий тег <textarea> . И дополнительный класс для стилизации.

HTML
Код скопирован в буфер обмена copy

<form action="https://jsonplaceholder.typicode.com/posts" method="post">
     <label class="flex form_item" for="username">Имя Фамилия
          <input class="form_input" type="text" placeholder="Иванова Светлана" required>
     </label>
     <label class="flex form_item" for="username">Ваш email адрес
          <input class="form_input" type="email" placeholder="example@gmail.com" required>
     </label>
     <label class="flex form_item" for="username">Тема вопроса
          <input class="form_input" type="text" placeholder="Краткое описание вопроса" required>
     </label>
     <label class="flex form_item" for="username">Тема вопроса
          <textarea class="form_input form_textarea" name="message" placeholder="Добрый день! Я бы хотел узнать..." required></textarea>
     </label>
</form>

CSS
Код скопирован в буфер обмена copy

.form_input {
      max-width: 530px;
      min-height: 120px;
      max-height: 530px;
}

Форма почти готова, осталось только задать расстояния между полями ввода данных. Для этого добавим тегу <form> класс flex . После этого все поля выстроятся в линию. Достаточно переназначить их расположение в классе для формы, который мы создали заранее, а затем добавить расстояние между элементами.

HTML
Код скопирован в буфер обмена copy

<form class="flex form_block" action="https://jsonplaceholder.typicode.com/posts" method="post">
...
</form>

CSS
Код скопирован в буфер обмена copy

.form_block {
      flex-direction: column;
}

Форма готова. Можно позиционировать её и добавить пропущенный ранее заголовок и текст.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form flex">
      <h2 class="contacts_form_title">Свяжитесь с нами</h2>
      <p class="contacts_form_text">Для получения дополнительной информации...</p>
      <ul class="list_reset contacts_list">...</ul>
      <form action="https://jsonplaceholder.typicode.com/posts" method="post">...</form>
</article>

Мы видим, что ранее заданные свойства нам не подходят. Поэтому позиционируем блоки колонной.

CSS
Код скопирован в буфер обмена copy

.contacts_form {
      justify-content: center;
      flex-direction: column;
}

Так как мы поменяли ось за счет смены позиционирования flex-элементов, то и свойство justify-content: center; больше не работает. Его нужно заменить на корректное.

CSS
Код скопирован в буфер обмена copy

.contacts_form {
      align-items: center;
      flex-direction: column;
}

Уже лучше, но всё еще не то. Так как теперь блок с адресом и формой стоят не по дизайну. Эту проблему можно решить объединив их в один <div> и присвоив ему класс flex .

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form flex">
      <h2 class="contacts_form_title">Свяжитесь с нами</h2>
      <p class="contacts_form_text">Для получения дополнительной информации...</p>
     <div class="flex">
           <ul class="list_reset contacts_list">...</ul>
           <form action="https://jsonplaceholder.typicode.com/posts" method="post">...</form>
     </div>
</article>

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

Стилизуем заголовок.

CSS
Код скопирован в буфер обмена copy

.contacts_form_title {
      margin: 0;
      margin-bottom: 27px;
      font-weight: 700;
      font-size: 36px;
}

Стилизуем текст.

CSS
Код скопирован в буфер обмена copy

.contacts_form_text {
      margin: 0;
      margin-bottom: 85px;
      max-width: 668px;
      text-align: center;
      color: #9f9F9F;
}

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

CSS
Код скопирован в буфер обмена copy

.contacts_form {
      flex-direction: column;
      text-align: center;
      padding: 90px 0 120px;
}

Обратим внимание на то, что левый блок с контактами должен стоять по центру блока с формой. Для этого родительскому диву этих двух блоков нужно создать новый класс.

HTML
Код скопирован в буфер обмена copy

<article class="contacts_form flex">
      <h2 class="contacts_form_title">Свяжитесь с нами</h2>
      <p class="contacts_form_text">Для получения дополнительной информации...</p>
     <div class="flex contacts_form_group">
           <ul class="list_reset contacts_list">...</ul>
           <form action="https://jsonplaceholder.typicode.com/posts" method="post">...</form>
     </div>
</article>

CSS
Код скопирован в буфер обмена copy

.contacts_form_group {
      align-items: center;
}

Теперь то, что нужно. Но мы ещё пропустили кнопку. Её добавим внутрь самой формы.

HTML
Код скопирован в буфер обмена copy

<form action="https://jsonplaceholder.typicode.com/posts" method="post">
     <label class="flex form_item" for="username">Имя Фамилия
          <input class="form_input" type="text" placeholder="Иванова Светлана" required>
     </label>
     <label class="flex form_item" for="username">Ваш email адрес
          <input class="form_input" type="email" placeholder="example@gmail.com" required>
     </label>
     <label class="flex form_item" for="username">Тема вопроса
          <input class="form_input" type="text" placeholder="Краткое описание вопроса" required>
     </label>
     <label class="flex form_item" for="username">Тема вопроса
          <textarea class="form_input form_textarea" name="message" placeholder="Добрый день! Я бы хотел узнать..." required></textarea>
     </label>
     <button class="btn_reset form_btn">Отправить</button>
</form>

CSS
Код скопирован в буфер обмена copy

.form_btn {
      max-width: 235px;
      min-height: 55px;
      padding: 17px 73px;
      border-radius: 5px;
      margin-top: 16px;
      background-color: #B88E2F;
      color: white;
      font-size: 18px;
}

Отлично! Поздравляю, этот раздел страницы готов.

 

Самостоятельная работа

Вам необходимо самостоятельно оформить блок с преимуществами.

Для этого вы можете устроить мозговой штурм в групповом чате. Главное правильно формулируйте свой вопросы, дополняйте его кусочками вашего кода, где у вас не получается, чтобы остальные ученики могли понять, в чем именно у вас проблема.

Пользуйтесь сайтом codepen.com чтобы составлять разные части кода - это всегда удобно, чтобы сразу видеть изменения и не "поломать" рабочую версию кода.

Желаю удачи!

 

Для продолжения прохождения курса загрузите свой АРХИВ папки с проектом

Анимация с помощью псевдоэлементов

По мимо псевдоклассов в CSS так же существуют [/tag]псевдоэлементы[/tag].

Псевдоэлементы — это дополнение к селектору, которое будет определять новые стили или даже новые элементы. Используется в качестве оформления дизайна вёрстки. Пишется с двумя двоеточиями.

::befor — создает новый элемент вначале выбранного элемента.

::after — создает новый элемент вконце выбранного элемента.

::selection — оформляет текст при выделении.

::first-later — оформляет первую букву текста в блочном элементе.

Есть и другие псвевдоэлементы, но многие из них используются крайне редко.

Самостоятельная работа по оформлению анимации на сайте мебельного магазина

В предыдущем уроке мы добавили изменение цвета для элементов, с которыми будет взаимодействовать пользователь на сайте.

В этом уроке мы немного доработаем анимацию, добавим дополнительные элементы, которые будут интересно выделять наш сайт.

Сейчас в header при наведении на меню навигации меняется цвет ссылки.

Добавим к этим элементам полоску, которая так же будет появляться при наведении.

Для всех ссылок у нас уже есть ранее созданный класс .nav_link .

И присвоим элементам свойство позиционирования relative .

CSS
Код скопирован в буфер обмена copy

.nav_link {
     position: relative; 
}

Далее, нам нужно нарисовать простую линию. Но не с помощью border-bottom , а с помощью псевдоэлемента ::after .

CSS
Код скопирован в буфер обмена copy

.nav_link::after {
     content: ""; 
     position: absolute; 
     left: 0; 
     bottom: -5px;
     width: 100%;
     height: 2px;
     background-color: #B88E2F;    
}

Для псевдоэлементов ::befor и ::after принято писать свойство content , даже если в нём ничего не будет, оставляем кавычки пустыми.

Тут вспоминаем, что абсолютное позиционирование не работает, если у родительского элемента не стоит позиционирование relative (поэтому выше мы его и добавили).

За счет left и [/tag]bottom[/tag] выравниваем элементы относительно ссылок, а ширина и высота нужны, чтобы увидеть сам элемент.

Теперь у ссылок всегда есть подчеркивание.

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

Добавляем свойство. Сейчас оно полностью скроет подчеркивание, т.к. его значение равно нулю.

CSS
Код скопирован в буфер обмена copy

.nav_link::after {
     content: ""; 
     position: absolute; 
     left: 0; 
     bottom: -5px;
     width: 100%;
     height: 2px;
     background-color: #B88E2F;    
     transform: scale(0);    
}

Добавляем комбинацию класса с псевдоклассом ( :hover — наведение)и псевдоэлементом ( ::after — вывод контента) со значением 1, то есть «видимость».

CSS
Код скопирован в буфер обмена copy

.nav_link:hover::after {
     transform: scale(1);    
}

Теперь линия появляется только при наведении на ссылку.

Отлично. Но пойдем ещё дальше и добавим анимацию нашей линии.

Нам нужно изменить значение свойства transform со scale(0) на scaleX(0) — это нужно для дальнейшей анимации.

Плавность анимации (появления полоски) задается в секундах с помощью свойства transition .

CSS
Код скопирован в буфер обмена copy

.nav_link::after {
     content: ""; 
     position: absolute; 
     left: 0; 
     bottom: -5px;
     width: 100%;
     height: 2px;
     background-color: #B88E2F;    
     transform: scaleX(0);
     transition: 0.4s;    
}

Далее "оживим" блоки каталога.

Во-первых этот блок должен быть ссылки, так как дальше пользователь должен переходить по ним на страницу товара.

Ссылку добавляем внутри элемента <li> т.к. внутри списка <ul> , может содержаться только тег <li> .

HTML
Код скопирован в буфер обмена copy

<li class="catalog_item">
      <a href="#" class="item_link">
            <img class="item_img" src="img/catalog_img_1.jpg" alt="Карточка товара">
            <div class="item_block">
                  <h3 class="item_heading">Syltherine</h3>
                  <span class="item_name">Стильный стул</span>
                  <div class="flex item_prices">
                       <span class="item_price">2.500 руб</span>
                       <span class="item_full_price">3.500 руб</span>
                  </div>
            </div>
            <div class="item_badge discont">-30%</div>
      </a>
</li>

Теперь сделаем небольшую тень при наведении на блок с помощью псевдокласса :hover .

Добавим псевдокласс к тегу <li> .

CSS
Код скопирован в буфер обмена copy

.catalog_item:hover{
     box-shadow: 0 0 10px lightgray;    
}

При наведении появляется аккуратная тень.

Далее сделаем не просто тень у элементов, а красиво анимируем сами плитки.

Для того чтобы добавить движение карточке нужно задать свойство transform: translateY(-5px); - это свойство перемещает элемент относительно оси Y. Мы установили значение -5px, значит смещение будет на 5 пикселей вверх.

CSS
Код скопирован в буфер обмена copy

.catalog_item:hover{
     box-shadow: 0 0 10px lightgray;   
     transform: translateY(-5px);   
}

 

Сделаем его более плавным с помощью свойства transition .

К основному классу добавим transition со значением 0.5 секунды.

CSS
Код скопирован в буфер обмена copy

.catalog_item {
     position: relative;   
     transition: 0.5s;   
}

Вот теперь плавная анимация блоков выглядит гораздо симпатичнее.

 

Самостоятельно добавьте эффект при наведении (смещение вверх на 5 пикселей) для карточек в разделе "Посмотреть ассортимент"

 

Страничка готова и выглядит более интерактивной и интересной.

 

Для продолжения прохождения курса загрузите свой АРХИВ папки с проектом

Создание сайта Furniro. Footer

В этом уроке мы заканчиваем базовую вёрстку страницы, после которого сможем приступать к её анимированию.

Ссылка на макет сайта: www.figma.com/design

Будем работать с блоком <footer>

Как всегда мы идём от большего к меньшему. И для начала определим базовую структуру.

  • у нас есть серая линия в верхней части и она располагается по всей длине - значит будем задавать её самому главному родительскому элементу;
  • весь контент, который ограничен по ширине, объединим в один блок;
  • внутри контейнера будут два блока: верхний и нижний, их будет разделять серая линия;
  • внутри первого блока будет блок и навигация, внутри них будем расставлять оставшийся контент;
  • во втором блоке будет два элемента

Базовая структура с контентом:

HTML
Код скопирован в буфер обмена copy

<footer>
      <div>
            <div>
                 <div></div>
                 <nav></nav>
            </div>
            <div></div>
      </div>
</footer>

Начинаем оформлять стили. Создаём классы и пишем CSS код.

HTML
Код скопирован в буфер обмена copy

<footer class="footer">
      <div class="footer_container">
            <div class="footer_navigation">
                 <div class="footer_left"></div>
                 <nav class="footer_links"></nav>
            </div>
            <div class="footer_bottom"></div>
      </div>
</footer>

Начинаем оформлять код по блокам.

Сначала работаем с основным блоком <footer> . Отодвигаем контент от краёв и делаем светло-серую линию сверху (для бордера я использую тот же цвет, что и в карточках с товарами выше).

CSS
Код скопирован в буфер обмена copy

.footer {
      padding: 60px 0;
      border-top: 1px solid #F4F5F7;
}

Далее весь контент нужно позиционировать по центру страницы.

CSS
Код скопирован в буфер обмена copy

.footer_container {
      max-width: 1236px;
      margin: 0 auto;
}

Дальше будем работать с верхней частью футера. Нам нужно сделать отступ внизу, чтобы разделить этот блок с нижней частью.

CSS
Код скопирован в буфер обмена copy

.footer_navigation {
      margin-bottom: 83px;
}

Далее теперь будем работать последовательно с блоками внутри верхней части футера.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation">
      <div class="footer_left">
            <h3 class="footer_logo">Furniro.</h3>
            <address class="footer_contacts">
                 <span class="footer_address">Москва, 3 Микрорайон, д. 18, оф. 15</span>
                 <a href="tel:+83476583681" class="footer_tel">+8 (347) 658 - 36 - 81</a>
                 <a href="mailto:furniro@gmail.com" class="footer_mail">furniro@gmail.com</a>
            </address>
      </div>
      <nav class="footer_links"></nav>
</div>

Сейчас все элементы стоят в один ряд, так как они являются строчными и не занимают всю ширину экрана. Стилизуем элементы согласно дизайну.

Зададим всему блоку ограничение по максимальной ширине и отодвинем его от элементов навигации.

CSS
Код скопирован в буфер обмена copy

.footer_left {
      max-width: 300px;
      margin-right: auto;
}

Логотип в футере. Возьмём те же стили, что были у логотипа в хедере. Можно поступить двумя способами:

  • написать стили заново;
  • взять уже имеющийся класс.

Мы поступим 2 способом - возьмем уже готовый класс, а новый класс используем для позиционирования текста.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation">
      <div class="footer_left">
            <h3 class="footer_logo logo_txt">Furniro.</h3>
            <address class="footer_contacts">
                 <span class="footer_address">Москва, 3 Микрорайон, д. 18, оф. 15</span>
                 <a href="tel:+83476583681" class="footer_tel">+8 (347) 658 - 36 - 81</a>
                 <a href="mailto:furniro@gmail.com" class="footer_mail">furniro@gmail.com</a>
            </address>
      </div>
      <nav class="footer_links"></nav>
</div>

CSS
Код скопирован в буфер обмена copy

.footer_logo {
      margin: 0;
      margin-bottom: 60px;
}

Далее стилизуем контакты. У нас есть общий блок <address> , благодаря которому мы можем сделать одинаковое расстояние между элементами. Чтобы применить свойство gap , наш контейнер должен быть flex-элементом. Добавим это в код.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation">
      <div class="footer_left">
            <h3 class="footer_logo logo_txt">Furniro.</h3>
            <address class="footer_contacts flex">
                 <span class="footer_address">Москва, 3 Микрорайон, д. 18, оф. 15</span>
                 <a href="tel:+83476583681" class="footer_tel">+8 (347) 658 - 36 - 81</a>
                 <a href="mailto:furniro@gmail.com" class="footer_mail">furniro@gmail.com</a>
            </address>
      </div>
      <nav class="footer_links"></nav>
</div>

CSS
Код скопирован в буфер обмена copy

.footer_contacts {
      flex-direction: column;
      gap: 15px;
}

Стилизуем текст. Мы видим, что дизайн у текста одинаковый, поэтому нет смысла дублировать стили в трёх разных классах. Добавим для трёх элементов один общий класс.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation">
      <div class="footer_left">
            <h3 class="footer_logo logo_txt">Furniro.</h3>
            <address class="footer_contacts flex">
                 <span class="footer_address footer_txt">Москва, 3 Микрорайон, д. 18, оф. 15</span>
                 <a href="tel:+83476583681" class="footer_tel footer_txt">+8 (347) 658 - 36 - 81</a>
                 <a href="mailto:furniro@gmail.com" class="footer_mail footer_txt">furniro@gmail.com</a>
            </address>
      </div>
      <nav class="footer_links"></nav>
</div>

CSS
Код скопирован в буфер обмена copy

.footer_txt {
      color: #898989;
      font-style: normal;
      font-weight: 400;
      font-size: 16px;
}

Стили, которые мы прописали для текста в блоке <address> мы оставим, т.к. потом они нам пригодятся для анимированной стилизации.

Отлично, с этим блоком закончили. Переходим к блоку навигации.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation">
      <div class="footer_left"></div>
      <nav class="footer_links">
            <div class="footer_nav">
                 <h4 class="footer_heading">Ссылки</h4>
                 <ul class="list_reset flex footer_list">
                       <li><a href="#" class="footer_item">Главная</a></li>
                       <li><a href="#" class="footer_item">Магазин</a></li>
                       <li><a href="#" class="footer_item">О компании</a></li>
                 </ul>
            </div>
            <div class="footer_help"></div>
            <div class="footer_news"></div>
      </nav>
</div>

Теперь можно применять стили. Для начала позиционируем весь блок относительно левого элемента. Для этого родительский контейнер нужно сделать flex блоком.

HTML
Код скопирован в буфер обмена copy

<div class="footer_navigation flex">
      <div class="footer_left"></div>
      <nav class="footer_links">
            <div class="footer_nav">
                 <h4 class="footer_heading">Ссылки</h4>
                 <ul class="list_reset flex footer_list">
                       <li><a href="#" class="footer_item">Главная</a></li>
                       <li><a href="#" class="footer_item">Магазин</a></li>
                       <li><a href="#" class="footer_item">О компании</a></li>
                 </ul>
            </div>
            <div class="footer_help"></div>
            <div class="footer_news"></div>
      </nav>
</div>

Далее работаем с навигацией.

HTML
Код скопирован в буфер обмена copy

<nav class="footer_links flex">
      <div class="footer_nav">
            <h4 class="footer_heading">Ссылки</h4>
            <ul class="list_reset flex footer_list">
                 <li><a href="#" class="footer_item">Главная</a></li>
                 <li><a href="#" class="footer_item">Магазин</a></li>
                 <li><a href="#" class="footer_item">О компании</a></li>
            </ul>
      </div>
      <div class="footer_help"></div>
      <div class="footer_news"></div>
</nav>

А дальше уже готовым классом задаём расстояние между блоков навигации.

CSS
Код скопирован в буфер обмена copy

.footer_links {
      gap: 95px;
}
.footer_nav {
      max-width: 130px;
}

Теперь можно оформлять сам контент. Зададим стили заголовку.

CSS
Код скопирован в буфер обмена copy

.footer_heading {
      color: #898989;
      font-family: 'Roboto';
      font-weight: 400;
      font-size: 16px;
      margin: 0;
      margin-bottom: 60px;
}

Далее список с ссылками.

CSS
Код скопирован в буфер обмена copy

.footer_list {
      flex-direction: column;
      gap: 50px;
}
.footer_item {
      font-weight: 400;
      font-size: 16px;
}

Переходим ко второму списку. И тут всё просто, т.к. элементы повторятся с предыдущим списком, поэтому мы можем использовать те же классы.

HTML
Код скопирован в буфер обмена copy

<nav class="footer_links flex">
      <div class="footer_nav"></div>
      <div class="footer_help"></div>
            <h4 class="footer_heading">Помощь</h4>
            <ul class="list_reset flex footer_list">
                 <li><a href="#" class="footer_item">Методы оплаты</a></li>
                 <li><a href="#" class="footer_item">Возврат</a></li>
                 <li><a href="#" class="footer_item">Контакты</a></li>
            </ul>
      </div>
      <div class="footer_news"></div>
</nav>

Так же нам нужно ограничить блок по ширине.
CSS
Код скопирован в буфер обмена copy

.footer_help {
      max-width: 130px;
}

Переходим к последнему элементу в верхней части футера.

HTML
Код скопирован в буфер обмена copy

<div class="footer_news">
       <h4 class="footer_heading">Рассылка новостей</h4>
       <form action="#" class="flex footer_action">
            <input type="email" class="footer_input" placeholder="Введите свой e-mail" required>
            <button type="submit" class="btn_reset footer_btn">Подписаться</button>
      </form>
</div>

Стилизуем форму ввода. Сделаем расстояние между формой ввода и кнопкой

CSS
Код скопирован в буфер обмена copy

.footer_action {
      gap: 12px;
}

Далее сама форма ввода. Делаем внутренние отпусты, за счет outline убираем обводку формы при её выборе, затем сбрасываем border и назначаем свои свойства для нижней линии. Настройки для placeholder идут отдельно.

CSS
Код скопирован в буфер обмена copy

.footer_input {
      padding: 8px 0;
      outline: none;
      border: none;
      border-bottom: 1px solid black;
}
.footer_input::placeholder {
      color: #898989;
      font-family: 'Roboto';
      font-weight: 400;
      font-size: 16px;
}

И последнее в этом блоке - кнопка.

CSS
Код скопирован в буфер обмена copy

.footer_btn {
      border-bottom: 1px solid black;
}

Отлично, приступаем к оформлению последнего элемента футера - Политика конфиденциальности.

HTML
Код скопирован в буфер обмена copy

<div class="footer_bottom flex">
       <p class="footer_rights">2024 furniro. All rights reserved</p>
       <a href="#" class="footer_privacy">Политика конфиденциальности</a>
</div>

Стилизуем элементы. Добавляем верхнюю полосу и внутренние отступы.

CSS
Код скопирован в буфер обмена copy

.footer_bottom {
      bored-top: 1px solid #F4F5F7;
      padding: 35px 0 10px;
}

CSS
Код скопирован в буфер обмена copy

.footer_rights {
      margin: 0;
      margin-right: auto;
}

Наш футер полностью готов.

Поздравляю, вы проделали большую работу и сделали полностью рабочую страницу. Но она всё еще нуждается в доработке - так называемом юзер френдли интерфейсе. Чтобы элементы при наведении меняли цвета и делали это плавно. Изучим эту тему на следующих уроках.

 

Для продолжения прохождения курса загрузите свой АРХИВ папки с проектом

Создание сайта Furniro. Main 2 часть

Grid Layout

Мощная система сеток, доступная в CSS, которая позволяет гибко управлять макетом веб-страниц, организуя элементы в строки и столбцы. Она была разработана для создания более сложных, но при этом гибких и адаптивных макетов, не прибегая к хакам с float или позиционированием.

В предыдущих уроках у нас уже была тема сеток. Там мы выстраивали сетку за счет свойства inline-block, но для практики будет полезно знать и другие возможности решения задач с сетками.

Основные концепции Grid Layout:

  • Контейнер сетки (Grid Container): Элементы, к которым применяется свойство display: grid; , становятся контейнером сетки. Все дочерние элементы внутри этого контейнера автоматически становятся элементами сетки (grid items).
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
}

  • Строки и столбцы (Grid Rows and Columns): Сетка состоит из горизонтальных строк и вертикальных столбцов. Для их настройки используется свойство grid-template-rows (для строк) и grid-template-columns (для столбцов). Например создадим три столбца по 200px и две строки по 100px.:
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
      grid-template-columns: 200px 200px 200px; /* Три столбца фиксированной ширины */
      grid-template-rows: 100px 100px; /* Две строки фиксированной высоты */
}

  • Фракции (Fraction units): Единица измерения fr — это особая единица в Grid Layout, которая позволяет делить свободное пространство. Например, если указать 1fr 2fr , первый столбец займет 1 часть пространства, а второй — 2 части.
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
      grid-template-columns: 1fr 2fr; /* Второй столбец будет в два раза шире первого */
}

  • Автоматическая расстановка строк и столбцов (auto): Вместо указания фиксированных размеров можно использовать auto , чтобы браузер сам определил размер строк и столбцов в зависимости от содержимого:
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
      grid-template-columns: 200px auto; /* Второй столбец займет оставшееся пространство */
}

  • Разрыв сетки (Grid Gap): Чтобы добавить расстояние между строками и столбцами, используется свойство gap . Например:
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
      grid-template-columns: 1fr 2fr;
      grid-gap: 20px; /* Пробел между строками и столбцами */
}

  • Расположение элементов (Grid Item Placement): Элементы внутри контейнера сетки можно явно размещать в нужных местах. Например, с помощью свойств grid-column и grid-row можно задать, какие ячейки сетки будут занимать элементы.
CSS
Код скопирован в буфер обмена copy

.grid_item {
      grid-column: 1 / 3; /* Элемент растянется с 1-го по 3-й столбец */
      grid-row: 2 / 4; /* Элемент будет охватывать 2-ю и 3-ю строки */
}

  • Автоматическое размещение (Auto Placement): Если не указано явное позиционирование, Grid Layout автоматически разместит элементы сетки в первой доступной ячейке.
  • Повторяющиеся строки или столбцы (repeat): Функция repeat ( )  помогает легко создавать повторяющиеся строки или столбцы:
CSS
Код скопирован в буфер обмена copy

.grid_container {
      display: grid;
      grid-template-columns: repeat(3, 1fr); /* Три столбца одинаковой ширины */
}

Пример сетки Grid Layout

  1. grid-template-columns: repeat(3, 1fr); — три столбца одинаковой ширины. Единица измерения 1fr означает, что каждый столбец займет равную часть доступного пространства.
  2. grid-gap: 10px; — расстояние между элементами сетки составляет 10px.

Grid Layout значительно упрощает создание сложных макетов страниц, поддерживая гибкость и адаптивность. Это мощный инструмент для веб-разработки, особенно для построения многострочных и многоколоночных макетов.

Практика

Ссылка на макет сайта: www.figma.com/design

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

Первым делом анализируем блок: из каких элементов он состоит, какие теги применять и как позиционировать элементы относительно друг-друга.

  • Заголовок второго уровня;
  • Группа карточек товаров и тут мы уже знаем, что повторяющиеся блоки можно оформлять списком;
  • Кнопка.

Базовая структура с контентом:

HTML
Код скопирован в буфер обмена copy

<main>
      <article>
            <h2> </h2>
            <ul>
                 li*8
            </ul>
            <button> </button>
      </article>
</main>

Сверяемся с сайтом:

Начинаем оформлять стили. Создаём классы и пишем CSS код.

HTML
Код скопирован в буфер обмена copy

<main>
      <article class="flex catalog">
            <h2 class="second_heading"> </h2>
            <ul class="list_reset catalog_list">
                 li*8
            </ul>
            <button class="btn_reset catalog_btn"> </button>
      </article>
</main>

Для начала поставим весь контент этого блока по центру. Так как свойство flex-блоков и сброс настроек списка и кнопки у нас уже определено, на сайте мы видим только два текста:

Сейчас покажу последовательность вёрстки:

  • устанавливаем ограничение по ширине блока согласно макету:
CSS
Код скопирован в буфер обмена copy

.catalog {
      max-width: 1236px;
}

  • ставим весь блок по центру относительно родительского контейнера (всей страницы) и назначаем нижний отступ:
CSS
Код скопирован в буфер обмена copy

.catalog {
      max-width: 1236px;
      margin: 0 auto;
      margin-bottom: 55px;
}

  • выставляем контент в колонну и по центру:
CSS
Код скопирован в буфер обмена copy

.catalog {
      max-width: 1236px;
      margin: 0 auto;
      margin-bottom: 55px;
      flex-direction: column;
      align-items: center;
}

Мы видим, что у заголовка нижний отступ больше, поэтому зададим заголовку новый класс и переназначим отступ.

HTML
Код скопирован в буфер обмена copy

<main>
      <article class="flex catalog">
            <h2 class="second_heading catalog_heading"> </h2>
            <ul class="list_reset catalog_list">
                 li*8
            </ul>
            <button class="btn_reset catalog_btn"> </button>
      </article>
</main>

CSS
Код скопирован в буфер обмена copy

.catalog_heading {
      margin-bottom: 55px;
}

Далее мы будем работать только со списком. Так как оформление в блоках повторяется, то я буду показывать на примере 4х блоков (элементов списка - <li> </li> ). Но на вашем сайте их должно быть так же как в макете - восемь.

Скачайте изображения для карточек товаров в папку "img".

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img src="img/catalog_img_1.jpg" alt="Карточка товара">
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_2.jpg" alt="Карточка товара">
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_3.jpg" alt="Карточка товара">
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_4.jpg" alt="Карточка товара">
      </li>
</ul>

Сейчас вы можете видеть, что все картинки выстроились в один столбик. Но с помощью сеток grid, мы можем уже формировать нужную нам структуру.

Свойства сетки прописываются родительскому блоку.

CSS
Код скопирован в буфер обмена copy

.catalog_list {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 32px;
}

После настройки сетки, можно добавить еще нижний отступ, чтобы отделить блок от кнопки.

CSS
Код скопирован в буфер обмена copy

.catalog_list {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 32px;
      margin-bottom: 25px;
}

Все элементы списка выстроились в сетку, так как нам нужно.

Продолжим работу с элементами, добавим нижний блок карточки товара. Сначала определим структуру.

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img src="img/catalog_img_1.jpg" alt="Карточка товара">
           <div>
                <h3> </h3>
                <span> </span>
                <span> </span>
                <span> </span>
           </div>
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_2.jpg" alt="Карточка товара">
           <div>
                <h3> </h3>
                <span> </span>
                <span> </span>
           </div>
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_3.jpg" alt="Карточка товара">
           <div>
                <h3> </h3>
                <span> </span>
                <span> </span>
                <span> </span>
           </div>
      </li>
      <li class="catalog_item">
           <img src="img/catalog_img_4.jpg" alt="Карточка товара">
           <div>
                <h3> </h3>
                <span> </span>
                <span> </span>
           </div>
      </li>
</ul>

Обратите внимание, что сейчас не у всех карточек есть сниженная цена, а значит нет одного тега <span> .

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

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img src="img/catalog_img_1.jpg" alt="Карточка товара">
           <div class="item_block">
                <h3 class="item_heading"> </h3>
                <span class="item_name"> </span>
                <span class="item_price"> </span>
                <span class="item_full_price"> </span>
           </div>
      </li>
</ul>

CSS
Код скопирован в буфер обмена copy

.item_block {
      background-color: #F4F5F7;
      padding: 16px 16px 30px 16px;
      min-height: 145px;
}

Мы видим небольшое расстояние между изображением и серым блоком. Чаще всего это расстояние появляется из-за того, что изображение - это строчный элемент и браузеры часто подставляют в такие элементы собственные настройки. Эта проблема решается изменением свойства со строчного на блочный.

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img class="item_img" src="img/catalog_img_1.jpg" alt="Карточка товара">
           <div class="item_block">
                <h3 class="item_heading"> </h3>
                <span class="item_name"> </span>
                <span class="item_price"> </span>
                <span class="item_full_price"> </span>
           </div>
      </li>
</ul>

CSS
Код скопирован в буфер обмена copy

.item_img {
      width: 100%;
      min-height: 300px;
      object-fit: cover;
      display: block;
}

Свойство object-fit: cover; используется для управления тем, как содержимое (например, изображения или видео) будет отображаться внутри контейнера, если размеры содержимого не совпадают с размерами контейнера. Это свойство особенно полезно, когда нужно сделать изображение адаптивным, но при этом сохранить его пропорции.

Теперь всё хорошо и можно продолжить стилизовать тексты внутри серого блока.

CSS
Код скопирован в буфер обмена copy

.item_heading {
      margin: 0;
      margin-bottom: 8px;
      font-weight: 500;
      font-size: 24px;
      color: #3a3a3a;
}
.item_name {
      display: block;
      margin-bottom: 8px;
      font-weight: 400;
      font-size: 16px;
      color: #898989;
}
.item_price {
      font-weight: 500;
      font-size: 20px;
      color: #3a3a3a;
}
.item_full_price {
      font-weight: 400;
      font-size: 16px;
      color: #898989;
      text-decoration: line-through;
}

Так как <span> </span> строчный элемент, и в тегах стоимостью товара мы не поменяли модель поведения на блочную, в отличие от названия товара, то обе цены стоят на одной строке. Чтобы сделать расстояние между ними и прижать старую цену (зачеркнутую) к правому краю, можно объединить их в один div .

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img class="item_img" src="img/catalog_img_1.jpg" alt="Карточка товара">
           <div class="item_block">
                <h3 class="item_heading"> </h3>
                <span class="item_name"> </span>
                <div class="flex item_prices">
                     <span class="item_price"> </span>
                     <span class="item_full_price"> </span>
                </div>
           </div>
      </li>
</ul>

CSS
Код скопирован в буфер обмена copy

.item_prices {
      align-item: center;
}
.item_price {
      margin-right: auto;
      font-weight: 500;
      font-size: 20px;
      color: #3a3a3a;
}
.item_full_price {
      font-weight: 400;
      font-size: 16px;
      color: #898989;
      text-decoration: line-through;
}

Добавим плашки дисконта.

HTML
Код скопирован в буфер обмена copy

<ul class="list_reset catalog_list">
      <li class="catalog_item">
           <img class="item_img" src="img/catalog_img_1.jpg" alt="Карточка товара">
           <div class="item_block">
                <h3 class="item_heading"> </h3>
                <span class="item_name"> </span>
                <div class="flex item_prices">
                     <span class="item_price"> </span>
                     <span class="item_full_price"> </span>
                </div>
                <div class="item_badge discont">-30%</div>
           </div>
      </li>
</ul>

Для бейджей "New" сделайте собственный класс для определения цвета "new".

CSS
Код скопирован в буфер обмена copy

.item_badge {
      padding: 12px 6px;
      border-radius: 50%;
      font-weight: 400;
      font-size: 16px;
      color: #fff;
      line-height: 1.5;
      text-align: center;
}
.discont {
      background-color: #E97171;
}
.new {
      background-color: #2EC1AC;
}