Медиа запросы

Медиазапрос — это подключение определенных стилей при определенной ширине экрана пользователя.

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

Первое, что необходимо сделать, для подключения адаптивности сайта — прописать мета тег с параметрами вьюпорта.

Ранее эту строку мы добавляли в наш html файл.

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

А дальше подключаем медиазапрос.

В файле CSS пишем

@media ()

Важно! Медиазапрос должен идти после стилей, которые вы хотите менять по правилам потока вёрстки.

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

Мы можем сделать медиазапрос для мобильной версии сайта шириной 360px.

@media (max-width: 360px)

Далее, для проверки подключения нового стиля по медиа запросу изменим цвет заголовка на странице на красный. При этом будем обращаться не к тегу заголовка h1, а к созданному классу для этого заголовка.

На скриншоте видно, что сначала идет общие стили для заголовка, а следом идет переназначение нового стиля для ширины экрана 360px.

Теперь в отладчике мы можем увидеть, что заголовок меняет цвет, как только браузер сжимается до 360 px и меньше.

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

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

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

Чтобы ориентироваться в разных вариантах ширины девайсов скачайте себе памятку: Адаптивы

Смена изображения при уменьшении ширины сайта

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

Избежать это можно при помощи тега picture, в котором есть встроенные медиазапросы.

Для примера возьмем изображение, которое мы добавили в html файл

Нам необходимо обернуть это изображение в тег picture

Дале необходимо прописать тег source и srcset с новой картинкой. Для примера, я использую совершенно другое изображение

а дальше прописать media для определения ширины экрана

Внимательно посмотрите на синтаксис.

Теперь при ширине экрана равном 600 или менее пикселей картинка будет меняться автоматически.

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

Псевдоклассы :hover и :active при адаптиве

Для десктопной версии сайта изменение свойств при наведении работает хорошо, но очевидно, что для мобильной версии это не нужно. А вот :active хорошо подойдет для мобильной и планшетной версии, так пользователь будет понимать с какими элементами он взаимодействует пальцем. Но нужно ли прописывать это отдельно в коде? Нет, так как :hover на мобильной версии работает как :active дополнительно при этом ничего не нужно прописывать

Пример. При наведении в десктоп версии див становится черным.

А в мобильной версии черный цвет будет только при нажатии ЛКМ. При этом код остается неизменным.

 

Адаптивная верстка и проверка Pixel perfect

Что такое адаптивная верстка?

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

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

Виды верстки сайтов

  1. Сайты с фиксированной шириной
    Контейнер сайта имеет строго заданную ширину. Даже если вы сжимаете или расширяете окно браузера, сайт не адаптируется к новым размерам.
    На мобильных устройствах фиксированный сайт выглядит как уменьшенная копия десктопной версии.
    Это устаревший подход, который редко используется.
  2. Резиновая верстка
    Элементы сайта адаптируются к ширине окна браузера, используя относительные единицы измерения, такие как проценты (%).
    Пример: ширина блока width: 50%; сделает его равным половине ширины окна браузера.
    Недостаток: на очень узких экранах контент может "сплющиваться" или терять читаемость.
  3. Адаптивная верстка
    Контент и его расположение изменяются в зависимости от размера экрана. Чаще всего это достигается с помощью медиа-запросов.
    Пример медиа-запроса:
    CSS
    Код скопирован в буфер обмена copy
    @media (max-width: 768px) {
    .header {
    flex-direction: column;
    }
    }
  4. Смешанная верстка (резиновая + адаптивная)
    Самый популярный подход. Он сочетает преимущества резиновой и адаптивной верстки, позволяя сайту оставаться удобным на любых устройствах.

Проверка верстки с помощью Pixel Perfect

Чтобы проверить, насколько точно ваша вёрстка совпадает с макетом, можно использовать расширение Pixel Perfect. Оно позволяет наложить макет из графического редактора (например, Figma) на ваш сайт и выявить расхождения.

