Красивая анимация блоков на CSS3
Сегодня рассмотрим несколько примеров красивой анимации блоков при помощи CSS3. Такие блоки хорошо смотрятся на всевозможных продающих страницах, в интернет магазинах и просто на сайте в качестве рекламных блоков.
Вначале блок выдает какую то информацию (картинку товара или просто текст), а при наведении курсора появляется другая информация, кликнув по которой переходишь по ссылке.
Пример 1
В начале напишем HTML-код.
<!-- Блоки, содержащие информацию анонса для вывода на экран --> <div class="block_info"> <div class="info"></div> <a href="#" class="inf_link" title="Переход по ссылке!"></a> <h2>Заголовок 1</h2> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.... </p> <!-- Блоки, "рисующие" линии по периметру блока --> <div class="L_top"></div> <div class="L_right"></div> <div class="L_bottom"></div> <div class="L_left"></div> </div>
Верхняя часть кода содержит ту информацию, которая должна появляться на экране. В данном примере блок с картинкой, ссылку и текст. В нижней части 4 блока, с помощью которых “рисуются” линии по периметру блока при наведении курсора.
Первоначально на экране видим картинку на сером фоне, но при наведении курсора картинка уменьшается и “убегает” в верхний угол блока, по периметру “рисуются” линии, и на белом фоне появляется текст-ссылка.
Для примера сделаем 2, почти идентичных блока, которые расположены ниже:
Заголовок 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse hendrerit dignissim metus ac finibus. Duis non pulvinar tortor. Sed semper eleifend sollicitudin.
Заголовок 2
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse hendrerit dignissim metus ac finibus. Duis non pulvinar tortor. Sed semper eleifend sollicitudin.
Задаем стили для самого блока, заголовка и текста:
.block_info { width: 300px; /*ширина блока*/ height: 200px; /*высота блока*/ margin: 0 30px 30px 50px; position: relative; overflow: hidden; background: #444; /*цвет фона блока*/ transition: background .2s ease-in-out .6s; /*изменение фона блока при анимации*/ } .block_info p { color: #333; /*цвет текста описания*/ opacity: 0; text-align: justify; padding: 0 20px 20px 20px; -webkit-transition: opacity 0.2s ease-in-out .6s; transition: opacity 0.2s ease-in-out .6s; /*Изменение текста при анимации*/ } .block_info h2 { text-align: center; color: #77B3D4; /*цвет текста заголовка*/ font-size: 20px; margin: 0; padding: 0; line-height: 25px; opacity: 0; padding: 20px 20px 10px 20px; -webkit-transition: opacity 0.2s ease-in-out .6s; transition: opacity 0.2s ease-in-out .6s; /*Изменение заголовка при анимации*/ }
Размеры блока, шрифта, их цвет, каждый выбирает на свой вкус.
Теперь ссылка и картинка:
.inf_link{ position: absolute; top:0; left:0; display: block; cursor: pointer; width: 100%; height: 100%; } /* Свойства блока с картинкой */ .info{ width: 100%; height: 100%; position: absolute; top:0; left:0; -webkit-transition: all 0.4s ease-in-out .3s; transition: all 0.4s ease-in-out .3s; z-index: 10; } /* Вывод картинки */ .info { background: url(images/img1.jpg) no-repeat 50% 50%; }
Ну а теперь наводим курсор:
/* Фон из серого становится белым, а заголовок и текст - видимым. */ .block_info:hover { background: #eee; } .block_info:hover p, .block_info:hover h2{ opacity: 1; } /* Картинка "переезжает в верхний левый угол, при этом уменьшается */ .block_info:hover .inf { top:-35%; left:-40%; -webkit-transform:scale(0.3); transform:scale(0.3); }
Настала очередь блоков, “рисующих” линии по периметру
.L_top, .L_right, .L_bottom, .L_left { position: absolute; background: #77B3D4; /*цвет границы*/ -webkit-transition: top 0.4s ease-in-out 0s, right 0.4s ease-in-out 0s, bottom 0.4s ease-in-out 0s, left 0.4s ease-in-out 0s; transition: top 0.4s ease-in-out 0s, right 0.4s ease-in-out 0s, bottom 0.4s ease-in-out 0s, left 0.4s ease-in-out 0s; } .L_top, .L_bottom {width: 100%;height: 6px;} .L_left, .L_right {width: 6px;height: 100%;} /* граница сверху */ .L_top {left:-100%;top:0;} .block_info:hover .L_top {left:0;} /* граница справа */ .L_right {top:-100%;right:0;} .block_info:hover .L_right {top:0;} /* граница снизу */ .L_bottom {right:-100%;bottom:0;} .block_info:hover .L_bottom {right:0;} /* граница слева */ .L_left {bottom:-100%;left:0;} .block_info:hover .L_left {bottom:0;} }
Первоначально блоки “сдвинуты” каждый в свою сторону на -100% и поэтому их не видно. При наведении курсора начинается анимации и блоки занимают “нулевое” (left:0; top:0; right:0; bottom:0; ) положение. Это схемотически изображено ниже, где указано первоначальное положение блоков и направление последующего движения.
Пример 2
Чтобы увидеть следующую анимацию навидим курсор на блок.
AUDI
Audi ipsum dolor sit amet, consectetur adipisicing elit. Temporibus animi velit itaque minus nostrum ea.
Все начинается с HTML. Код для одного из блоков:
<div class="block_info2 "> <div class="number"> <div class="num">A</div> </div> <div class="content"> <div class="text"> <p class="name">AUDI</p> <p><b>Audi</b> ipsum dolor sit amet, consectetur adipisicing elit. Temporibus animi...</p> </div> <img class="text-img" src="audi-q5.jpg" alt="Audi"> </div> </div>
Оформление основного блока:
.block_info2{ width: 360px; height: 178px; margin: 0 15px 15px; position: relative; cursor: pointer; border: 1px solid #cccaca; }
Левая часть – блок с буквой (на этом месте может быть любой знак, иконка) в кружке.
.number { background: #fff; /* Цвет фона */ background-size: 50%; /* Размер фонового изображения */ width: 78px; height: 176px; float: left; border: 1px solid #ddd; border-right: none; } .num { background: #c4e0f2; /* Цвет фона кружка */ width: 60px; /*Размеры блока, обязательно одинаковые, иначе вместо круга получим овал */ height: 60px; border: 2px solid #fff; /* Граница цвета фона, позволяет "отодвинуть" тень от блока. */ border-radius: 50%; /* Позволяет из квадрата сделать круг или овал (смотри выше) */ box-shadow: 1px 1px 3px -2px #333; /* Тень */ font-size: 2.5em; line-height: 60px; margin: 55px auto 0; text-align: center; -webkit-transition: all 0.4s ease 0s; transition: all 0.4s ease 0s; } .block_info2:hover div.number{ background-size: 50% auto; } /* Изменение тени и вращение при анимации */ .block_info2:hover div.number div.num { box-shadow: 0 0 3px -1px #333; -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); }
Правая часть – текст и картинка.
.content { float: right; /* Прижат к правой стороне */ height: 178px; /* Высота блока, равна высоте блока с классом .block_info2 */ overflow: hidden; position: relative; width: 280px; } .text { background:#fefefe; border: 1px solid #ddd; height: 176px; width: 280px; } .text p { margin: 0 20px; } .text p.name { font-size: 1.6em; margin-bottom: 10px; margin-top: 40px; } img.text-img { position: absolute; top: 168px; /*При высоте блока 178рх (смотри выше) картинка опущена на 168рх, поэтому снизу "выглядывает" только ее часть*/ -webkit-transition: all 0.4s ease 0s; transition: all 0.4s ease 0s; } /* При анимации картинка "всплывает вверх и становиться полупрозрачной*/ .block_info2:hover div.content img.text-img { opacity: 0.85; top: 0; }
Пример 3
Следующие 2 примера практически одинаковы, но есть небольшое “геометрическое” отличие: вертикальная и горизонтальная анимации. Код каждого блока одинаковый, различаются только фоновыми рисунками, ну и цифровыми индексами соответственно: bgrd_1, bgrd_2, bgrd_3, bgrd_4. В качестве примера приведен код только для 2 блоков:
<div class="block_info bgrd_1"> <div class="binfo_wrap"> <div class="binfo-info"> <div class="binfo-info-front bgrd_1"></div> <div class="binfo-info-back"> <p class="zh3">Заголовок 1</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam ..</p> </div> </div> </div> </div> <div class="block_info bgrd_2"> <div class="binfo_wrap"> <div class="binfo-info"> <div class="binfo-info-front bgrd_2"></div> <div class="binfo-info-back"> <p class="zh">Заголовок 2</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam ...</p> </div> </div> </div> </div>
Стили, за исключением указанных ниже для разных анимаций, схожи. Конечно каждый волен выбирать оформление в своем вкусе.
.block_info { width: 356px; height: 222px; margin: 15px ; float: left; position: relative; box-shadow: 3px 3px 7px rgba(0,0,0,0.5); } .block_info:hover .binfo-info-front { box-shadow: 3px -3px 12px rgba(0,0,0,1); /* Для вертикальной анимации */ -webkit-transform: rotate3d(1,0,0,-180deg); -moz-transform: rotate3d(1,0,0,-180deg); -o-transform: rotate3d(1,0,0,-180deg); -ms-transform: rotate3d(1,0,0,-180deg); transform: rotate3d(1,0,0,-180deg); или /* Для горизонтальной анимации */ -webkit-transform: rotate3d(0,1,0,180deg); -moz-transform: rotate3d(0,1,0,180deg); -o-transform: rotate3d(0,1,0,180deg); -ms-transform: rotate3d(0,1,0,180deg); transform: rotate3d(0,1,0,180deg); } /* Цвет фона под текстом анонса */ .block_info:hover .binfo-info-back{ background: rgba(224, 179, 119, 0.67); } /* Фоновые рисунки на все 4 блока*/ .bgrd_1 { background-image: url(img_1.jpg); } .bgrd_2 { background-image: url(img_2.jpg); } .bgrd_3 { background-image: url(img_3.jpg); } .bgrd_4 { background-image: url(img_4.jpg); } .binfo_wrap, .binfo-info{ position: absolute; width: 356px; height: 222px; -webkit-transition: all 0.4s ease-in-out; -moz-transition: all 0.4s ease-in-out; -o-transition: all 0.4s ease-in-out; -ms-transition: all 0.4s ease-in-out; transition: all 0.4s ease-in-out; -webkit-perspective: 1300px; -moz-perspective: 1300px; -o-perspective: 1300px; -ms-perspective: 1300px; perspective:1300px; } .binfo_wrap{ top: 0; left:0; background: #f9f9f9; /* Маскирующий фон, если его убрать тоже неплохой эффект получается */ } .binfo-info{ -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; -o-transform-style: preserve-3d; -ms-transform-style: preserve-3d; transform-style: preserve-3d; } .binfo-info > div { display: block; position: absolute; width: 100%; height: 100%; background-position: center center; -webkit-transition: all 0.6s ease-in-out; -moz-transition: all 0.6s ease-in-out; -o-transition: all 0.6s ease-in-out; -ms-transition: all 0.6s ease-in-out; transition: all 0.6s ease-in-out; } .binfo-info .binfo-info-front { z-index: 100; box-shadow: inset 2px 1px 4px rgba(0,0,0,0.1); /* Для вертикальной анимации */ -webkit-transform-origin: 50% 100%; -moz-transform-origin: 50% 100%; -o-transform-origin: 50% 100%; -ms-transform-origin: 50% 100%; transform-origin: 50% 100% ; или /* Для горизонтальной анимации */ -webkit-transform-origin:100% 50% ; -moz-transform-origin:100% 50% ; -o-transform-origin:100% 50% ; -ms-transform-origin:100% 50% ; transform-origin:100% 50% ; } p.zh { font-size: 20px; font-style: italic; text-align: center; margin: 15px; } .binfo-info-back p { padding: 0 15px; }
И вот, что из этого получается:
Заголовок 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam ..
Заголовок 1
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam ..
Пример 4
В данном варианте приведен некий текст, который предлагает скачать какую то информацию. Наводим курсор на картинку и видим ссылку на нужный вам материал.
Полный код этой демо-странички рассматривать нет смысла, рассмотрим только то, что касается анимации. Код блоков идентичен, отличие в фоновых картинках. Итак:
HTML
<div class="block_info"> <div class="bi-info"> <a href="#" class="con">Скачать</a> </div> <div class="binfo-thumb bgrd_1"></div> </div> <div class="block_info"> <div class="bi-info"> <a href="#" class="con">Скачать</a> </div> <div class="binfo-thumb bgrd_2"></div> </div> <div class="block_info"> <div class="bi-info"> <a href="#" class="con">Скачать</a> </div> <div class="binfo-thumb bgrd_3"></div> </div>
CSS
/* Нижний блок - основа */ .block_info { width: 190px; height:190px ; border-radius: 50%; position: relative; margin:24px 15px; float: left; box-shadow: 1px 1px 7px rgba(0,0,0,1); } /* Нижний блок со ссылкой и его фоновый рисунок */ .bi-info { position: absolute; width: 100%; height: 100%; border-radius: 50%; overflow: hidden; background: url(img_4.jpg); box-shadow: inset 0 0 0 5px rgba(0,0,0,0.05); } /* Оформление ссылки */ a.con{ font-family: Arial, sans-serif; color: #7297e0; font-size: 20px; line-height: 150px; padding-left: 40px; text-decoration: none; font-style:italic; letter-spacing: 4px; text-align: center; text-shadow:0px 0px 0 rgb(82,119,192),1px 0px 0 rgb(52,89,162), 2px 0px 0 rgb(22,59,132),3px 0px 2px rgba(0,0,0,0.25), 3px 0px 1px rgba(0,0,0,0.5),0px 0px 2px rgba(0,0,0,.2); } a.con:hover { text-decoration:underline; } /* Верхний блок */ .binfo-thumb { width: 190px; height: 190px; border-radius: 50%; overflow: hidden; position: absolute; box-shadow: inset 0 0 0 15px rgba(255,255,255, 0.5); -webkit-transform-origin: 95% 40%; -moz-transform-origin: 95% 40%; -o-transform-origin: 95% 40%; -ms-transform-origin: 95% 40%; transform-origin: 95% 40%; -webkit-transition: all 0.3s ease-in-out; -moz-transition: all 0.3s ease-in-out; -o-transition: all 0.3s ease-in-out; -ms-transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out; } /* Фоновые рисунки верхних блоков */ .bgrd_1 { background-image: url(img_1.jpg); z-index: 12; } .bgrd_2 { background-image: url(img_2.jpg); z-index: 11; } .bgrd_3 { background-image: url(img_3.jpg); z-index: 10; } /* Создание "поворотной оси" (черная точка с правой стороны) */ .binfo-thumb:after { content: ''; width: 8px; height: 8px; position: absolute; border-radius: 50%; top: 40%; left: 95%; margin: -4px 0 0 -4px; background: rgb(14,14,14); background: -moz-radial-gradient(center, ellipse cover, rgba(14,14,14,1) 0%, rgba(125,126,125,1) 100%); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(14,14,14,1)), color-stop(100%,rgba(125,126,125,1))); background: -webkit-radial-gradient(center, ellipse cover, rgba(14,14,14,1) 0%,rgba(125,126,125,1) 100%); background: -o-radial-gradient(center, ellipse cover, rgba(14,14,14,1) 0%,rgba(125,126,125,1) 100%); background: -ms-radial-gradient(center, ellipse cover, rgba(14,14,14,1) 0%,rgba(125,126,125,1) 100%); background: radial-gradient(ellipse at center, rgba(14,14,14,1) 0%,rgba(125,126,125,1) 100%); box-shadow: 0 0 1px rgba(255,255,255,0.9); } /* При наведении верхний блок сдвигается на 110 градусов против часовой стрелки */ .block_info:hover .binfo-thumb { box-shadow: inset 0 0 0 15px rgba(255,255,255, 0.5), 0 1px 3px rgba(0,0,0,0.2); -webkit-transform: rotate(-110deg); -moz-transform: rotate(-110deg); -o-transform: rotate(-110deg); -ms-transform: rotate(-110deg); transform: rotate(-110deg); }
Пример 5
Для блока напишем следующий код.
HTML
<div class="view"> <img src="pic_1.jpg" alt="Картинка"> <div class="mask"> <h2>headline</h2> <p>A wonderful serenity has taken possession of my entire soul, like thse .</p> <a href="#">Transition on click</a> </div> </div>
Оформляем блоки в таблице стилей. Цвета, размеры, отступы и др., как обычно на свой вкус, но есть обязательные условия, которые тоже можно корректировать при необходимости.
CSS
.view{ font-family: sans-serif; width: 300px; height: 186px; float: left; margin: 50px; border: 10px solid transparent; box-shadow: 1px 1px 8px rgba(170, 170, 170, 0.49); /* Обязательные условия*/ position: relative; overflow: hidden; } .view .mask{ width: 300px; height:186px; text-align: center; /* Обязательные условия*/ position: absolute; overflow: hidden; top: 0; left: 0; }
Теперь очередь картинки, заголовка, анонса и ссылки. Здесь также есть обязательные условия, которые и обеспечивают анимацию.
С помощью свойства transform: translateY(…); заголовок “поднимаем вверх” на 100рх, а текст анонса соответственно “опускаем вниз” на 120рх.
Значения выбраны исходя из размеров блока и картинки. Также подлежат коррекции под необходимые значения.
Второе условие – “невидимость”. Для этого используем свойство opacity: 0;. Благодаря этому условию ссылка никуда не убирается, просто не видна.
CSS
.view img { -webkit-transition: all ease-in .5s; transition: all ease-in .5s; } .mask h2 { color: #4b4848; font-size: 20px; font-weight: 400; line-height: 40px; letter-spacing:1px; margin-top: 10px; text-transform: uppercase; text-shadow: 1px 1px 1px #0d0a0b; background: rgba(248, 194, 71, 0.6); /* Обязательные условия*/ -webkit-transform: translateY(-100px); -ms-transform: translateY(-100px); transform: translateY(-100px); -webkit-transition: all .5s; transition: all ease-in .5s; opacity: 0; } .mask p { color: #fff; padding: 10px; margin-bottom: 25px; text-shadow: 1px 0 2px #000; background: rgba(105, 98, 82, 0.49); /* Обязательные условия*/ -webkit-transform: translateY(120px); -ms-transform: translateY(120px); transform: translateY(120px); -webkit-transition: all.5s ease-in .1s; transition: all.5s ease-in .1s; opacity: 0; } a.info { color:#2e9beb; font-size: 18px; letter-spacing:1px; text-decoration: none; background: rgba(245, 177, 22, 0.75); text-shadow: 1px 1px 1px #1c3764; box-shadow: 1px 1px 3px #444; border: 1px solid rgba(167, 130, 48, 0.8); border-radius: 5px; padding:10px; /* Обязательные условия*/ opacity: 0; -webkit-transition: all ease-in .5s; transition: all ease-in .5s; }
Осталось навести курсор на картинку и увидеть результат: заголовок “выезжает” сверху, текст анонса – снизу, а ссылка плавно проявляется.
CSS
.view:hover img{ opacity: 0.25; box-shadow: 3px 3px 5px #000; -webkit-transform: scale(1.5, 1.5); -ms-transform: scale(1.5, 1.5); transform: scale(1.5, 1.5); } .view:hover h2{ opacity: 1; -webkit-transform: translateY(0px); -ms-transform: translateY(0px); transform: translateY(0px); } .view:hover p{ opacity: 1; -webkit-transform: translatex(0px); -ms-transform: translatex(0px); transform: translatex(0px); -webkit-transition: all ease-in .5s; transition: all ease-in .5s; } .view:hover a{ cursor: pointer; opacity:1; -webkit-transition: opacity .3s ease-in .5s; transition: opacity .3s ease-in .5s; } a:active{ box-shadow: none; background: #2bcade; color:rgb(252, 179, 14); }