В этом уроке мы собираемся взять несколько простых ссылок на миниатюры и превратить их в гибкую CSS сетку с размытым эффектом наведения мыши. Мы также будем использовать отличный трюк CSS, чтобы пользователи сенсорного экрана не пропустили!
Вот что мы будем создавать:
Немного фона
Недавно Рэйчел Макколлин написала учебное пособие, объясняющее, как добавить галерею ссылок на миниатюры в темах WordPress.
Ссылки действуют как навигация для дочерних страниц той страницы, на которой находится пользователь (или той страницы, которую вы указали), и результирующий плагин выводит что-то вроде этого:

Используя разметку, сгенерированную плагином Rachel, мы собираемся сделать следующее:
- Расставьте эскизы с помощью CSS Grid, что даст нам адаптивную галерею.
- Создайте эффект наведения с помощью CSS-фильтров и переходов.
- Используйте отличный медиа-запрос CSS, чтобы убедиться, что пользователи с сенсорным экраном по-прежнему могут видеть каждый заголовок миниатюры, даже без зависания.
1. Измените разметку (немного)
Давайте кратко рассмотрим разметку, созданную кодом Рэйчел. Когда очищено, это выглядит эффективно так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<div class=»child-page-listing»>
<h2>Our Locations</h2>
<article class=»location-listing»>
<a class=»location-title» href=»#»>San Francisco</a>
<div class=»location-image»>
<a href=»#»>
<img src=»image.jpg» alt=»san francisco»>
</a>
</div>
</article>
<!— more articles —>
</div>
|
У нас есть родительский элемент <div> , который содержит элементы <h2> и несколько элементов <article> . Когда мы используем CSS Grid, мы сначала определяем контейнер сетки. В этом случае мы могли бы использовать родительский элемент <div> , но это сделало бы каждого прямого дочернего элемента — включая <h2> — элементом сетки, поэтому нам нужно немного изменить вещи.
Мы обернем все элементы <article> в другой элемент <div> (не стесняйтесь использовать любой элемент, который вам наиболее удобен), который мы с воображением дадим класс grid-container . Используйте эту стартовую ручку в качестве основы.
2. Отзывчивая CSS-сетка, в три линии
С помощью нескольких правил мы можем превратить наши эскизы в сетку:
|
1
2
3
4
5
|
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
grid-gap: 1em;
}
|
Простыми линиями здесь являются display: grid; (который превращает всех прямых потомков в элементы сетки и выкладывает их) и grid-gap: 1em; (который определяет наши желоба).
Небольшая сложность возникает из-за значения, которое мы присвоили свойству grid-template-columns , которое определяет наши столбцы. Обычно вы ожидаете увидеть что-то вроде repeat(3, 200px) которое даст нам три столбца по 200px. В этом случае мы использовали ключевое слово auto-fill для repeat() , а затем некоторые значения. Это дает нам столько столбцов с минимальной 300px и максимальной 1fr, сколько поместится в контейнере сетки.
Измените размер окна вашего браузера и посмотрите, как он себя ведет!
Еще одна деталь, которую вам нужно добавить:
|
1
2
3
4
|
img {
width: 100%;
height: auto;
}
|
Это позволит убедиться, что изображения правильно заполняют свои контейнеры (особенно это необходимо для использования с демонстрацией Рэйчел, поскольку нам нужно перезаписать встроенные свойства ширины и высоты, выводимые WordPress).
3. Эффект наведения
Мы собираемся использовать заголовки в качестве наложений для миниатюр, показывая их при наведении. Мы также дадим скрытым изображениям красный эффект и небольшое размытие, чтобы улучшить читаемость наложенного текста.
Наложить заголовок
Чтобы наложить заголовок, нам нужно расположить его, поэтому мы начнем с положения статьи position: relative; и титульная position: absolute; , Мы также дадим ему красный фон и сделаем так, чтобы он заполнил доступное пространство:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
.location-listing {
position: relative;
}
.location-title {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba(90,0,10,0.4);
}
|
Хорошее начало!

Уже есть одна или две вещи, которые нужно улучшить, включая дополнительное место внизу (заголовок немного больше, чем миниатюра). Это можно решить, удалив любую line-height в контейнере изображения:
|
1
2
3
|
.location-image {
line-height: 0;
}
|
Стиль заголовка
Некоторые типографские стили улучшат внешний вид нашего заголовка, и три линии магии flexbox выровняют его по центру для нас:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
.location-title {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba(90,0,10,0.4);
/* typographic styles */
color: white;
font-size: 1.5em;
font-weight: bold;
text-decoration: none;
/* position the text centrally*/
display: flex;
align-items: center;
justify-content: center;
}
|
Намного лучше:

Скрыть заголовок
Теперь давайте скроем заголовок, удалив его непрозрачность, чтобы мы могли видеть его только при наведении курсора. Еще пара правил под теми, которые мы уже добавили в наш .location-title должны сделать это:
|
1
2
3
|
/* hide the title by default */
opacity: 0;
transition: opacity .5s;
|
Здесь мы также устанавливаем правило transition чтобы при восстановлении непрозрачности это происходило постепенно (в течение 0,5 секунды). Давайте вернем это сейчас:
|
1
2
3
|
.location-listing:hover .location-title {
opacity: 1;
}
|
Большой! Теперь наш заголовок снова появляется при наведении:

Размытые линии
Мы уже создали великолепный эффект парения, но давайте сделаем еще шаг вперед, не так ли? Давайте добавим к изображению фильтр размытия. Мы начнем с установки фильтра размытия на нормальное состояние, чтобы дать нам что-то для перехода. Затем мы размым все на 2 пикселя для состояния наведения (сделайте это число настолько экстремальным, насколько вы пожелаете, но я думаю, что 2 пикселя дает нам отличное изображение):
|
1
2
3
4
5
6
7
8
|
.location-image img {
filter: blur(0px);
transition: filter 0.3s ease-in;
}
.location-listing:hover .location-image img {
filter: blur(2px);
}
|
Вот что это дает нам:

Несколько вещей, чтобы отметить:
- Название исчезло, потому что браузер теперь отображает размытое изображение поверх него.
- Эффект размытия выглядит хорошо, но он также дает нам размытый край (мы можем добиться большего, чем это).
Исправить скрытый заголовок так же просто, как добавить z-index: 1; в .location-title .
Исправление размытого края немного сложнее. Для начала мы масштабируем изображение, чтобы сделать его немного больше, а затем устанавливаем overflow: hidden; на контейнере изображения ( .location-listing ), так что когда изображение большего размера размывается, его края эффективно обрезаются. Вот готовые свойства для двух рассматриваемых элементов:
|
01
02
03
04
05
06
07
08
09
10
|
.location-image img {
filter: blur(0px);
transition: filter 0.3s ease-in;
transform: scale(1.1);
}
.location-listing {
position: relative;
overflow: hidden;
}
|
transform: scale(1.1); Правило масштабирует наше изображение во всех направлениях до 1.1 (где 1.0 будет держать вещи точно одинакового размера). Вот намного более аккуратный результат:

4. Проблема с сенсорными экранами
Так что у нас это! Великолепно выглядящая сетка изображения с размытым эффектом наведения на каждый эскиз. Единственное, что названия скрыты для тех, кто не может навести курсор на изображения (большое количество планшетов и смартфонов не имитируют наведение при длительном «нажатии»), что не очень доступно.
К счастью, у CSS есть несколько очень полезных интерактивных медиа-запросов, которые могут помочь нам (и они также пользуются довольно приличной поддержкой браузера ). Эти запросы будут определять механизм ввода браузера — качество указывающего устройства, возможность зависания и некоторые другие специальные определения — так что мы можем достаточно точно определить, просматриваются ли наши эскизы на устройстве с сенсорным экраном.
Возьмем этот медиа-запрос, например (он делает именно то, что вы могли ожидать):
|
1
|
@media (hover: none) { }
|
В этих фигурных скобках мы поместили бы любые стили, которые мы хотим применить к браузеру, который не может обрабатывать :hover . Давайте сделаем это — мы заявим, что для устройств, где зависание невозможно или, по крайней мере, неудобно, уменьшенное изображение всегда будет размытым, а заголовок всегда будет видимым:
|
1
2
3
4
5
6
7
8
9
|
/* for touch screen devices */
@media (hover: none) {
.location-title {
opacity: 1;
}
.location-image img {
filter: blur(2px);
}
}
|
Взглянем:

Примечание . Как уже упоминалось, поддержка этого довольно разумна, но дискуссии о реализации интерактивных медиа-запросов все еще продолжаются. Есть большая вероятность, что эта спецификация изменится или будут удалены детали.
Вывод
И мы сделали! Спасибо за продолжение, я надеюсь, что вы узнали одну или две вещи и получили удовольствие от игры с CSS (кому это не нравится?). Вот еще один взгляд на финальную демонстрацию — наслаждайтесь добавлением ее в файлы темы, созданные Рэйчел в первой части!