Установка Pixel Perfect

  1. Установите расширение для браузера Google Chrome (или другого браузера):
    - Перейдите по ссылке: Установить Pixel Perfect
    - Нажмите кнопку "Установить"

    Далее «Установить расширение»

    В правом верхнем углу у вас появится уведомление об установке расширения для браузера.
  2. После установки настройте расширение:
    - В правом верхнем углу нажимаем три точки, далее раздел «Расширения», далее «Управление расширениями»

    - В открывшимся окне находим расширение Pixel Perfect и нажимаем «Сведения»

    - Включаем настройку «Разрешить открывать локальные файлы по ссылкам»

    - Закрываем окно настроек.

Подготовка макета для Pixel Perfect

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

В макете фигма, находим нужный нам блок с дизайном и нажимаем на название в левом верхнем углу. Там чаще всего пишется ширина экрана для которого предназначен данный макет. В примере это «chapters_1920» — макет предназначен для ширины браузера 1920 пикселей.

После того, как весь блок выделен на правой панели идем в раздел «Export» и сохраняем изображение всей страницы в формате .png, так же, как ранее мы сохраняли другие изображения из макета.

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

Загружаете скаченное изображение макета в расширение Pixel Perfect. В правом верхнем углу нажмите на значок пазла и выберите расширение Pixel Perfect.

Откроется интерфейс расширения

Нажмите на кнопку «Добавьте ваш первый слой!» и загрузите скаченное ранее изображение дизайна из фигмы.

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

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

В интерфейсе Pixel Perfect используйте кнопку для центрования изображения: выделяется голубым цветом

И видим, что по ширине наш контент совпадает с макетом, а вот высота нет

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

Чтобы макет не смещался по области сайта, нужно нажать замочек и тогда он будет статичным

Сверху установите значение расширения, которое нам требуется: 1920

Очевидно, что есть над чем поработать и где-то есть неточности в вёрстке по высоте блоков.

Использование Pixel Perfect в работе зависит от нескольких факторов, включая требования заказчика, тип проекта и практики, принятые в команде.

Когда требуется Pixel Perfect?

  1. Требование заказчика
    Некоторые клиенты (особенно дизайнеры или крупные бренды) могут требовать, чтобы сайт максимально точно соответствовал их макету. В таких случаях Pixel Perfect становится обязательным инструментом для проверки.
  2. Работа с премиум-дизайном
    Если проект ориентирован на визуальное совершенство (например, сайты модных брендов, портфолио, презентационные страницы), точность макета имеет большое значение.
  3. Плотное взаимодействие с дизайнером
    В командах, где верстальщик и дизайнер работают в связке, Pixel Perfect помогает поддерживать единый стандарт качества и минимизировать расхождения.
  4. Проекты с чёткими гайдлайнами
    Если у проекта есть строгие гайдлайны (например, для корпоративных сайтов), точное соблюдение размеров, отступов и цветов становится важным.
    *Гайдлайн (от англ. guideline — "руководство" или "инструкция") — это документ, в котором собраны правила, рекомендации и стандарты для работы над проектом.

Когда Pixel Perfect не обязателен?

  1. Адаптивная верстка
    В адаптивных сайтах важнее удобство и корректное отображение на всех устройствах, чем идеальное соответствие макету. Небольшие расхождения (например, в 1-2 пикселя) считаются допустимыми.
  2. Прототипы и MVP
    На этапе разработки прототипа или минимально жизнеспособного продукта (MVP) ключевую роль играют функциональность и сроки, а не идеальная точность дизайна.
  3. Бюджетные проекты
    На небольших проектах, где бюджет ограничен, клиент может не уделять внимания пиксельной точности, если сайт выглядит аккуратно.
  4. Креативная свобода
    В некоторых случаях заказчики доверяют разработчику и позволяют отойти от макета, если это улучшает пользовательский опыт.

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

Переменные в CSS

Переменные в CSS позволяют упростить работу с кодом и сделать его более гибким для изменений. Они помогают обозначать часто используемые значения, такие как цвета, размеры отступов, параметры шрифтов и т.д. Это особенно полезно, если дизайн сайта требует изменений: вместо того чтобы редактировать каждый класс вручную, вы сможете внести изменения в одном месте, где определена переменная.

Пример: использование переменной для цвета

