Defined Edges With CSS3 Filter Blur
I am blurring some images with this code
img {
filter: blur(5px);
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
}
The edges of the image get blurred too though. Is it possible to blur the image, while keeping the edges defined? Like an inset blur or something?
Solution 1:
You could put it in a <div>
with overflow: hidden;
and set the <img>
to margin: -5px -10px -10px -5px;
.
Demo:
Output
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>
Solution 2:
I was able to make this work with the
transform: scale(1.03);
Property applied on the image. For some reason, on Chrome, the other solutions provided wouldn't work if there was any relatively positioned parent element.
Check http://jsfiddle.net/ud5ya7jt/
This way the image will be slightly zoomed in by 3% and the edges will be cropped which shouldn't be a problem on a blurred image anyway. It worked well in my case because I was using a high res image as a background. Good luck!
Solution 3:
I used -webkit-transform: translate3d(0, 0, 0);
with 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);
}
DEMO: http://jsfiddle.net/DA5L4/18/
This technic works on Chrome34 and iOS7.1
Update
http://jsfiddle.net/DA5L4/50/
if you use latest version of Chrome, you don't need to use -webkit-transform: translate3d(0, 0, 0);
hack. But it doesn't works on Safari(webkit).
Solution 4:
You can also keep the whole video, you do not have to cut something away.
You can overlay inset shadows over the white-blurred edges.
This looks really nice as well :)
Just paste this code to your videos' parent:
.parent {
-webkit-box-shadow: inset 0 0 200px #000000;
-moz-box-shadow: inset 0 0 200px #000000;
box-shadow: inset 0 0 200px #000000;
}
Solution 5:
In the many situations where the IMG can be made position:absolute, you can use clip to hide the blurred edges--and the outer DIV is unnecessary.
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);
}