Скользящие панели изображений на CSS3
В данном уроке мы разберемся задачей создания прелестных скользящих панелей с изображениями. Будет использоваться только CSS. Идей заключается в применении фоновых изображений для панелей и анимации при нажатии на метку. В качестве меток будут использоваться радио кнопки.
Примечание: результат нашего урока будет работать в браузерах, которые поддерживают трансформации и анимации CSS.
Разметка HTML
Код HTML состоит из трех основных частей: радио кнопки и метки, контейнер с панелями и "срезами" для каждого изображения, и заголовки. Контейнер с классом cr-bgimg имеет раздел для каждой панели, в котором размещаются элементы span
для каждого изображения с правильным положением фона:
<section class="cr-container"> <!-- Радио кнопки и метки --> <input id="select-img-1" name="radio-set-1" type="radio" class="cr-selector-img-1" checked/> <label for="select-img-1" class="cr-label-img-1">1</label> <input id="select-img-2" name="radio-set-1" type="radio" class="cr-selector-img-2" /> <label for="select-img-2" class="cr-label-img-2">2</label> <input id="select-img-3" name="radio-set-1" type="radio" class="cr-selector-img-3" /> <label for="select-img-3" class="cr-label-img-3">3</label> <input id="select-img-4" name="radio-set-1" type="radio" class="cr-selector-img-4" /> <label for="select-img-4" class="cr-label-img-4">4</label> <div class="clr"></div> <!-- Панели --> <div class="cr-bgimg"> <div> <span>Срез 1 - Изображение 1</span> <span>Срез 1 - Изображение 2</span> <span>Срез 1 - Изображение 3</span> <span>Срез 1 - Изображение 4</span> </div> <div> <span>Срез 2 - Изображение 1</span> <span>Срез 2 - Изображение 2</span> <span>Срез 2 - Изображение 3</span> <span>Срез 2 - Изображение 4</span> </div> <div> <span>Срез 3 - Изображение 1</span> <span>Срез 3 - Изображение 2</span> <span>Срез 3 - Изображение 3</span> <span>Срез 3 - Изображение 4</span> </div> <div> <span>Срез 4 - Изображение 1</span> <span>Срез 4 - Изображение 2</span> <span>Срез 4 - Изображение 3</span> <span>Срез 4 - Изображение 4</span> </div> </div> <!-- Заголовки --> <div class="cr-titles"> <h3><span>Прозорливость</span><span>То, о чем вы мечтали</span></h3> <h3><span>Приключение</span><span>Там, где все начинается</span></h3> <h3><span>Естество</span><span>Незабываемые впечатления</span></h3> <h3><span>Безмятежность</span><span>Когда тишина начинает звучать</span></h3> </div> </section> </div>
Элементы h3
для заголовков имеют два элемента span
: один для основного заголовка, другой - подзаголовка.
CSS
Примечание: в коде CSS опущены префиксы производителей браузеров для большей наглядности.
Задача состоит в том, чтобы скрыть радио кнопки, покрыв из метками. В веб браузере нажатие на метке изменяет состояние соответствующей кнопки. Определив ID для кнопки мы можем использовать атрибут for = idref метки для того, чтобы установить соответствие кнопке.
Затем нужно разместить все фоновые изображения в правильном порядке и выводить соответствующие "срезы" картинки при нажатии на метку.
Сначала определим стили для секции и задаим для нее белую рамку с легкой тенью:
.cr-container{ width: 600px; height: 400px; position: relative; margin: 0 auto; border: 20px solid #fff; box-shadow: 1px 1px 3px rgba(0,0,0,0.1); }
Так как мы будем использовать общий соседний селектор для того, чтобы получить нужный "срез" изображения и заголовок, нужно разместить метки перед контейнерами. Выдвинем их в верхний слой (z-index) и опустим вниз с помощью значения поля равного 350px:
.cr-container label{ font-style: italic; width: 150px; height: 30px; cursor: pointer; color: #fff; line-height: 32px; font-size: 24px; float:left; position: relative; margin-top: 350px; z-index: 1000; }
Улучим внешний вид добавив небольшой круг. Используем псевдо-элемент располженный по центру позади текста метки:
.cr-container label:before{ content:''; width: 34px; height: 34px; background: rgba(130,195,217,0.9); position: absolute; left: 50%; margin-left: -17px; border-radius: 50%; box-shadow: 0px 0px 0px 4px rgba(255,255,255,0.3); z-index:-1; }
Для того, чтобы создать разделитель между панелями, используем небольшой трюк. Создадим еще один псевдо-элемент для метки и растянем его поверх панели. С помощью градиента сделаем линию "пропадающей" к верху:
.cr-container label:after{ width: 1px; height: 400px; content: ''; background: linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%); position: absolute; bottom: -20px; right: 0px; }
Последняя панель не должна иметь разделителя, поэтому установим ширину равной 0:
.cr-container label.cr-label-img-4:after{ width: 0px; }
Теперь скроем кнопки:
.cr-container input{ display: none; }
При нажатии кнопки мыши на метке будет отмечаться соответствующая кнопка. Теперь мы можем указать соответствующие метки с помощь общего соседнего селектора. Также будем изменять цвет "выбранной" метки:
.cr-container input.cr-selector-img-1:checked ~ label.cr-label-img-1, .cr-container input.cr-selector-img-2:checked ~ label.cr-label-img-2, .cr-container input.cr-selector-img-3:checked ~ label.cr-label-img-3, .cr-container input.cr-selector-img-4:checked ~ label.cr-label-img-4{ color: #68abc2; }
Также будет изменяться цвет фона и тени круглого псевдо-элемента:
.cr-container input.cr-selector-img-1:checked ~ label.cr-label-img-1:before, .cr-container input.cr-selector-img-2:checked ~ label.cr-label-img-2:before, .cr-container input.cr-selector-img-3:checked ~ label.cr-label-img-3:before, .cr-container input.cr-selector-img-4:checked ~ label.cr-label-img-4:before{ background: #fff; box-shadow: 0px 0px 0px 4px rgba(104,171,194,0.6); }
Контейнер для панелей изображений будет занимать всю ширину и позиционируется абсолютно. Данный контейнер используется позже, чтобы установить фоновое изображение соответствующее выбранной картинке:
.cr-bgimg{ width: 600px; height: 400px; position: absolute; left: 0px; top: 0px; z-index: 1; background-repeat: no-repeat; background-position: 0 0; }
Так как мы имеем четыре панели, то ширина каждой будет равна 150 px (600 разделить на 4). Панели будут выравниваться влево, и мы будем скрывать их при выходе за границы элемента:
.cr-bgimg div{ width: 150px; height: 100%; position: relative; float: left; overflow: hidden; background-repeat: no-repeat; }
Каждый элемент span
"среза" будет позиционироваться абсолютно. В начале мы будем скрывать их размещая за пределами элемента:
.cr-bgimg div span{ position: absolute; width: 100%; height: 100%; top: 0px; left: -150px; z-index: 2; text-indent: -9000px; }
Теперь разберемся с фоном контейнера изображения и соответствующими "срезами":
.cr-container input.cr-selector-img-1:checked ~ .cr-bgimg, .cr-bgimg div span:nth-child(1){ background-image: url(../images/1.jpg); } .cr-container input.cr-selector-img-2:checked ~ .cr-bgimg, .cr-bgimg div span:nth-child(2){ background-image: url(../images/2.jpg); } .cr-container input.cr-selector-img-3:checked ~ .cr-bgimg, .cr-bgimg div span:nth-child(3){ background-image: url(../images/3.jpg); } .cr-container input.cr-selector-img-4:checked ~ .cr-bgimg, .cr-bgimg div span:nth-child(4){ background-image: url(../images/4.jpg); }
Также нужно задать положение фона в зависимости от панели:
.cr-bgimg div:nth-child(1) span{ background-position: 0px 0px; } .cr-bgimg div:nth-child(2) span{ background-position: -150px 0px; } .cr-bgimg div:nth-child(3) span{ background-position: -300px 0px; } .cr-bgimg div:nth-child(4) span{ background-position: -450px 0px; }
Когда мы нажимаем на метку, все "срезы" просто смещаются вправо:
.cr-container input:checked ~ .cr-bgimg div span{ animation: slideOut 0.6s ease-in-out; } @keyframes slideOut{ 0%{ left: 0px; } 100%{ left: 150px; } }
"Срезы" соответствующего фона смещаются с -150px до 0px:
.cr-container input.cr-selector-img-1:checked ~ .cr-bgimg div span:nth-child(1), .cr-container input.cr-selector-img-2:checked ~ .cr-bgimg div span:nth-child(2), .cr-container input.cr-selector-img-3:checked ~ .cr-bgimg div span:nth-child(3), .cr-container input.cr-selector-img-4:checked ~ .cr-bgimg div span:nth-child(4) { transition: left 0.5s ease-in-out; animation: none; left: 0px; z-index: 10; }
Теперь определим стили для элементов h3
заголовка и его span
. Заголовок h3
будет иметь трансформацию прозрачности, которая изменяется при выборе соответствующей метки:
.cr-titles h3{ position: absolute; width: 100%; text-align: center; top: 50%; z-index: 10000; opacity: 0; color: #fff; text-shadow: 1px 1px 1px rgba(0,0,0,0.1); transition: opacity 0.8s ease-in-out; } .cr-titles h3 span:nth-child(1){ font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif; font-size: 70px; display: block; letter-spacing: 7px; } .cr-titles h3 span:nth-child(2){ letter-spacing: 0px; display: block; background: rgba(104,171,194,0.9); font-size: 14px; padding: 10px; font-style: italic; font-family: Cambria, Palatino, "Palatino Linotype", "Palatino LT STD", Georgia, serif; } .cr-container input.cr-selector-img-1:checked ~ .cr-titles h3:nth-child(1), .cr-container input.cr-selector-img-2:checked ~ .cr-titles h3:nth-child(2), .cr-container input.cr-selector-img-3:checked ~ .cr-titles h3:nth-child(3), .cr-container input.cr-selector-img-4:checked ~ .cr-titles h3:nth-child(4){ opacity: 1; }
Если не нужно использовать трюк с метками на мобильных устройствах, то можно использовать медиа запрос:
@media screen and (max-width: 768px) { .cr-container input{ display: inline; width: 24%; margin-top: 350px; z-index: 1000; position: relative; } .cr-container label{ display: none; } }
Готово!
В качестве анимации можно использовать различные варианты. Смотрите демонстрацию.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/ZdbHgvN_WWs/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Чтобы вырастить плодоносящий сайт - его полезно регулярно поливать и удобрять с помощью рекламы и оптимизации Компания "RedLine" |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.