Представим ситуацию: на вашем сайте используется одинаковый цвет для нескольких элементов (например, кнопок, заголовков или текста). Если вы захотите изменить этот цвет, редактировать каждый класс вручную будет долго и неудобно. Переменные CSS решают эту проблему.

Псевдокласс :root

Чтобы переменные были доступны глобально (для всего сайта), их обычно определяют внутри псевдокласса :root . Это специальный селектор, который обозначает корневой элемент документа (обычно это <html> ).

Пример создания переменной:

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

:root {
--violet-color: red;
}

Теперь создадим класс для параграфа:

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

<p class="text">
Как работает переменная CSS
</p>

Раньше мы бы использовали просто написание цвета:

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

.text {
color: red;
}

Но теперь стилизуем его в CSS, используя переменную:

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

:root {
--violet-color: red;
}
.text {
color: var(--violet-color);
}

Если вы решите изменить цвет текста, достаточно обновить значение переменной в :root .

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

:root {
--violet-color: green;
}

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

Преимущества использования переменных

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

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

.header {
color: green;
}
.footer {
color: green;
}
.button {
color: green;
}

С использованием переменных всё намного проще:

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

:root {
--main-color: green;
}
.header {
color: var(--main-color);
}
.footer {
color: var(--main-color);
}
.button {
color: var(--main-color);
}

Если потребуется изменить цвет, достаточно обновить значение переменной в одном месте:

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

:root {
--main-color: red;
}

Общий синтаксис переменных

Для использования переменной в CSS применяется функция var() .

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

color: var(--имя переменной, значение по умолчанию);

--имя переменной - например --main-color;

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

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

 

Видео обзор темы  можно посмотреть по ссылке: Запись урока

 

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

Проанализируйте ваш проект Furniro, найдите повторяющиеся стили и задайте им переменные.

Регистрация Хостинга

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

Timeweb — это популярный хостинг в России, который предлагает удобный интерфейс, поддержку PHP и MySQL (о них мы узнаем в следующих курсах), а также множество других полезных инструментов для работы с сайтами.

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

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

Регистрация на Timeweb

Вас перекинет на новую страницу.

  • Нажмите кнопку "Регистрация" .

  • Заполняем данные для регистрации:
    - ФИО на русском;
    - действующий e-mail адрес;
    - телефон вводить не обязательно, но лучше ввести, чтобы была возможность восстановить аккаунт при необходимости;
    - по желанию можете создать себе имя пользователя: это будет ваш login для входа;
    - пропишите код партнёра: 121641;
    - галочки ниже под кнопкой "Зарегистрироваться" должны быть нажаты;

  • После заполнения данных, нажмите кнопку "Зарегистрироваться"
  • Далее вас перекинет на страницу с проверкой платежеспособности

  • Нажмите кнопку "Перейти к оплате"
  • Введите данные действующей русской банковской карты или воспользуйтесь функцией SberPay

  • После авторизации карты вас перекинет на страницу Личного кабинета Хостинга

  • На этом этапе мы не будем оплачивать никакие подписки, поэтому просто перейдем в раздел "Дашборд" на панели слева

 

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

  • Сейчас у вас есть тестовый период 10 дней и мы воспользуемся этой возможностью. Разместим ваш первый сайт в интернете.
  • Обратите внимание, что в разделе "Дашборд" в статистике "Сайты" у вас стоит цифра 1 из 15. Но ведь мы только зарегистрировались и еще не создавали сайт.

  • Разверните раздел "Сайты" в левой панели и перейдите в раздел "Мои сайты"

  • В списке созданных сайтов вы увидите сайт с адресом с формате: вашлогин.tw1.ru
    в моем случае это sokharev18.tw1.ru

Что это значит: TimeWeb автоматически создал для вас тестовый домен.
Про домены мы поговорим в отдельном уроке. На этом этапе нам будет достаточно тестового домена.

  • Нажмите на доменное имя ПКМ "Открыть ссылку в новой вкладке". В моём случае sokharev18.tw1.ru

  • У вас откроется вкладка сайта с базовой информацией от TimeWeb

