我正在尝试使用 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 结构。
有没有更好的方法来实现这一点,同时最大限度地降低性能和提高通用性?
编辑:这是我正在努力实现的示例:
最佳答案
感谢您的启发...它让我想到了这个 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/