- Денис Горелов
- CSS и CSS3
- Просмотров: 0
FLEX-BOX в CSS3 | Эффект при неведении
Многим интересен flexbox своей гибкостью, но не каждый понимает как с ним работать, и как всегда сталкиваемся с одной проблемой, не достаточно практических примеров по flex. По этому случаю я решил последующие уроки по CSS акцент делать на flex-box. Тем самым сможете, укрепите свои базовые знания, и внедрять их в свои проекты.
See the Pen eePBRE by Denis (@Dwstroy) on CodePen.
В текущем уроке поработаем с объектом изображений. При помощи transform и transition, сделаем по наведению следующую анимацию. Изображение немного повернем, увеличим иго в размерах, изменим цветокоррекцию. При наведении с левой стороны выезжают два блока с текстовой информацией. В нижней части появляется блок с иконками, которые подключим через сайт font-awesome. По наведению на иконку меняется цвет блока. Блоки иконок отобразим при помощи flex-box. Также блоки с изображением будут адаптивны, и подстраиваются под разные форматы экранов. Все это реализуем на flexbox и медиа запросах.
И давайте приступим к описанию каркаса.
Описываем каркас HTML
Открываем свою среду разработки, в моем случае это phpstorm. В структуре его создаем файл index.html. В нем разворачиваю doctype, я это делаю при помощи аббревиатуры dws!!. Как делать такие сниппеты я показывал в отдельном уроке по плагину EMMET. В течение урока я часто буду использовать данные сокращения, а полное их описание можете посмотреть в моем справочнике по emmet.
Прописываю в title «Адаптивный дизайн при помощи flexbox». Ниже идет мета тег viewport, он понадобится для адаптации элементов. За ним подключаем файл стилей, и отдельный файл для меди запросов, который будет запускаться при разрешение менее 900 пик.
Давайте сразу создаем их в структуре. Делаем папку CSS, и создаем в ней два файла, style.css и media.css, к ним еще отдельно вернемся, а тут сразу создадим дополнительно папку img для изображений.
Я заранее подготовил четыре картинки оного размера на 497х630 пик. копирую их в директорию jmg и возвращаемся в index файл.
Далее идет подключение иконок через CDN, оставим ее. Bootstrap нам тут не нужен, я его удаляю. Подключение скриптов и jquery тоже удаляю. Класс .dws-wrapper оставляем, это будет нашей оберткой при помощи которого, я центрую блок посередине экрана.
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Адаптивный дизайн при помощи flexbox</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="css/style.css" type="text/css"> <link rel="stylesheet" href="css/media.css" media="all and (max-width: 900px)" type="text/css"> <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> </head> <body> <section class="dws-wrapper"> </section> </body> </html>
Далее пишем структуру при помощи emmet. Создаем блок для изображения, в нем вложено изображение, за ним идет заголовок третьего уровня, параграф, блок UL со списками, в нутрии которого разрешение ссылка и все это в количестве пяти штук.
.imageBox>img+h3+p+ul>(li>a)*5
Жмем TAB и получили в принципе готовую структуру. Теперь заполним ее атрибуты и содержание списков.
<section class="dws-wrapper">
<div class="imageBox">
<img src="img/1.jpg" alt="Тренер">
<h3>Мария Кларк</h3>
<p>Инструктор</p>
<ul>
<li><a href="#"></a></li>
<li><a href="#"></a></li>
<li><a href="#"></a></li>
<li><a href="#"></a></li>
<li><a href="#"></a></li>
</ul>
</div>
</section>
Вставим затем иконки, для этого перейдем на сайт fontawesome.ru, скачивать их мы не будем, так как подключаем их через CDN bootstrap.
Переходим во вкладку иконок, и отбираем те, которые хотим использовать для своих проектов. У каждой иконки есть свой код, я его копирую с сайта и вставляю в ссылку.
Атрибут aria-hidden="true" можете удалить, данный параметр нам не понадобится.
<ul> <li><a href="#"><i class="fa fa-facebook"></i></a></li> <li><a href="#"><i class="fa fa-twitter-square"></i></a></li> <li><a href="#"><i class="fa fa-google-plus"></i></a></li> <li><a href="#"><i class="fa fa-linkedin"></i></a></li> <li><a href="#"><i class="fa fa-instagram"></i></a></li> </ul>
К самой структуре мы еще вернемся, а теперь перейдем в CSS и приступим к оформлению блоков.
Оформляем стили блока с изображением в CSS файле
Использую свою стандартную конструкцию для выравнивания блока и сбросов отступов у body.
body {
margin: 0;
padding: 0;
font-family: Verdana, Geneva, sans-serif;
}
.dws-wrapper {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
Далее оформим блок с изображением. Отбираем весь блок с классом .imageBox, добавляю ему стандартную обводку, что бы видеть его границы. Изображение нужно привести к одному размеру, для этого я добавляю фиксированную высоту в 270 пик. height: 270px, а для самого изображения задам минимальную ширину и высоту по 100%.
.imageBox {
outline: 1px solid orange;
height: 270px;
}
.imageBox img {
min-width: 100%;
height: 100%;
}
Как видите, изображение равномерно заполнило область блока, а остальные элементы вышли за ее пределы.
Давайте окончательно разберемся с картинкой. Трансформируем ее при наведении и добавим черно-белый фильтр. Увеличиваем картинку на 1.2 при помощи transform: scale(1.2), затем немного повернем на 10 градусов при помощи rotate(-10deg). Далее добавим фильтр filter: grayscale(.75), по умолчанию значение 0 есть цветность, если 1 то черно белое, возьмем .75.
Далее добавим :hover, а для плавности transition: .5s к самой картинке.
.imageBox:hover img {
-webkit-transform: scale(1.2) rotate(-10deg);
-moz-transform: scale(1.2) rotate(-10deg);
-ms-transform: scale(1.2) rotate(-10deg);
-o-transform: scale(1.2) rotate(-10deg);
transform: scale(1.2) rotate(-10deg);
filter: grayscale(.75);
}
.imageBox img {
-webkit-transition: .5s;
-moz-transition: .5s;
-ms-transition: .5s;
-o-transition: .5s;
transition: .5s;
}
А что бы изображение ни выходило за границы установленного блока, прописываем основному блоку overflow: hidden. Обводку уберем, а у изображения закруглим углы.
.imageBox {
overflow: hidden;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
Оформляем текстовые блоки
Теперь можно переходить к текстовым блокам. Для начала отобразим их, закомментировав overflow. Для размещения их в нутрии блока, задействуем position, для класса .imageBox прописываем position: relative, а заголовку и параграфу присвоим position: absolute. Так как блоки будут анимироваться, зададим тут же transition: .8s.
.imageBox {
height: 270px;
/*overflow: hidden;*/
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
position: relative;
}
.imageBox h3,
.imageBox p {
position: absolute;
-webkit-transition: .8s;
-moz-transition: .8s;
-ms-transition: .8s;
-o-transition: .8s;
transition: .8s;
}
Затем с позиционируем каждый блок по отдельности. Начнем с заголовка, отбираем его и задаем верхний отступ в 45%. Для параграфа верхний отступ зададим в 58%, и для текста назначим белый цвет color: #ffffff, добавим темный задний фон с прозрачностью background-color: rgba(0, 0, 0, 0.45), делаем внутренние отступы padding: 5px 15px и сбрасываем внешние margin: 0. С левой стороны делаем вертикальную черту в 2 пик. border-left: 2px solid #c4c4c4. Немного уменьшим текст заголовка и параграфа. И при помощи transform: translateX(-100%) скроим их за пределами блока.
.imageBox h3,
.imageBox p {
...
color: #ffffff;
background-color: rgba(0, 0, 0, 0.45);
padding: 5px 15px;
margin: 0;
border-left: 2px solid #c4c4c4;
-webkit-transform: translateX(-100%);
-moz-transform: translateX(-100%);
-ms-transform: translateX(-100%);
-o-transform: translateX(-100%);
transform: translateX(-100%);
}
.imageBox h3 {
top: 45%;
font-size: 1.1rem;
}
.imageBox p {
top: 58%;
font-size: 0.9rem;
}
Само собой, при наведении будем возвращать их в нулевое положение transform: translateX(0), и добавим отступы с левой стороны, что бы блоки не прилипали к левой части margin-left: 10px.
.imageBox:hover h3,
.imageBox:hover p {
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0);
margin-left: 10px;
}
С текстовыми блоками закончили, далее переходим к оформлению иконок.
Оформляем иконки
Отбираем блок ul и сбрасываем у него отступы.
.imageBox ul {
padding: 0;
margin: 0;
}
Для списков li убираем маркеры.
.imageBox ul li {
list-style: none;
}
Далее нужно отобразить списки Li по горизонтали. Для этого воспользуемся компоновкой элементов при помощи flexbox. Контейнер ul сделаем родителем flex-элементов. Добавляем display: flex, и все списки выровнялись по горизонтали. Для контейнера добавим прозрачный фон background: rgba(0,0,0, .2), и для плавной анимации transition: .5s.
.imageBox ul {
padding: 0;
margin: 0;
display: flex;
background: rgba(0,0,0, .2);
-webkit-transition: 0.5s;
-moz-transition: 0.5s;
-ms-transition: 0.5s;
-o-transition: 0.5s;
transition: 0.5s;
}
.imageBox ul li {
list-style: none;
}
Спискам li, зададим ширину в 20% и выроним иконки посередине блоков.
.imageBox ul li {
...
width: 20%;
text-align: center;
}
Для иконок сделаем следующее оформление. Отбираем ссылки .imageBox ul li a, делаем их белым цветом, преобразуем их в блочные элементы display: block, и зададим внутренние отступы в 10 пик.
.imageBox ul li a {
color: #ffffff;
display: block;
padding: 10px;
}
Затем при помощи псевдокласса :nth-child(), каждому из элементов li зададим индивидуальный цвет. Для этого обращаемся к элементу li, далее пишем псевдокласс, а в скобках порядковый номер в списке :nth-child(1), затем назначаем цвет.
Далее анимируем блок с иконками, задаем для класса .imageBox, псевдокласс :hover и данный стиль применяем к блоку ul.
.imageBox ul li:hover:nth-child(1) {
background: #3d5999;
}
.imageBox ul li:hover:nth-child(2) {
background: #55acee;
}
.imageBox ul li:hover:nth-child(3) {
background: #dd4d39;
}
.imageBox ul li:hover:nth-child(4) {
background: #0077B5;
}
.imageBox ul li:hover:nth-child(5) {
background: #8a3ab9;
}
При помощи трансформации сдвинем блок по оси Y на -135%
.imageBox:hover ul {
-webkit-transform: translateY(-135%);
-moz-transform: translateY(-135%);
-ms-transform: translateY(-135%);
-o-transform: translateY(-135%);
transform: translateY(-135%);
}
Раскомментируем overflow, соответственно блоки за пределами все скрылись. Для иконок добавим псевдокласс :hover, для того что бы их цвет появлялся при наведении и проверим, как все работает.
В принципе закончили с оформлением, теперь продублируем блок с картинкой три раза, и заменим у них изображение. Далее приступим к адаптации под разные форматы экранов.
Адаптируем под различные устройства
На данный момент картинки все выстроились по вертикали, и изменяя размер экрана на них это не как не отражается. Адаптацию будем делать при помощи flexbox и media запросов.
Добавим отдельный блок после класса .dws-wrapper, назовем его .flex-container, он и будет родителя flex дочерних блоков, то есть всех вложенных блоков с классом .imageBox.
Убираем у класса .dws-wrapper стили для позиционирования блоков при помощи которых я выравнивал объекты посередине экрана. Для класса .flex-container задаем display: flex. Все дочерние flex-элементы выровнялись по горизонтали. При помощи justify-content: center, расположим их по центру экрана.
Для удобства просмотра видео спущу эти блоки немного ниже, для этого классу .dws-wrapper пропишу margin-top: 280px. Вам это не обязательно делать, вы этот блок под свой дизайн сами подстроите, так как именно вам нужно. Этот класс я использую для записи видео урока и его можете не задействовать.
По умолчанию у нас всегда flex-контейнер выкладывает flex-элементы в одну строку, а так как делаем адаптацию, соответственно количество элементов нужно выводить то, которое помещается на странице. Для этого есть замечательное свойство, называется flex-wrap, и по умолчанию у него значение установлено nowrap, а для того что бы они располагались в несколько рядов оставляем wrap. Теперь сжимая экран, flex-элементы перемещаются на следующую строку.
.dws-wrapper {
margin-top: 280px;
}
.flex-container{
display: flex;
justify-content: center;
flex-wrap: wrap;
}
Добавим между изображениями отступ, для этого классу .imageBox пропишем margin: 5px.
.imageBox {
...
margin: 5px;
}
Открываем файл media.css, который вначале создавали, в нем и будем описывать стили под разные форматы экранов. При помощи Emmet разворачиваю медиа запросы.
/* Large Devices, Wide Screens */
@media only screen and (max-width: 1200px) {
}
/* Medium Devices, Desktops */
@media only screen and (max-width: 992px) {
}
/* Small Devices, Tablets */
@media only screen and (max-width: 768px) {
}
/* Extra Small Devices, Phones */
@media only screen and (max-width: 480px) {
}
/* Extra Small Devices, Phones */
@media only screen and (max-width: 320px) {
}
/* Extra Small Devices, Phones */
@media only screen and (max-width: 240px) {
}
Так как мы уже прописали в index файле что @media запросы будут запускаться при 900 пик. по этому две верхние строки нам не понадобятся я их удаляю.
Как для примера, уменьшу на таком разрешение отступы с верху до 150 пик., но он для вас не обязательный это делать, я его прописываю что бы центровался блок по вертикали. Проверим результат.
.dws-wrapper {
margin-top: 130px;
}
Немного подкорректирую @media запрос, сделаем его с 890 пик. само собой для вас может быть другой формат.
<link rel="stylesheet" href="css/media.css" media="all and (max-width: 890px)" type="text/css">
Следующий запрос на 780 пик нам не понадобится, его удаляем. Блоки нормально подстраиваются, а вот под 480 пик проведем адаптацию,отступ с верху сделаю меньше, а саму картинку увеличим в размерах.
/* Extra Small Devices, Phones */
@media only screen and (max-width : 480px) {
.dws-wrapper {
margin-top: 20px;
}
.imageBox {
height: 370px;
}
}
Для текстовых блоков нужно изменить размеры и иконки тоже увеличим.
.imageBox h3 {
font-size: 1.4rem;
top: 47%;
}
.imageBox p {
font-size: 1rem;
}
.imageBox ul li a {
font-size: 22px;
}
На формате 320 пик. вернем изображение в исходное состояние, и подкорректируем заголовки с иконками.
/* Extra Small Devices, Phones */
@media only screen and (max-width : 320px) {
.imageBox {
height: 270px;
}
.imageBox h3 {
font-size: 1.1rem;
top: 45%;
}
.imageBox p {
font-size: 0.9rem;
}
.imageBox ul li a {
font-size: 16px;
}
}
Проверяем полученный результат, и тестируем на разных форматах экрана.
Я буду рад если урок по "CSS3 flaxbox практика | Эффект при наведении в CSS" вам понравился, обязательно поделитесь им в своей группе VK.
Видео урок подготовил Горелов Денис.
5 предыдущих видео
Flexbox горизонтальное меню за 7 минут / CSS + HTML Просмотров:(0)Contact Form | Эффект плавающего текста в фокусе на CSS и jquery Просмотров:(0)
CSS эффект при наведении на картинку / Img Hover Effects Просмотров:(0)
Animation на CSS / Анимированная кнопка с пульсирующем эффектом на CSS3 Просмотров:(0)
Кнопка с анимацией для сайта на CSS Просмотров:(0)








