Визначені краї із розмиттям фільтра CSS3


79

Я розмиваю деякі зображення цим кодом

img {
  filter: blur(5px);
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
}

Краї зображення також розмиваються. Чи можна розмити зображення, зберігаючи краї, визначені? Як розмиття вставки чи щось інше?

Відповіді:


103

Ви можете помістити його в <div>с overflow: hidden;і встановити <img>на margin: -5px -10px -10px -5px;.

Демо: jsFiddle

Вихідні дані

CSS

img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
    margin: -5px -10px -10px -5px;
}

div {
    overflow: hidden;
}
​

HTML

<div><img src="http://placekitten.com/300" />​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div>​​​​​​​​​​​​

1
@Moppy Це не працює в Chrome 23 / OS X для мене. Я думаю, що marginце потрібно.
ThinkingStiff

1
@Moppy Оскільки the imgзнаходиться всередині, divі воно blurпереповнює межі div. overflow: hidden;Відрізає його.
ThinkingStiff

10
Що з мотлохом внизу JSFiddle? Я не розумію, навіщо GA відстежувати JSFiddle ...
Bojangles

1
@Bojangles, "сміття" внизу зображення в jsfiddle знаходиться на самому зображенні .
uberdog

3
Чи є спосіб зробити це для фонового зображення? Ідея полягає в створенні розмитого фонового зображення з текстом на ньому
Гай

57

Я зміг зробити цю роботу з

transform: scale(1.03);

Властивість, застосована до зображення. З якоїсь причини в Chrome інші запропоновані рішення не працювали б, якщо б був якийсь відносно розміщений батьківський елемент.

Перевірте http://jsfiddle.net/ud5ya7jt/

Таким чином, зображення буде трохи збільшено на 3%, а краї будуть обрізані, що все одно не повинно бути проблемою для розмитого зображення. У моєму випадку це добре працювало, оскільки я використовував зображення з високою роздільною здатністю як тло. Удачі!


це приємно, просто і регулюється. це чудово працює для моєї ситуації jsfiddle.net/ud5ya7jt/28, тоді як деякі інші рішення, здається, не вдаються зараз.
Jeannie

Щиро дякую за це, саме те, що я шукав :)
jeerbl

1
встановлення батьківського параметра за допомогою overflow: hiddenвидалить смуги прокрутки! Дякую!
dimmg

1
Таке просте рішення!
Dotl

масштаб (1) працює, але 1,03 - це так, що ми обрізаємо зображення на 3%, щоб розмиті краї були не так легко помітні
Жоао Хосезіньо

17

Я використовував -webkit-transform: translate3d(0, 0, 0);с overflow:hidden;.

DOM:

<div class="parent">
    <img class="child" src="http://placekitten.com/100" />
</div>

CSS:

.parent {
    width: 100px;
    height: 100px;
    overflow: hidden;
    -webkit-transform: translate3d(0, 0, 0);
}
.child {
    -webkit-filter: blur(10px);
}

ДЕМО: http://jsfiddle.net/DA5L4/18/

Ця техніка працює на Chrome34 та iOS7.1

Оновлення

http://jsfiddle.net/DA5L4/50/

якщо ви використовуєте останню версію Chrome, вам не потрібно використовувати -webkit-transform: translate3d(0, 0, 0);хак. Але це не працює в Safari (webkit).


@Razvan Cercelaru справді? в якій версії сафарі ви перевірили мою демонстрацію? Це працює в Mac Safari 7.
GeckoTang 05.03.15

Працював у мене! Дякую! (Chromium 50.0.2661.86 (64-розрядна версія) OSX)
iperdiscount

12

Ви також можете зберегти ціле відео, вам не потрібно щось вирізати.
Ви можете накласти тіні, що вставляються, на розмиті білими краями.

Це теж виглядає дуже приємно :)

Просто вставте цей код у батьків свого відео:

.parent {
    -webkit-box-shadow: inset 0 0 200px #000000;
       -moz-box-shadow: inset 0 0 200px #000000;
            box-shadow: inset 0 0 200px #000000;
}

1
Працює ласощі, жодна з інших пропозицій не допомогла.
DGibbs

2
У моєму випадку це допомогло, але все одно залишало небажану розмитість, тому я додав додатковий шар тіньового шару:box-shadow: inset 0 0 200px #000000, inset 0 0 200px #000000;
falsarella

6

У багатьох ситуаціях, коли в IMG можна встановити положення: абсолютне , ви можете використовувати кліп, щоб приховати розмиті краї - і зовнішній DIV непотрібний.

img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
    position: absolute;
    clip: rect(5px,295px,295px;5px);
}

