[вёрстка] Делаем для сайта слайдер на CSS. Часть 3.
Два рассмотренных ранее слайдера использовали эффект полупрозрачности для перехода от одного изображения к другому. Но что если мы хотим сделать листание изображений с эффектом прокрутки? Старое изображение уезжает за пределы слайдера, а новое выезжает с другой стороны — возможно ли добиться такой анимации? Возможно. Посмотрим, как это сделать.
Слайдер с эффектом прокрутки
За основу возьмём код слайдера А из первой статьи. Содержимое кадров слайдера я поместил в отдельный div:
<div class='sliderC'> <input type="radio" name="slider1" id="slider1_1" checked="checked"> <label for="slider1_1"></label> <input type="radio" name="slider1" id="slider1_2"> <label for="slider1_2"></label> <input type="radio" name="slider1" id="slider1_3"> <label for="slider1_3"></label> <input type="radio" name="slider1" id="slider1_4"> <label for="slider1_4"></label> <div> <!-- контейнер для кадров --> <div> <p>Восход над островом</p> <img src='https://lh3.googleusercontent.com/-XGgw41OSARk/VePicTdAdgI/AAAAAAAAAS4/WeBbxp4ebQg/s400-Ic42/00099_manaisland_1920x1200.jpg' alt=''> </div><div> <p>Озёрный край</p> <img src='https://lh3.googleusercontent.com/-aafAKIoTkT4/VePihWk2BHI/AAAAAAAAATA/zQVtiYD_eDc/s400-Ic42/00201_lakejipe_1920x1200.jpg' alt=''> </div><div> <p>Закатная синева</p> <img src='https://lh3.googleusercontent.com/-ikbDMRhLc_I/VePkT4XLFtI/AAAAAAAAATg/qaHqQk89RAw/s400-Ic42/00744_laclahachesunset_1920x1200.jpg' alt=''> </div><div> <p>Сельский пейзаж</p> <img src='https://lh3.googleusercontent.com/-BLXeHJNyOqw/VePimp_e_wI/AAAAAAAAATQ/BVw_9LFehyU/s400-Ic42/00442_pyrenees_1920x1200.jpg' alt=''> </div> </div> </div>
Этот контейнер кадров мы вытянем по горизонтали, и все кадры разместим в нём вплотную один за другим при помощи режима inline-block. Обратите внимание, что между кадрами я удалил все пробелы и переводы строки — открывающий тег следующего кадра прижат к закрывающему тегу предыдущего кадра: </div><div>. Если этого не сделать, пробельные символы создадут нам лишние зазоры между кадрами.
При переключении кадров мы будем сдвигать контейнер кадров так, чтобы в «окошко» слайдера попал соответствующий кадр. Если вы помните, похожим приёмом мы пользовались, когда делали вкладки на сайте для старых браузеров. В тот раз мы использовали ссылки-якоря, чтобы заставить контейнер вкладок прокрутиться к нужной вкладке. На этот раз мы решим схожую задачу средствами одного лишь CSS.
Для сдвигания контейнера мы будем использовать набор правил CSS следующего вида:
- По умолчанию отображается первый кадр (left: 0px).
- Если включена вторая радиокнопка, сдвинуть контейнер на один кадр (left: -100%).
- Если включена третья радиокнопка, сдвинуть контейнер на два кадра (left: -200%).
- Если включена четвёртая радиокнопка, сдвинуть контейнер на три кадра (left: -300%).
- ...и так далее.
Количество этих правил и максимальная ширина контейна зависят от числа кадров в слайдерах на вашем сайте. Если вам нужно больше кадров, допишите соответствующие правила. Вот такой код, отвечающий за прокрутку слайдера, у меня получился:
.sliderC > div { position: absolute; top: 0px; left: 0px; bottom: 0px; z-index: 0; width: 1000%; /* 100% * 10 кадров. Если вам требуется больше кадров, увеличьте это число. */ text-align: left; transition: left 800ms cubic-bezier(0.77, 0, 0.175, 1) 0s; } /* По одному правилу для каждого кадра (кроме первого). */ .sliderC > input:nth-of-type(2):checked ~ div { left: -100%; } .sliderC > input:nth-of-type(3):checked ~ div { left: -200%; } .sliderC > input:nth-of-type(4):checked ~ div { left: -300%; } .sliderC > input:nth-of-type(5):checked ~ div { left: -400%; } .sliderC > input:nth-of-type(6):checked ~ div { left: -500%; } .sliderC > input:nth-of-type(7):checked ~ div { left: -600%; } .sliderC > input:nth-of-type(8):checked ~ div { left: -700%; } .sliderC > input:nth-of-type(9):checked ~ div { left: -800%; } .sliderC > input:nth-of-type(10):checked ~ div { left: -900%; } .sliderC > div > div { display: inline-block; position: relative; }
Эффект прокрутки обеспечивается с помощью правила transition. В прежнем варианте слайдера transition позволила нам анимировать прозрачность каждого кадра, в новом слайдере мы аналогичным образом анимируем координаты контейнера кадров.
Также я доработал внешний вид слайдера. Я добавил слайдеру белую границу с небольшой тенью и изменил внешний вид кнопок переключения кадров. Итоговый код:
.sliderC { width: 400px; height: 250px; border: 8px solid #fff; box-shadow: 1px 1px 4px #666; border-radius: 5px; position: relative; text-align: center; overflow: hidden; } .sliderC > input { display: none; } .sliderC > input + label { width: 10px; height: 10px; border-radius: 8px; background: rgba(90, 90, 90, 0.5); border: 2px solid rgba(190, 190, 190, 1); cursor: pointer; z-index: 100; position: relative; display: inline-block; margin-right: 4px; top: 90%; transition: border 0.8s ease-out 0s; } .sliderC > input + label:after { content: ' '; display: block; box-sizing: border-box; width: 100%; height: 100%; border-radius: 8px; border: 2px solid rgba(90, 90, 90, 0.8); background: rgba(230, 230, 230, 1); opacity: 0; transition: opacity 0.8s ease-out 0s; } .sliderC > input + label:hover, .sliderC > input:checked + label { border: 2px solid rgba(230, 230, 230, 1); } .sliderC > input:checked + label:after { opacity: 1; } .sliderC > div { position: absolute; top: 0px; left: 0px; bottom: 0px; z-index: 0; width: 1000%; /* 100% * 10 кадров. Если вам требуется больше кадров, увеличьте это число. */ text-align: left; transition: left 800ms cubic-bezier(0.77, 0, 0.175, 1) 0s; } /* По одному правилу для каждого кадра (кроме первого). */ .sliderC > input:nth-of-type(2):checked ~ div { left: -100%; } .sliderC > input:nth-of-type(3):checked ~ div { left: -200%; } .sliderC > input:nth-of-type(4):checked ~ div { left: -300%; } .sliderC > input:nth-of-type(5):checked ~ div { left: -400%; } .sliderC > input:nth-of-type(6):checked ~ div { left: -500%; } .sliderC > input:nth-of-type(7):checked ~ div { left: -600%; } .sliderC > input:nth-of-type(8):checked ~ div { left: -700%; } .sliderC > input:nth-of-type(9):checked ~ div { left: -800%; } .sliderC > input:nth-of-type(10):checked ~ div { left: -900%; } .sliderC > div > div { display: inline-block; position: relative; } .sliderC > div > div > p { position: absolute; top: 0px; left: 0px; right: 0px; text-align: center; color: #fff; text-shadow: 1px 1px 2px #000; }
Вот такой слайдер у нас получился:
Слайдер с эффектом прокрутки и стрелками «Вперёд» и «Назад»
Мы можем объединить слайдер с прокруткой и слайдер со стрелками, который мы создали во второй статье о слайдерах. Здесь я тоже слегка изменил оформление стрелок, чтобы не повторяться и показать вам больше вариантов. На этот раз оформим стрелки в виде изображений. Код:
<style> .sliderC2 { width: 400px; height: 250px; border: 8px solid #fff; box-shadow: 1px 1px 4px #666; border-radius: 5px; position: relative; text-align: center; overflow: hidden; } .sliderC2 > input { display: none; } .sliderC2 > input + label, .sliderC2 > input + label + label { display: none; } .sliderC2 > input:checked + label, .sliderC2 > input:checked + label + label { display: block; width: 50px; height: 50px; opacity: 0.4; transition: opacity 0.8s ease-out 0s; cursor: pointer; position: absolute; top: 50%; transform: translateY(-50%); z-index: 100; } .sliderC2 > input:checked + label:hover, .sliderC2 > input:checked + label + label:hover { opacity: 0.6; } .sliderC2 > input:checked + label { left: 0px; background: url('https://lh3.googleusercontent.com/-tacAA4lVYgc/VeVDqFrDRRI/AAAAAAAAAT4/RBongekAUqI/s800-Ic42/prev.png') } .sliderC2 > input:checked + label + label { right: 0px; background: url('https://lh3.googleusercontent.com/-gy6RMZnCdAc/VeVDqJF1S5I/AAAAAAAAAT0/D4nN8T9RGro/s800-Ic42/next.png') } .sliderC2 > div { position: absolute; top: 0px; left: 0px; bottom: 0px; z-index: 0; width: 1000%; text-align: left; transition: left 800ms cubic-bezier(0.77, 0, 0.175, 1) 0s; } .sliderC2 > input:nth-of-type(2):checked ~ div { left: -100%; } .sliderC2 > input:nth-of-type(3):checked ~ div { left: -200%; } .sliderC2 > input:nth-of-type(4):checked ~ div { left: -300%; } .sliderC2 > input:nth-of-type(5):checked ~ div { left: -400%; } .sliderC2 > input:nth-of-type(6):checked ~ div { left: -500%; } .sliderC2 > input:nth-of-type(7):checked ~ div { left: -600%; } .sliderC2 > input:nth-of-type(8):checked ~ div { left: -700%; } .sliderC2 > input:nth-of-type(9):checked ~ div { left: -800%; } .sliderC2 > input:nth-of-type(10):checked ~ div { left: -900%; } .sliderC2 > div > div { display: inline-block; position: relative; } .sliderC2 > div > div > p { position: absolute; top: 0px; left: 0px; right: 0px; text-align: center; color: #fff; text-shadow: 1px 1px 2px #000; } </style> <div class='sliderC2'> <input type="radio" name="slider2" id="slider2_1" checked="checked"> <label for="slider2_4"></label> <label for="slider2_2"></label> <input type="radio" name="slider2" id="slider2_2"> <label for="slider2_1"></label> <label for="slider2_3"></label> <input type="radio" name="slider2" id="slider2_3"> <label for="slider2_2"></label> <label for="slider2_4"></label> <input type="radio" name="slider2" id="slider2_4"> <label for="slider2_3"></label> <label for="slider2_1"></label> <div> <div> <p>Восход над островом</p> <img src='https://lh3.googleusercontent.com/-XGgw41OSARk/VePicTdAdgI/AAAAAAAAAS4/WeBbxp4ebQg/s400-Ic42/00099_manaisland_1920x1200.jpg' alt=''> </div><div> <p>Озёрный край</p> <img src='https://lh3.googleusercontent.com/-aafAKIoTkT4/VePihWk2BHI/AAAAAAAAATA/zQVtiYD_eDc/s400-Ic42/00201_lakejipe_1920x1200.jpg' alt=''> </div><div> <p>Закатная синева</p> <img src='https://lh3.googleusercontent.com/-ikbDMRhLc_I/VePkT4XLFtI/AAAAAAAAATg/qaHqQk89RAw/s400-Ic42/00744_laclahachesunset_1920x1200.jpg' alt=''> </div><div> <p>Сельский пейзаж</p> <img src='https://lh3.googleusercontent.com/-BLXeHJNyOqw/VePimp_e_wI/AAAAAAAAATQ/BVw_9LFehyU/s400-Ic42/00442_pyrenees_1920x1200.jpg' alt=''> </div> </div> </div>
Результат:
Если вам не нравится сквозная прокрутка (с последнего на первый кадр и с первого на последний), можно присвоить соответствующим меткам стиль visibility: hidden прямо в коде HTML. Вот что получится:
Собираем всё вместе: вариант слайдера с двумя видами кнопок
Мы можем сделать слайдер, который имеет оба типа навигации: стрелками и круглыми кнопками. Код получится длинноват, но если вы разобрались с предыдущими примерами, в нём вас уже ничто не может испугать:
<style> .sliderC3 { width: 400px; height: 250px; border: 8px solid #fff; box-shadow: 1px 1px 4px #666; border-radius: 5px; position: relative; text-align: center; overflow: hidden; } .sliderC3 > input { display: none; } .sliderC3 > input + label { width: 10px; height: 10px; border-radius: 8px; background: rgba(90, 90, 90, 0.5); border: 2px solid rgba(190, 190, 190, 1); cursor: pointer; z-index: 100; position: relative; display: inline-block; margin-right: 4px; top: 90%; transition: border 0.8s ease-out 0s; } .sliderC3 > input + label:after { content: ' '; display: block; box-sizing: border-box; width: 100%; height: 100%; border-radius: 8px; border: 2px solid rgba(90, 90, 90, 0.8); background: rgba(230, 230, 230, 1); opacity: 0; transition: opacity 0.8s ease-out 0s; } .sliderC3 > input + label:hover, .sliderC3 > input:checked + label { border: 2px solid rgba(230, 230, 230, 1); } .sliderC3 > input:checked + label:after { opacity: 1; } .sliderC3 > input + label + label, .sliderC3 > input + label + label + label { display: none; } .sliderC3 > input:checked + label + label, .sliderC3 > input:checked + label + label + label { display: block; width: 50px; height: 50px; opacity: 0.4; transition: opacity 0.8s ease-out 0s; cursor: pointer; position: absolute; top: 50%; transform: translateY(-50%); z-index: 100; } .sliderC3 > input:checked + label + label:hover, .sliderC3 > input:checked + label + label + label:hover { opacity: 0.6; } .sliderC3 > input:checked + label + label { left: 0px; background: url('https://lh3.googleusercontent.com/-tacAA4lVYgc/VeVDqFrDRRI/AAAAAAAAAT4/RBongekAUqI/s800-Ic42/prev.png') } .sliderC3 > input:checked + label + label + label { right: 0px; background: url('https://lh3.googleusercontent.com/-gy6RMZnCdAc/VeVDqJF1S5I/AAAAAAAAAT0/D4nN8T9RGro/s800-Ic42/next.png') } .sliderC3 > div { position: absolute; top: 0px; left: 0px; bottom: 0px; z-index: 0; width: 1000%; text-align: left; transition: left 800ms cubic-bezier(0.77, 0, 0.175, 1) 0s; } .sliderC3 > input:nth-of-type(2):checked ~ div { left: -100%; } .sliderC3 > input:nth-of-type(3):checked ~ div { left: -200%; } .sliderC3 > input:nth-of-type(4):checked ~ div { left: -300%; } .sliderC3 > input:nth-of-type(5):checked ~ div { left: -400%; } .sliderC3 > input:nth-of-type(6):checked ~ div { left: -500%; } .sliderC3 > input:nth-of-type(7):checked ~ div { left: -600%; } .sliderC3 > input:nth-of-type(8):checked ~ div { left: -700%; } .sliderC3 > input:nth-of-type(9):checked ~ div { left: -800%; } .sliderC3 > input:nth-of-type(10):checked ~ div { left: -900%; } .sliderC3 > div > div { display: inline-block; position: relative; } .sliderC3 > div > div > p { position: absolute; top: 0px; left: 0px; right: 0px; text-align: center; color: #fff; text-shadow: 1px 1px 2px #000; } </style> <div class='sliderC3'> <input type="radio" name="slider4" id="slider4_1" checked="checked"> <label for="slider4_1"></label> <label for="slider4_4"></label> <label for="slider4_2"></label> <input type="radio" name="slider4" id="slider4_2"> <label for="slider4_2"></label> <label for="slider4_1"></label> <label for="slider4_3"></label> <input type="radio" name="slider4" id="slider4_3"> <label for="slider4_3"></label> <label for="slider4_2"></label> <label for="slider4_4"></label> <input type="radio" name="slider4" id="slider4_4"> <label for="slider4_4"></label> <label for="slider4_3"></label> <label for="slider4_1"></label> <div> <div> <p>Восход над островом</p> <img src='https://lh3.googleusercontent.com/-XGgw41OSARk/VePicTdAdgI/AAAAAAAAAS4/WeBbxp4ebQg/s400-Ic42/00099_manaisland_1920x1200.jpg' alt=''> </div><div> <p>Озёрный край</p> <img src='https://lh3.googleusercontent.com/-aafAKIoTkT4/VePihWk2BHI/AAAAAAAAATA/zQVtiYD_eDc/s400-Ic42/00201_lakejipe_1920x1200.jpg' alt=''> </div><div> <p>Закатная синева</p> <img src='https://lh3.googleusercontent.com/-ikbDMRhLc_I/VePkT4XLFtI/AAAAAAAAATg/qaHqQk89RAw/s400-Ic42/00744_laclahachesunset_1920x1200.jpg' alt=''> </div><div> <p>Сельский пейзаж</p> <img src='https://lh3.googleusercontent.com/-BLXeHJNyOqw/VePimp_e_wI/AAAAAAAAATQ/BVw_9LFehyU/s400-Ic42/00442_pyrenees_1920x1200.jpg' alt=''> </div> </div> </div>
Финальный слайдер:
4 комментария
А почему может не работать в записи в вордпресс? Создаю чистый html всё работает, в записи нет. Предполагаю проблема с CSS от темы, но я всем div input label добавил свой класс div.slid - <div class="slid"
Здравствуйте!
Отличная статья. Все сделал, все получилось.
Один вопрос - как сделать это слайдер "резиновым"?
Спасибо за статьи. Мне интересно познавать новые горизонты, если раньше просто учился настроить дизайн то щас хочу научится делать слайдеры и вкладки. С вашими статьями думаю получится это.
Я Хелена Хулио из Эквадора, я хочу хорошенько поговорить о мистере Педро на эту тему.
Г-н Педро и его кредитная компания оказывают мне финансовую поддержку, когда все банки в моем городе отклонили мою просьбу предоставить мне ссуду в размере 500 000,00 долларов США, я старался изо всех сил, чтобы получить ссуду в своих банках здесь, в Эквадоре, но все они мне отказали потому что мой кредит был низким, но с Божьей милостью я узнал о мистере Педро на платформе ссуды, поэтому я решил попробовать подать заявку на ссуду. С Божьей помощью они предоставили мне ссуду в размере 500 000,00 долларов США. В просьбе о ссуде, в которой мне отказали мои банки здесь, в Эквадоре, было действительно здорово вести с ними дела, и мой бизнес сейчас идет хорошо. Электронная почта / контакт, если вы хотите подать заявку на ссуду от них.
pedroloanss@gmail.com
Отправить комментарий