Переносим сайт на хостинг TimeWeb

  • Вернитесь во вкладку "Дашборд"
  • Перейдите в раздел "Файлы"

  • У вас уже есть созданная папка public_html . Эта папка привязана сейчас к нашему тестовому домену.

  • Кликните на нее два раза, чтобы зайти внутрь папки. Сейчас в папке вы видите другую папку cgi-bin и index.html

Именно в файле index.html сейчас прописан код странички приветствия TimeWeb, которую мы видим в браузере.

  • Удалите этот файл. Можно нажать на три точки справа от файла или выделить файл и в верхней панели инструментов нажать значок корзины.

  • Нажмите кнопку загрузить на верхней панели инструментов или перетащите все файлы вашего проекта. Сейчас нам нужны все папки и файл index.html

  • Дождитесь загрузку всех файлов

  • перейдите на страницу сайта и обновите браузер.

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

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

Сейчас это просто страница, на которой отображается наша вёрстка и стили CSS. Чтобы пользователь мог дальше взаимодействовать с сайтом, нам необходимо продолжать писать код. Чем мы с вами и займёмся в ближайшие уроки!

 

Скиньте техническую ссылку на ваш сайт на проверку в личные сообщения.

Создание формы обратной связи на сайте 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 чтобы составлять разные части кода - это всегда удобно, чтобы сразу видеть изменения и не "поломать" рабочую версию кода.

Желаю удачи!

 

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

Формы для ввода данных и работа с текстом

Типограф

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

www.artlebedev.ru/typograf/

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

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

Формы для ввода данных

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

Для создания формы используется тег <form> </form>

action — это основной атрибут тега form, в него мы пишем адрес, куда будет отправлена форма. Подробнее об этом будет в следующих уроках.

method — это атрибут метода отправки данных.

Значение get — это первый метод отправки данных. Он идет по умолчанию и добавляет данные в URL браузера. Это наглядно видно, когда вы выбираете какие-то фильтры на сайте и данные сохраняются в URL адрес.

При выборе материала ПВХ в URL адресе в браузерной строке мы увидим код этого материала, который ему задал разработчик при добавлении на сайт:

post — такой метод отправки данных позволяет включить данные в саму форму и отправить их на сервер или на почту. Используется для отправки больших объемов данных и выполнения операций, которые изменяют состояние на сервере (например, регистрация, вход, добавление данных). Данные отправляются в теле запроса и не видны в URL, что делает метод более подходящим для передачи конфиденциальной информации.

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

<form action="#" method="post"></form>

Атрибут enctype — способ кодирования данных, который используется только при методе отправки post .

По умолчанию значение этого атрибута application/x-www-form-urlencoded оно означает, что данные будут кодироваться перед отправкой. Поэтому если у вас обычная отправка текста, то писать этот атрибут не нужно.

Если форма содержит поле для загрузки файла, то <input type="file"> , то используется свойство multipart/form-data .

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
</form>

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

Посмотрим как ведут себя другие теги внутри тега form .

Кнопка <button> чаще всего используется для отправки данных. В таком случае нужно изменить её тип свойством type со значением submit .

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
</form>

<input> — этот тег предназначен для ввода данных. В такое поле можно вводить данные или выбирать из имеющихся вариантов.

Тип ввода данных определяется атрибутом type .

Значение text[/taag] идет по умолчанию и позволяет писать текст в  поле для ввода.

[html]

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
</form>

[/html]

Значение [tag]number — в поле для ввода можно печатать только цифры.

Так же input-элементу с типом ввода данных number можно добавить дополнительные атрибуты, которые ограничат числовую шкалу.

min — минимальное число для ввода в поле;

max — максимлаьное число для ввода в поле.

Например, можно вводить любое число от нуля до десяти:

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
</form>

Значение email — это так же поле для ввода текста, но предназначенное для ввода адреса электронной почты.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
</form>

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

то есть в поле ввода со значением email стоит проверка на правильность написания. Поле должно содержать текст + спец символ почты @ + текст после. При открытии страницы с телефона и нажатии на поле для ввода email автоматически будет показана клавиатура со спец символами почты.

Значение tel — работает по той же логике. Это поле нужно для ввода номера телефона, но в этом поле автоматическая проверка уже не проходит и в него можно вводить как текст, так и числа. При открытии страницы на телефоне и нажатии на поле для ввода телефона, появится клавиатура с цифрами.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
</form>

