javascript - 如何使用 CSS(和 JavaScript?)创建模糊的 "frosted"背景?

标签 javascript html css webkit

我正在尝试使用 HTML5、CSS3 和 JavaScript 创建可在 webkit 浏览器上运行的 iOS 7 风格的磨砂外观。

从技术上讲,给定以下 HTML:

<style>
  #partial-overlay {
    width: 100%;
    height: 20px;
    background: rgba(255, 255, 255, .2); /* TODO frost */
    position: fixed;
    top: 0;
    left: 0;
  }
</style>
<div id="main-view">
  <div style="width: 50px; height: 50px; background: #f00"></div>
  To my left is a red box<br>
  Now there is just text<br>
  Text that goes on for a few pixels <br>
  or even more
</div>
<div id="partial-overlay">
  Here is some content
</div>

我想将 -webkit-filter: blur(5px) 之类的东西应用到 #main-view 的前 20px 水平位置。

如果CSS被修改为#partial-overlay { width: 20px;高度:100%; ...} 然后我需要将 -webkit-filter: blur(5px) 垂直应用到前 20px。

显而易见的解决方案是使用 javascript 复制 #main-view,设置 overflow: hidden 然后适本地更改宽度/高度,但是在我看来很难推广到更复杂的页面/CSS 结构。

有没有更好的方法来实现这一点,同时最大限度地降低性能和提高通用性?

编辑:这是我正在努力实现的示例: Mockup

最佳答案

感谢您的启发...它让我想到了这个 canvas plugin哪个有用

新增和改进:-webkit- and Firefox Working Example ,现在可调整大小/流畅。

JS

$(document).ready(function () {
    frost = function () {
        var w = $('#main-view').width();
        html2canvas(document.body, {
            onrendered: function (canvas) {
                document.body.appendChild(canvas);
                $('canvas').wrap('<div id="contain" />');
            },
            width: w,
            height: 30
        });
        $('canvas, #partial-overlay, #cover').hide();
        $('#cover').fadeIn('slow', function () {
            $('#partial-overlay').fadeIn('slow');
        });
    };

    $('body').append('<div id="cover"></div><svg id="svg-image-blur"><filter id="blur-effect-1"><feGaussianBlur stdDeviation="2"/></filter></svg>');

    $('#main-view').click(function () {
        frost();
        $('#partial-overlay').addClass('vis');
        $(window).resize(function () {
            $('canvas, #partial-overlay, #cover').hide();
        });

        function onResize() {
            if ($('#partial-overlay').hasClass('vis')) {
                frost();
            }
        }
        var timer;
        $(window).bind('resize', function () {
            timer && clearTimeout(timer);
            timer = setTimeout(onResize, 50);
        });

    });

    $('#partial-overlay').click(function () {
        $('#partial-overlay').removeClass('vis');
        $('canvas, #partial-overlay, #cover').hide();
    });
});

CSS

#main-view {
    width:75%;
    height:50%;
    box-sizing: border-box;
    margin:8px;
}
#partial-overlay {
    display:none;
    width: 100%;
    height: 20px;
    position: absolute;
    top: 0;
    left: 0;
    z-index:99;
    background: rgba(255, 255, 255, 0.2);
    cursor:pointer;
}
canvas {
    position: absolute;
    top: 0;
    left: 0;
    -webkit-filter:blur(5px);
    filter: url(#blur-effect-1);
}
#cover {
    display:none;
    height:19px;
    width:100%;
    background:#fff;
    top:0;
    left:0;
    position:absolute;
}
#contain {
    height:20px;
    width:100%;
    overflow:hidden;
    position:absolute;
    top:0;
    left:0;
}
svg {
    height:0;
    width:0;
}

HTML

<div id="main-view">
    <div style="width: 10%; height: 20%; background: #f00; float: left"></div>To my left is a red box
    <br>Now there is just text
    <br>Text that goes on for a few pixels
    <br>or even more</div>
<div id="partial-overlay">Here is some content</div>

我将它放在点击功能中,因为我认为这是最有可能的用例。它在准备好文档时同样有效。

虽然 Canvas 表示不会是像素完美的,但我认为在大多数情况下它并不重要,因为它被模糊了。

更新:根据要求,现在可以重新调整大小。我还将封面 div 移到了 JS 中,并为 Firefox 添加了 svg 回退。调整大小需要在每次调整大小时重新绘制 Canvas ,因此我将其设置为在调整大小时隐藏 Canvas 、覆盖层等,然后在调整大小停止时替换它。

关于javascript - 如何使用 CSS(和 JavaScript?)创建模糊的 "frosted"背景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17092299/

相关文章:

javascript - 如何从 webpack.config.js 文件访问环境变量?

javascript - 将 javascript 对象作为参数传递给函数 - typescript 等效

javascript - 当输入值以编程方式更改时触发更改事件?

php - 从表中的数据库中打印出行

javascript - 显示未定义的 js 函数的控制台日志

javascript - Bootstrap Carousel 不适用于 AngularJS

javascript - 为什么 jQuery 在 keydown 时不能正常运行?

HTML 电子邮件背景图片不显示全宽

html - 图像按比例填充 div 而不使用背景大小 : cover or object-fit: cover

css - CSS 中的边框与填充