Blur-эффект на чистом css
Добавлено 02.01.2016 в 15:15
Blur-эффект на чистом css
В CSS3 есть множество новых свойств, которые могут значительно ускорить вёрстку тех или иных элементов страницы. Например, css-фильтры, об одном из которых сегодня предлагается поговорить.

Каждый из нас хотя бы раз имел возможность наблюдать эффект размытия на странице. Зачастую для его создания используется jQuery-библиотека bjurjs. Однако, не на всех сайтах целесообразно использовать jQuery, да и технологии не стоят на месте: теперь мы можем воспользоваться решением на чистом CSS. Попробуем?

Пример простейшей разметки:

Код
<!doctype html>
<html lang="en">
  <head>
  <meta charset="UTF-8"/>
  <title>Blur</title>
  <link href="style.css" rel="stylesheet"/>
  </head>
  <body>
  <div class="wrapper">
  <div class="blur"></div>
  <div class="inner-wrapper">
  <h2>Welcome to our website!</h2>
  </div>
  </div>
  </body>
</html>


Итак, задан родительский div с классом wrapper, служащий контейнером для двух вложенных div'ов: inner-wrapper будет содержать текст приветствия, а blur — изображение, к которому нужно применить эффект размытия.

Обратимся к стилям.

Код
.wrapper {
  position: relative;
  width: 500px;
  height: 500px;
  margin: 0 auto;
}

.inner-wrapper,
.blur {
  position: absolute;
  width: 500px;
  height: 300px;
  left: 0;
  top: 0;
  bottom: 0;
  right: 0;
}


Как можно видеть, дочерние блоки абсолютно позиционированы и находятся на одном уровне. Дело в том, что эффект размытия будет применяться и к тексту приветствия, чего нам хотелось бы избежать. Поэтому лучше управлять положением блоков относительно друг друга при помощи z-index. Сделаем это, а также зададим необходимый бэкгрануд для .blur:

Код
.inner-wrapper {
  z-index: 100;
  color: #fff;
  text-align: center;
  text-shadow: 0 0 5px rgba(0,0,0,.5);
}
.blur {
  z-index: 99;
  background-image: url(image.png);
  background-size: cover;
  background-repeat: no-repeat;
}


На данный момент получаем простейшую страничку с картинкой и текстом:



Настало время применить магию! Увы, firefox пока не поддерживает css-фильтры, поэтому в дело пойдёт небольшой трюк: нужно «скормить» ему svg-файл со следующим содержимым:

Код
<!-- blur.svg -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <filter id="blur">
  <feGaussianBlur stdDeviation="5"/>
  </filter>
</svg>


и указать путь к этому файлу, а также обратиться к нужному фильтру. В нашем случае фильтр всего один: тот, что определён под id blur. Вот как должен быть преобразован css-код для получения эффекта размытия:

Код
.inner-wrapper {
  z-index: 100; /* текст не размыт */
  color: #fff;
  text-align: center;
  text-shadow: 0 0 5px rgba(0,0,0,.5);
}
.blur {
  z-index: 99; /* изображение размыто */
  background-image: url(image.png);
  background-size: cover;
  background-repeat: no-repeat;
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  filter: blur(5px);
  filter: url('blur.svg#blur'); /* путь к svg */
}


А вот и итоговый вариант с применением эффекта размытия:



Единственный недостаток: нечёткие границы размытия, которые выходят за пределы родительского элемента. Часто такой побочный эффект может быть нежелательным. Ну, что ж, можно поиграть с радиусом размытия или применить overflow: hidden.
К материалу оставили 0 комментариев