1
caniuse.com/#feat=css-clip-path тут підтримка браузера для відсікання. IE - найкращий 😆
Філіп Джуліані

6

Вирішивши сьогодні цю ж проблему, я хотів би представити рішення, яке (на даний момент) працює у основних браузерах. Деякі інші відповіді на цій сторінці працювали один раз, але нещодавні оновлення, будь то браузер чи ОС, скасували більшість / усіх цих відповідей.

Ключ полягає в тому, щоб розмістити зображення в контейнері та перетворити: масштабувати цей контейнер з його переповнення: прихованого батька. Потім розмиття наноситься на img всередині контейнера, а не на сам контейнер.

Робоча скрипка: https://jsfiddle.net/x2c6txk2/

HTML

<div class="container">
    <div class="img-holder">
        <img src="https://unsplash.it/500/300/?random">
    </div>
</div>

CSS

.container {
    width    : 90%;
    height   : 400px;
    margin   : 50px 5%;
    overflow : hidden;
    position : relative;
}

.img-holder {
    position  : absolute;
    left      : 0;
    top       : 0;
    bottom    : 0;
    right     : 0;
    transform : scale(1.2, 1.2);
}

.img-holder img {
    width          : 100%;
    height         : 100%;
    -webkit-filter : blur(15px);
    -moz-filter    : blur(15px);
    filter         : blur(15px);
}

3

Тільки натяк на прийняту відповідь. Якщо ви використовуєте абсолютну позицію, негативні поля не будуть працювати, але ви все одно можете встановити для верхнього, нижнього, лівого та правого значень від’ємне значення і зробити переповнення батьківського елемента прихованим.

Відповідь на додавання кліпу до абсолютного зображення має проблему, якщо ви не знаєте розмір зображення.


2

Вставте зображення всередину символів з position: relative;іoverflow: hidden;

HTML

<div><img src="#"></div>

CSS

div {
    position: relative;
    overflow: hidden;
}
img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
}

Це також працює з елементами змінних розмірів, такими як динамічні div.


1

Ви можете зупинити зображення, щоб воно не перекривало його краї, відрізавши зображення та застосувавши обгортковий елемент, який встановлює ефект розмиття на 0 пікселів. Ось як це виглядає:

HTML

<div id="wrapper">
  <div id="image"></div>
</div>

CSS

#wrapper {
  width: 1024px;
  height: 768px;

  border: 1px solid black;

  // 'blur(0px)' will prevent the wrapped image
  // from overlapping the border
  -webkit-filter: blur(0px);
  -moz-filter: blur(0px);
  -ms-filter: blur(0px);
  filter: blur(0px);
}

#wrapper #image {
  width: 1024px;
  height: 768px;

  background-image: url("../images/cats.jpg");
  background-size: cover;

  -webkit-filter: blur(10px);
  -moz-filter: blur(10px);
  -ms-filter: blur(10px);
  filter: blur(10px);

  // Position 'absolute' is needed for clipping
  position: absolute;
  clip: rect(0px, 1024px, 768px, 0px);
}

1

Найпростіший спосіб - це просто додати прозору межу до div, який містить зображення, і встановити його властивість відображення на inline-block так само:

CSS:

div{
margin: 2rem;
height: 100vh;
overflow: hidden;
display: inline-block;
border: 1px solid #00000000;
}

img {
-webkit-filter: blur(2rem);
filter: blur(2rem);
}

HTML

<div><img src='https://images.unsplash.com/photo-1557853197-aefb550b6fdc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=375&q=80' /></div>

Ось код, що зображує те саме: https://codepen.io/arnavozil/pen/ExPYKNZ


0

Ви можете спробувати додати межу до іншого елемента:

DOM:

<div><img src="#" /></div>

CSS:

div {
   border: 1px solid black;
}
img {
    filter: blur(5px);
}


0

Ось рішення, яке я придумав, зберігає 100% зображення, і не потрібно обрізати:

В основному я дзеркально зображаю зображення в сітці 3x3, потім все розмиваю, а потім збільшую в центрі зображення, ефективно створюючи, як повторювані краї при розмитті після ефектів, трохи дивно, що css3 не має вбудованих країв для повторення.

Посилання на метод / код: Як розмити зображення за допомогою CSS3, не обрізаючи та не зникаючи краї?


1
Хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Arnon Zilca,

Ну так смішно, що ти кажеш, тому що я щойно оновив цю публікацію та заголовок, і це повністю переплутало посилання тут x)
Patrik Fröhler

0

Якщо ви використовуєте фонове зображення, найкращий спосіб, який я знайшов, це:

filter: blur(5px);
margin-top: -5px;
padding-bottom: 10px;
margin-left: -5px;
padding-right: 10px;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.