Значение password — в переводе с английского — «пароль», соответственно это значение мы используем у поля для ввода пароля.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
      <input type="password">
</form>

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

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

Значение date — поле для ввода даты.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
      <input type="password">
      <input type="date">
</form>

Значение search — это поле для ввода поиска информации. Это значение не отличается от значения text , тут так же можно вводить любые данные. Но если на сайте в этом разделе будет именно поисковая строка, то принято использовать значение search .

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
      <input type="password">
      <input type="date">
      <input type="search">
</form>

Значение file — поле для загрузки файлов.

Для значения file есть дополнительный атрибут, который позволяет выбирать только определенные типы файлов — accept . В него прописывается значение с типом файла. Если мы напишем image/* то для выбора будут доступны только изображения .img, файлы с другим разрешением выбрать будет нельзя.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text">
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
      <input type="password">
      <input type="date">
      <input type="search">
      <input type="file" accept="image/*">
</form>

Общий атрибут для всех inputrequired

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

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text" required>
      <input type="number" min="0" max="10">
      <input type="email">
      <input type="tel">
      <input type="password">
      <input type="date">
      <input type="search">
      <input type="file" accept="image/*">
</form>

Я добавила атрибут required для первого input . Теперь это поле обязательно должно быть заполнено перед отправкой. Если поле не заполнить и нажать кнопку «Отправить», появится ошибка:

Атрибут для ограничения количества символов для ввода — maxlenght

Работает с input-элементми со значением text , email , password , search . То есть для всех форм, где вводятся текстовые данные.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text" required maxlenght="10">
      <input type="number" min="0" max="10">
      <input type="email" maxlenght="10">
      <input type="tel">
      <input type="password" maxlenght="10">
      <input type="date">
      <input type="search" maxlenght="100">
      <input type="file" accept="image/*">
</form>

Подпись-подсказка внутри input

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

Атрибут placeholder . В него вводится необходимый текст, который и будет отображаться в форме.

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

<form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Отправить</button>
      <input type="text" required maxlenght="10" placeholder="Фамилия Имя">
      <input type="number" min="0" max="10">
      <input type="email" maxlenght="10">
      <input type="tel">
      <input type="password" maxlenght="10">
      <input type="date">
      <input type="search" maxlenght="100">
      <input type="file" accept="image/*">
</form>

Тег <textarea></textarea> позволяет вводить большое количество текста.

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

<form action="#" method="post">
      <textarea></textarea>
</form>

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

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

<form action="#" method="post">
      <textarea name="message" placeholder="Как прошло ваше лето"></textarea>
</form>

Значение radio (радиокнопка) — это значение атрибута type , когда можно выбрать только один из предложенных вариантов.

При написании этой строчки кода, у вас появляется один элемент, который можно выделить:

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

<form action="#" method="post">
      <input type="radio">
</form>

Не выделенный элемент:

Выделенный элемент:

К элементу можно добавить текст:

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

<form action="#" method="post">
      <input type="radio">Мужской пол
</form>

Таким способом можно создать несколько полей на выбор:

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

<form action="#" method="post">
      <input type="radio">Мужской пол
      <input type="radio">Женский пол
</form>

Для этого типа input так же можно добавить атрибут checked — так элемент будет уже выделен.

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

<form action="#" method="post">
      <input type="radio">Мужской пол
      <input type="radio" checked>Женский пол
</form>

Обратите внимание на то, что сейчас вы можете выбрать оба варианта:

Радиокнопки нам нужны для того чтобы пользователь мог выбрать только один вариант. Каждый такой инпут — это какое-то значение. Это мы знаем по тексту, что значат эти кнопки, а вот компьютер еще не знает. Это нужно ему написать с помощью атрибута name . При чем этот атрибут нужно написать для всех элементов, объединенных по смыслу.

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

<form action="#" method="post">
      <input type="radio" name="gender">Мужской пол
      <input type="radio" checked name="gender">Женский пол
</form>

Теперь вы не можете выбрать оба варианта, а только один из них.

Так же в этом блоке есть важный момент. Мы подписали радиокнопки текстом «Мужской пол» и «Женский пол», но это просто текст. Это контент, который браузер не будет считывать в виде кода и отправлять при нажатии кнопки «Отправить». Данные для отправки нужно прописать отдельно с помощью атрибута value .

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

<form action="#" method="post">
      <input type="radio" name="gender" value="Мужской пол">Мужской пол
      <input type="radio" checked name="gender" value="Женский пол">Женский пол
</form>

Дополнительный тег, для удобства оформления верстки полей ввода. Тег <label></label>

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

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

<form action="#" method="post">
      <label>
            <input type="radio" name="gender" value="Мужской пол">Мужской пол
      </label>
      <input type="radio" checked name="gender" value="Женский пол">Женский пол
</form>

Радиокнопка внутри тега <label> теперь активна и районе текста «Мужской пол», то есть, если нажать на сам текст, радиокнопка будет выбрана, тогда как в input с женским полом, будет работать только сама радиокнопка, без текста.

Выпадающий список, в котором можно выбрать один вариант из предложенных оформляется с помощью тега <select></select> .

Напишем код на примере месяцев.

В атрибуте name пишем значение объединяющий их по теме — month .

Внутри тега вкладывается другой тег <option></option> в которое как раз и вписывается значение для выбора.

Для тега <option> обязательно прописывает атрибут value — это будет то, что пользователь отправит при нажатии на кнопку «Отправить».

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

<form action="#" method="post">
      <select name="month">
            <option value="Январь">Январь</option>
            <option value="Февраль">Февраль</option>
            <option value="Март">Март</option>
      </select>
</form>

Если какой то из вариантов в выпадающем списке необходимо сделать не активным, этому тегу нужно прописать атрибут disabled . Заблокируем Февраль:

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

<form action="#" method="post">
      <select name="month">
            <option value="Январь">Январь</option>
            <option value="Февраль" disabled>Февраль</option>
            <option value="Март">Март</option>
      </select>
</form>

Теперь его выбрать нельзя

Тег <fieldset></fieldset>  — объединяет в себе по смыслу группу input или других полей ввода данных. Другими словами — набор полей.

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

<form action="#" method="post">
      <fieldset>
           <select name="month">
                 <option value="Январь">Январь</option>
                 <option value="Февраль" disabled>Февраль</option>
                 <option value="Март">Март</option>
           </select>
      </fieldset>
</form>

К этому тегу можно сделать общий заголовок с помощью отдельного тега <legend></legend> .

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

<form action="#" method="post">
      <fieldset>
           <legend>Выберите месяц</legend>
           <select name="month">
                 <option value="Январь">Январь</option>
                 <option value="Февраль" disabled>Февраль</option>
                 <option value="Март">Март</option>
           </select>
      </fieldset>
</form>

Значение типа input-элемента  checkbox (чекбокс) — позволяет выбрать сразу несколько вариантов из предложенных или можно оставить выбор пустым.

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

<form action="#" method="post">
      <input type="checkbox">Тыквенный сок</input>
      <input type="checkbox">Лимонный пирог</input>
      <input type="checkbox">Имбирный эль</input>
</form>

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

 

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

Градиенты

Делать градиент мы можем при помощи кода, а не отдельных png-элементов, которые нарисовал дизайнер.

Линейный градиент

Для него нам потребуется свойство background-image .

Сначала выставляется тип градиента linear-gradient , а в скобках указывается значения цветов.

При написании двух вариантов цвета градиент по умолчанию распределяется равномерно 50 на 50%.

Если добавить к значению цвета процент, то можно регулировать соотношение цветов.

Так же можно добавлять любое количество цветов и % их распределения в блоке. Например, три цвета:

или пять:

Сейчас градиент располагает сверху вниз, но мы можем регулировать это значение с помощью градусов ( degrees ).

Для того значение градусов нужно поставить перед цветовыми значениями. Например, 90 градусов (90deg) и цвет пойдет слева на право.

Или 45 градусов и тогда цвет будет от левого нижнего угла.

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

Так же значение градуса можно писать просто словами: to top (0 градусов), to right (90 гардусов), to bottom (180 градусов), to left (270 градусов).

Например, цвет идет с права на лево:

Радиальный градиент

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

Форму радиального градиента можно изменить на круг ( circle по умолчанию) или овал ( ellipse ).

Повторяющийся градиент

Значение свойства: repeating-linear-gradient или [/tag]repeating-radial-gradient[/tag] в котором указывается наклон в градусах, и значение цветов с толщиной линии.

 

Свойство transition. Скорость эффекта

В предыдущем уроке мы уже использовали свойство transition для того чтобы замедлить эффект движения карточки товара и появления линии в header .

Давайте еще раз отдельно посмотрим на это свойство и посмотрим на что еще оно способно.

Плавное изменение цвета

Смотрим на примере смены цвета текста, так как нам эта анимация уже знакома. Но так же это свойство можно применять в разных других анимациях: изменения размеров, позиционирования и т.д.

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

Для этого нам нужно прописать свойство transition и указать, что конкретно мы хотим. У нас это смена цвета текста ( color ) и скорость смены в секундах.

Получаем более плавный переход.

Дополнительные значения у свойства transition — свойство распределения времени анимации.

ease — значение по умолчанию, стандартный переход, скорость перехода увеличивается к середине и замедляется в конце

ease-in — начинается медленно, увеличивается к концу эффекта

ease-out — начинается быстро, замедляется к концу

ease-in-out — начинается медленно, потом ускоряется, а затем снова замедляется

linear — скорость всегда одинаковая

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

 

Еще один пример простой анимации

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

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

Вот так с помощью свойства transiton можно добиваться интересных визуальных эффектов вашему сайту.

Так же есть более точечные настройки для transition , позволяющие менять конкретные свойства.

Уменьшение кнопки по горизонтали при наведении

transition-property: background-color, width; - указываем какие именно свойства будут анимированы. В нашем случае: цвет фона и ширина кнопки.

transition-duration: 0.5s; - определяем скорость перехода.

 

 

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

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

 

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

 

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

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

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

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

:last-child и тп. — когда новые свойства применяются к определенному элементу в блоке.

:hover — когда элементу задаются новые свойства при наведении на него мышкой.

:placeholder — когда новые свойства назначаются для плейсхолдера.

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

Оформление главной страницы сайта мебельного магазина

Вернемся к оформлению ранее созданной страницы.

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

Будем работать с файлом index.html .

Сейчас в <header> при наведении на меню навигации ничего не происходит. Просто меняется курсор на "палец". Но нам нужно добавить немного интерактива в страницу и изменять цвет текста при наведении.

Для этого используется псевдокласс :hover .

Для начала зададим новый класс всем ссылкам в навигации.

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

<nav class="navigation">
      <ul class="list_reset flex nav_list">
            <li>
                  <a class="nav_link" href="#">Главная</a>
            </li>
            <li>
                  <a class="nav_link" href="#">Магазин</a>
            </li>
            <li>
                  <a class="nav_link" href="#">О нас</a>
            </li>
            <li>
                  <a class="nav_link" href="#">Контакты</a>
            </li>
      </ul>
</nav>

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

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

.nav_link:hover {
     color: #B88E2F; 
}

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

То же самое сделаем с копками на сайте.

Для кнопки на банере у нас уже есть класс banner_btn[tag] используем его для создания псевдоэлемента. Сделаем цвет фона немного темнее, чтобы было видно, что кнопка активна.

[css]

.banner_btn:hover {
     background-color: #aa8633; 
}
</form>

[/css]

Далее кнопка в каталоге товаров.

[css]

.catalog_btn:hover {
     background-color: #B88E2F; 
     color: #fff; 
}
</form>

[/css]

Теперь при наведении меняется не только цвет кнопки, но и цвет текста внутри неё.

Далее в [tag]footer нужно так же добавить псевдокласс для элементов меню, ссылок и кнопки.

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

.footer_item:hover {
     color: #B88E2F; 
}
</form>

И для кнопки "Подписаться".

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

.footer_btn:hover {
     color: #B88E2F; 
}
</form>

И для ссылки - Политика конфиденциальности.

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

.footer_privacy:hover {
     color: #B88E2F; 
}
</form>

Создание сайта 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

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