Статьи

Создайте галерею изображений CSS Grid (с эффектами размытия и интерактивными медиазапросами)

В этом уроке мы собираемся взять несколько простых ссылок на миниатюры и превратить их в гибкую CSS сетку с размытым эффектом наведения мыши. Мы также будем использовать отличный трюк CSS, чтобы пользователи сенсорного экрана не пропустили!

Вот что мы будем создавать:

Недавно Рэйчел Макколлин написала учебное пособие, объясняющее, как добавить галерею ссылок на миниатюры в темах WordPress.

  • WordPress
    Создайте галерею изображений WordPress: закодируйте плагин
    Рэйчел Макколлин

Ссылки действуют как навигация для дочерних страниц той страницы, на которой находится пользователь (или той страницы, которую вы указали), и результирующий плагин выводит что-то вроде этого:

WordPress миниатюрные ссылки на дочерние страницы
Возьмите плагин и файлы тем из репозитория на GitHub .

Используя разметку, сгенерированную плагином Rachel, мы собираемся сделать следующее:

  • Расставьте эскизы с помощью CSS Grid, что даст нам адаптивную галерею.
  • Создайте эффект наведения с помощью CSS-фильтров и переходов.
  • Используйте отличный медиа-запрос CSS, чтобы убедиться, что пользователи с сенсорным экраном по-прежнему могут видеть каждый заголовок миниатюры, даже без зависания.

Давайте кратко рассмотрим разметку, созданную кодом Рэйчел. Когда очищено, это выглядит эффективно так:

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 . Используйте эту стартовую ручку в качестве основы.

С помощью нескольких правил мы можем превратить наши эскизы в сетку:

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, сколько поместится в контейнере сетки.

  • CSS Grid Layout
    CSS Grid Layout: адаптивность с автоматическим заполнением и minmax ()

Измените размер окна вашего браузера и посмотрите, как он себя ведет!

Еще одна деталь, которую вам нужно добавить:

1
2
3
4
img {
  width: 100%;
  height: auto;
}

Это позволит убедиться, что изображения правильно заполняют свои контейнеры (особенно это необходимо для использования с демонстрацией Рэйчел, поскольку нам нужно перезаписать встроенные свойства ширины и высоты, выводимые WordPress).

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

Чтобы наложить заголовок, нам нужно расположить его, поэтому мы начнем с положения статьи 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);
}

Хорошее начало!

превью шаг 1

Уже есть одна или две вещи, которые нужно улучшить, включая дополнительное место внизу (заголовок немного больше, чем миниатюра). Это можно решить, удалив любую 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);
}

Вот что это дает нам:

Несколько вещей, чтобы отметить:

  1. Название исчезло, потому что браузер теперь отображает размытое изображение поверх него.
  2. Эффект размытия выглядит хорошо, но он также дает нам размытый край (мы можем добиться большего, чем это).

Исправить скрытый заголовок так же просто, как добавить 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 будет держать вещи точно одинакового размера). Вот намного более аккуратный результат:

не более размытых линий

Так что у нас это! Великолепно выглядящая сетка изображения с размытым эффектом наведения на каждый эскиз. Единственное, что названия скрыты для тех, кто не может навести курсор на изображения (большое количество планшетов и смартфонов не имитируют наведение при длительном «нажатии»), что не очень доступно.

К счастью, у 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 (кому это не нравится?). Вот еще один взгляд на финальную демонстрацию — наслаждайтесь добавлением ее в файлы темы, созданные Рэйчел в первой части!