【问题标题】:CSS blur only in one direction (motion blur)CSS 仅在一个方向上模糊(运动模糊)
【发布时间】:2014-07-25 14:56:11
【问题描述】:

我需要动态模糊页面上的图像,但只能沿一个轴(特别是Y)。所以这是我的要求:

  • 必须“实时”完成(我无法预渲染图像的模糊版本)
  • 就像我说的,仅在 Y 轴上(像运动模糊,但垂直)
  • 需要动画
  • 应该在 IE9+ 中工作

我的第一个想法是使用一个简单的 CSS 过滤器:

img {
    filter: blur(20px);
}

我可以通过添加过渡 (transition: filter 0.2s linear) 来制作动画,但它只会创建高斯模糊,这不是我想要的效果。该语法不支持 filter: blur(0 10px); 之类的东西来将模糊限制在一个轴上。

然后我读到模糊滤镜(以及其他滤镜)实际上只是 SVG 滤镜的简写,如果需要,您可以手动编写。因此,我创建了一个名为 filter.svg 的 SVG,它仅沿 Y 轴 (0 20) 指定 20px 模糊:

<?xml version="1.0" standalone="no"?>
<svg width="1" height="1" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <filter id="blur">
            <feGaussianBlur in="SourceGraphic" stdDeviation="0 20" />
        </filter>
    </defs>
</svg>

并像这样应用它:

img {
    filter: url("filter.svg#blur");
}

而且效果很好……但在 Firefox 中。 Safari/Chrome don't support url() 作为 filter 的值。另外,我无法为它设置动画,因为该值是 URL 而不是数字,所以 transition 不起作用。

最重要的是,我认为这两种方法都不是work in IE9

那么:有任何方法来做我想做的事吗?我已经研究过使用canvas 作为替代方案,但找不到任何仅在一个方向上的模糊示例。

【问题讨论】:

  • 使用 JS 而不是 CSS 和 SVG 以跨浏览器的方式执行此操作会简单得多。 IIRC EaselJS 允许单轴模糊动画。
  • 如果您使用 -webkit-filter: url(etc.) 那么您将在 Safari/Chrome 中获得支持(过滤器还没有无前缀)。您还可以在过滤器中使用 定义 SVG 动画以获得过渡。
  • @MichaelMullany:嗯...我试过了,但它似乎没有做任何事情:-webkit-filter: url(filter.svg#blur);。 Web Inspector 显示正在应用该属性,因此它可以识别它,但它对我的图像没有影响。在 Firefox 中,没有前缀的完全相同的东西可以正常工作 (filter: url(filter.svg#blur);)。你有一个例子来说明这个在 WebKit 中的工作原理吗?
  • 哦,这很有趣——如果 SVG 是在 HTML 中内联定义的,它就可以工作。我想我可以做到,但我想知道为什么它在外部文件中不起作用?
  • 啊哈!对于标准的filter 属性,URL 是相对的,但对于-webkit-filter,它是绝对的。所以它在 Firefox 和 Safari/Chrome 中都有效,但我必须以不同的方式编写路径:filter: url(filter.svg#blur);-webkit-filter: url(css/filter.svg#blur);。现在我要去某个地方了……

标签: css canvas svg-filters motion-blur


【解决方案1】:

如果我理解的问题是正确的,它可以用 JQuery 来完成。

CSS3 确实有其局限性,而且在交互价值方面也非常有限。

Jquery 还增加了跨平台稳定性。

jQuery

$(document).ready(function() {
  var $img = $('.image')
  $img.hide();
  $img.show().animate({
      opacity: 100,
      paddingTop: '+=80'
  }, 500)
});

这是一个例子,它可以与 javacript 一起使用 玩弄不透明度。

function myMove() {
  var elem = document.getElementById("animate");
  var pos = 0;
  var id = setInterval(frame, 5);

  function frame() {
    if (pos == 150) {
      clearInterval(id);
    } else {
      pos++;
      elem.style.left = pos + 'px';
    }
  }
}
#container {
  width: 400px;
  height: 400px;
  position: relative;
  background: yellow;
}

#animate {
  width: 50px;
  height: 50px;
  position: absolute;
  background-color: red;
}
<p>
  <button onclick="myMove()">Click Me</button>
</p>

<div id="container">
  <div id="animate"></div>
</div>

【讨论】:

  • 如果这个答案提供了一个简短的例子来说明你认为如何使用 javascript 来实现这一点,那么这个答案会更有帮助。
  • 这个答案是不是贴错了问题?该问题询问如何将动画垂直模糊应用于图像。答案显示了一个盒子从左到右移动的例子......?
猜你喜欢
  • 1970-01-01
  • 2020-03-17
  • 2021-12-11
  • 1970-01-01
  • 2010-11-07
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多