【问题标题】:CSS3 / HTML 5 / PNG blur content behind elementCSS3 / HTML 5 / PNG模糊元素后面的内容
【发布时间】:2013-06-27 03:22:36
【问题描述】:

我正在尝试模糊固定位置标题后面的内容,以便在该 div 后面有用户滚动的内容后面的内容是模糊的。

我曾经在 CSS 中通过简单的不透明度来实现这一点,但这不会使 DIV 后面的内容变蓝,只是在它前面强加一个半透明面板。

有没有一种简单的方法,即使它是实现我所追求的欺骗。无论是使用 PNG 背景图片还是 CSS。

看看 iOS7 是如何做到这一点的http://www.apple.com/ios/ios7/features/

【问题讨论】:

    标签: css html png blur


    【解决方案1】:

    稍加一点 HTML5 和 JavaScript 的魔力,答案是肯定的:

    http://jsfiddle.net/nallenscott/WtQjY/41/

    稻草人:

    <body>
        <section>
            <article>
                <header></header>
                <div class="blurheader"></div>
    
                <!-- content-->
    
            </article>
        </section>
    </body>
    

    您需要jQueryStackblurhtml2canvas

    1. 复制内容区域并将其转换为画布。

    2. 将画布移动到页眉。

    3. 将内容的滚动与标题中的画布同步。

      html2canvas 创建画布,Stackblur 在画布上创建高斯模糊,header 元素叠加在.blurheader div 上以模拟半透明。

    如果您熟悉 JavaScript,那么这可能值得进一步研究。它支持最新版本的 IE、Chrome、Safari 和 Firefox,并为旧版浏览器提供优雅的回退选项。

    干杯。

    【讨论】:

    • 我真的很喜欢这个解决方案,但是当我添加一些具有实际 src 属性的图像时,它就中断了。有任何想法吗? JSfiddle
    • @Matt,您所看到的是画布中关于跨域图像的限制的结果。带有数据 URI 的图像之所以有效,是因为它本地存储在 DOM 中。没有代理的帮助,html2canvas 无法读取跨域内容。谷歌“html2canvas 代理”的例子。另请参阅 html2canvas Docs - LimitationsHTML5 Rocks: Using CORS - CORS w/ images
    • 工作得很好,但如果考虑调整大小,则需要额外的工作(并且需要额外的性能)。仍然,令人印象深刻的解决方案!
    • 我无法在此处向实际标题添加任何内容,例如标题或某些按钮。文档加载完成后,元素立即消失在磨砂玻璃后面,并且变得模糊。这对我来说有点破坏标题的全部目的......
    【解决方案2】:

    现在是 2015 年,Apple 发布了支持新 CSS 功能 backdrop-filter 的 Safari 9。在 div 上使用此 CSS 规则仅将过滤器应用于其后面的元素:

    #myDiv {
        backdrop-filter: blur(10px);
    }
    

    此功能目前仅在 Safari 中可用(并且需要 -webkit 前缀才能使用),所以我现在不建议使用它。如果这样做,请务必使用@supports 或/和 JS 为尚不支持它的浏览器实现回退:

    @supports (backdrop-filter: blur(10px)) {
        #myDiv { background: #181818; }
    }
    

    这是compatibility table at caniuse.com,以及ChromiumFirefox 功能请求。

    详细了解what's new in Safari

    【讨论】:

      【解决方案3】:

      不,你仍然不能模糊某物下面的内容,你需要模糊元素本身。

      你要找的答案就在这个问题Blur Img's & Div's in HTML using CSS

      【讨论】:

        【解决方案4】:

        这真的很难。现在你不能像 iOS 那样做,因为你可以模糊或不模糊元素。你不能只模糊它的一部分。

        您可以在其他元素上使用 Webkit 的模糊过滤器,但这还不够好。

        一个很好的使用方法是:

        *:not(.unblurred) {
         -webkit-filter: blur(1px);
        }
        

        但这并不是在几乎所有情况下都非常理想。

        CSS 自定义着色器可能很有前途,也许使用 -moz-element 作为背景,但现在的答案基本上是“运气不好”。

        在 Firefox 中尝试http://iamvdo.me/conf/2012/kiwiparty/#/33(单击任意位置)以查看 -moz-element 效果。还不错,但是支持有限,而且很慢。

        http://codepen.io/simurai/pen/dFzxL 展示了一个不错的演示,但依赖于提前知道背景图像。

        http://webdirections.org/demos/translucency/index.html 是另一个演示,一点也不差。教程是http://www.webdirections.org/blog/creating-ios-7-effects-with-css3-translucency-and-transparency/

        【讨论】:

        • 谢谢。如果我有一个半透明的背景固定标题并且绝对定位在它的后面半透明的固定标题并应用了 webkit 过滤器模糊。这也会模糊其背后的内容吗?
        • 不太确定我的想象是否正确,但简短的版本是,唯一会变得模糊的是具有 blur 属性的东西。通过它们的东西并没有模糊。你所描述的听起来是正确的。尝试制作并在这里为未来的人发帖!
        【解决方案5】:

        没有 的方法是:

        1. 创建包含部分阻塞元素的子树的深层克隆。
        2. 模糊克隆并将其放置在原始子树的顶部。
        3. 将克隆剪辑到阻塞元素。
        4. 将原始子树剪辑到阻塞元素之外的区域(使用剪辑路径)。

        我正在试验这种方法here。执行此操作的代码主要是here

        一些缺点是:

        1. 如果您更改元素的可见性或修改 DOM,则必须更新克隆。
        2. 它会使滚动有点慢。
        3. 部分被阻止的元素的克隆必须具有相同的样式才能正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-05
          • 2018-10-02
          • 1970-01-01
          相关资源
          最近更新 更多