Галерея изображений CSS

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

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



<style>
input[name="raz"] {display: none;}


.gallery {position: relative; padding-top: 45%; margin: 0 2.3em; line-height: 0; border-bottom: 4em solid; background: no-repeat 50% 0; background-size: auto 100%;} /* стиль блока */ 

.gallery label {display: inline-block; width: 20%; height: 4em; margin-bottom: -4em; background: no-repeat 50% 50%; background-size: calc(100% - 4px) calc(100% - 4px); cursor: pointer;}
.gallery label:hover {background-color: #686868;} /* стиль при наведении на миниатюру */ 
#raz1:checked ~ .gallery label:nth-of-type(1), /* стиль активного пункта */ 
#raz2:checked ~ .gallery label:nth-of-type(2),
#raz3:checked ~ .gallery label:nth-of-type(3),
#raz4:checked ~ .gallery label:nth-of-type(4),
#raz5:checked ~ .gallery label:nth-of-type(5) {opacity: .5; cursor: default;}

#raz1:checked ~ .gallery, .gallery label:nth-of-type(1) {background-image: url(адрес_изо);}
#raz2:checked ~ .gallery, .gallery label:nth-of-type(2) {background-image: url(адрес_изо);}
#raz3:checked ~ .gallery, .gallery label:nth-of-type(3) {background-image: url(адрес_изо);}
#raz4:checked ~ .gallery, .gallery label:nth-of-type(4) {background-image: url(адрес_изо);}
#raz5:checked ~ .gallery, .gallery label:nth-of-type(5) {background-image: url(адрес_изо);}

.gallery label:before { /* абзац создаёт кнопки-стрелки, которые можно и не использовать */ 
 position: absolute; top: 40%; border-width: 2.3em 1em; border-style: solid;}
#raz1:checked ~ .gallery label:nth-of-type(2):before, 
#raz2:checked ~ .gallery label:nth-of-type(3):before,
#raz3:checked ~ .gallery label:nth-of-type(4):before,
#raz4:checked ~ .gallery label:nth-of-type(5):before,
#raz5:checked ~ .gallery label:nth-of-type(1):before {content: ""; right: -2.3em; border-color: transparent transparent transparent #686868; box-shadow: -2px 0 0 -1px #000;}
#raz1:checked ~ .gallery label:nth-of-type(5):before,
#raz2:checked ~ .gallery label:nth-of-type(1):before, 
#raz3:checked ~ .gallery label:nth-of-type(2):before, 
#raz4:checked ~ .gallery label:nth-of-type(3):before, 
#raz5:checked ~ .gallery label:nth-of-type(4):before {content: ""; left: -2.3em; border-color: transparent #686868 transparent transparent; box-shadow: 2px 0 0 -1px #000;}

#raz1:checked ~ .gallery label:nth-of-type(1):after, /* абзац создаёт названия к изображениям, которые можно и не использовать */ 
#raz2:checked ~ .gallery label:nth-of-type(2):after, 
#raz3:checked ~ .gallery label:nth-of-type(3):after, 
#raz4:checked ~ .gallery label:nth-of-type(4):after, 
#raz5:checked ~ .gallery label:nth-of-type(5):after {content: attr(title); position: absolute; top: -2em; left: 0; width: 100%; text-align: center; font-weight: 900;}
</style>

<input type="radio" checked="checked" name="raz" id="raz1"/><input type="radio" name="raz" id="raz2"/><input type="radio" name="raz" id="raz3"/><input type="radio" name="raz" id="raz4"/><input type="radio" name="raz" id="raz5"/>

<div class="gallery"><label for="raz1" title="название"></label><label for="raz2" title="название"></label><label for="raz3" title="название"></label><label for="raz4" title="название"></label><label for="raz5" title="название"></label></div>
в f t
наверх ↑

27 комментариев:

Вадим Маслий
Спасибо, очень интересно попробовать у себя на блоге!
С уважением, Вадим.
NMitra
Дерзайте))
MagentaWAVE
Вот это зачетная штука! Возьму на заметку, но я не перестаю удивляться и восхищаться тому что вы в этими инпутами вытворяете :)
NMitra
Да, я натренировалась)))
Анонимный
Здрасте. У меня есть небольшая проблема. Используя ваш код, у меня появляется большой разрыв страницы выше шапки, попробывал убрать padding-top: с 45% до 0% разрыв уменьшился, но картинка в галерее пропала. Может что-то где-то проглядел? не знаю. И ешё вопрос. Можно ли вставлять в галлерею картинки с компьютера?
NMitra
Привет. С компьютера нельзя, только уже загруженные изображения.

