Визначені краї із розмиттям фільтра 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.