具有CSS3滤镜模糊的已定义边缘


79

我用这段代码模糊了一些图像

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

图像的边缘也会变得模糊。在保持边缘清晰的同时,是否可以使图像模糊?像插图模糊之类的?

Answers:


100

你可以把它放在一个<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是必需的。
ThoughtStiff'9

1
@Moppy因为处于img内,div并且blur溢出的边界div。该overflow: hidden;砍下。
ThinkingStiff

10
JSFiddle底部的垃圾是什么?我不知道为什么有必要使用GA跟踪JSFiddle ...
Bojangles

1
@ Bojangles,jsfiddle图片底部的“垃圾”位于图片本身中
uberdog 2014年

3
有没有办法对背景图片执行此操作?这个想法是创建带有文本的模糊背景图像
Guy 2014年

57

我能够通过

transform: scale(1.03);

属性应用于图像。由于某种原因,在Chrome上,如果存在相对定位的父元素,则提供的其他解决方案将无法正常工作。

检查http://jsfiddle.net/ud5ya7jt/

这样,图像将被稍微放大3%,并且边缘将被裁剪,无论如何对于模糊图像来说这都不是问题。在我的情况下效果很好,因为我使用的是高分辨率图像作为背景。祝好运!


这是很好,简单,可调。它非常适合我的情况jsfiddle.net/ud5ya7jt/28,而其他一些解决方案现在似乎已失败。
珍妮

非常感谢您,这正是我所寻找的:)
jeerbl

1
设置父项overflow: hidden将删除滚动条!谢谢!
dimmg '17

1
如此简单的解决方案!
Dotl

规模(1)的工作,但在1.03是让我们通过3%,以便裁剪图像的边缘模糊,以不会像容易引人注目
若昂Josézinho

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);hack。但它不适用于Safari(webkit)。


@Razvan Cercelaru真的吗?您查看了我的演示版的safari?它工作在Mac的Safari浏览器7
GeckoTang

为我工作!谢谢!(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 2015年

2
就我而言,它有所帮助,但仍然留下了一些不希望的模糊,因此我添加了一个额外的框阴影层:box-shadow: inset 0 0 200px #000000, inset 0 0 200px #000000;
falsarella

6

在许多可以将IMG定位到绝对位置的情况下,可以使用clip隐藏隐藏的边缘-不需要外部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是最好的😆–
Philip Giuliani

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添加透明边框,并将其display属性设置为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>

这是一个描绘相同内容的codepen: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 2015年

好吧,有趣的是,您说这是因为我刚刚更新了该帖子和标题,并且完全弄乱了此处的链接x)
PatrikFröhler2015年

0

如果您使用的是背景图片,我发现的最好方法是:

filter: blur(5px);
margin-top: -5px;
padding-bottom: 10px;
margin-left: -5px;
padding-right: 10px;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.