Покажите конкретный пример (нужен URL-адрес страницы), так, на глаз сложно сказать.
Анонимный
Спасибо, все работает.Подскажите пожалуйста как сделать,чтобы было подпись к каждой фотографии?Например имя.
Инна
NMitra
Дополнила статью ещё одним абзацем.
Роман Буженко
Спасибо за материалы!
Уже два дня оторваться не могу. Подумалось, "Вот бы полгода назад", но видать был еще совсем не готов. :)
Преклоняюсь пред Вашим усердием!
NMitra
Благодарю за отзыв, Роман, приятно слышать комплименты :))
Анонимный
В строке стиля блока border-bottom: 4em solid хорошо добавить
transparent тогда чёрный фон не будет виден и приобретается более цивильный вид. Кроме того есть еще проблемка - когда просмотр сужается до размеров мобильного устройства, то миниатюры при не статичной вёрстке начинают некорректно отображаться, залезать друг на друга (и при этом становится виден черный border-bottom: 4em solid - потому и рекомендовал tranparent добавить). Особенно если картинок не 5 как у вас, а 9-10. И без их прокрутки это конечно не комильфо (это намёк из соседней темы). :)
А так спасибо.. по-разбирался, настроил под свои нужды - надо сказать очень не дурно.
NMitra
То есть вы не хотите миниатюры, а вместо этого хотите одну прокрутку? Я видела когда крутятся и миниатюры и основные фото, но на мой вкус стрелок должно быть только две, а не четыре.
Анонимный
неее... чтобы были и миниатюры, и одна большая, но чтоб миниатюры прокручивались - т.е. когда фоток не 5, а допустим 20, то чтоб видны были одна большая и 5 видимых миниатюр (две предыдущие,актуальная, две следующие), где остальные крайние миниатюры автоматически скрываются при общей прокрутке (2 стрелочки). Как в соседней теме http://shpargalkablog.ru/2012/12/scrolling-css.html
Скажем так, к той теме прибавить только большой просмотр, а прокрутку сделать миниатюрнее и всё. Капишь? :)
NMitra
Так? http://shpargalkablog.ru/2013/07/slayder-dlya-sayta.html
Анонимный
Потрясающе... Просто замечательно.. Всё правильно. Как я ждал вашего ответа.. Мне как раз еще, блин, фоток подкинули, а там уже вставлять до безобразия некуда. А теперь можно сколь угодно с прокруткой!
Были б вы рядом.. я б расцеловал вас.. :)
Благодарю вас за труды и терпение!
NMitra
:)
Obi Van
А как для видео сделать?
NMitra
Вариант 1: изначально загружать все видео, а затем с помощью CSS прятать/показывать нужный
Вариант 2: при помощи JavaScript менять один параметр URL. Посмотрите тут: http://shpargalkablog.ru/2011/01/youtube.html
Obi Van
Спасибо)))
Анонимный
Наташа(NMitra), огромное спасибо за простое и доходчивые объяснение любой из Ваших тем. Очень много уже сделала только благодаря Вашим материалам на человеческом языке. Поклон мой.
NMitra
Анонимный, благодарю за тёплые слова, очень приятно слышать!

Obi Van, сегодня увидела, но не разбиралась. В исходном коде посмотрите реализацию. Человек всё только на CSS делает: http://www.cssplay.co.uk/menu/cssplay-video-playlist.html
Анонимный
Как загрузить фотографии с компьютера?
А то только из интернета можно качать
NMitra
Фото так или иначе в интернете имеют свой URL-адрес. Можно загрузить их на какой-нибудь фотохостинг, в Гугл плюс, например, или ВКонтакте. Если есть хостинг у сайта, то таких вопросов не должно возникать.
Анонимный
Подскажите пожалуйста, как выстроить миниатюры вертикальным блоком по правой стороне?
Если блоку миниатюр присваиваю display:block; то ок они выстаиваются по стандарту по левой стороне и под изображением, плюс само изображение увеличивается в два раза. Немного пошаманив изображение встает на место, но блок миниатюр упорно позиционируется под изображением:(
NMitra
Нужно вёрстку менять, например, как тут http://shpargalkablog.ru/2011/01/youtube.html
Владислав Кушниров
День добрый!
А можно ли в данной галерее сделать превью "нерастягиваемыми"?
NMitra
Добрый день! Уберите или измените на свой width: 20%; в .gallery label