目前的模态对话框是这样实现的:
点击按钮, 在document.body
下添加半透明黑色背景和模态对话框
除了这个模态对话框之外页面里还有些其他内容, 比如上图中的那两个article
现在的需求是: 在模态对话框弹出时, 使页面中的其他内容应用-webkit-filter:blur()
的CSS属性, 而模态对话框本身不受该样式的影响
问题的关键在于希望开发一个通用的模态对话框函数, 使其在任何页面上都能模糊页面上的其它元素(除了模态对话框本身).
除了写JS, 有没有什么简单的办法来达到这个(选择器的)效果呢?
已经解决 感谢回答者提供的关于CSS选择器的思路
//apply animation
setTimeout(function(){
//选择document.body下所有非.shade class的第一级元素
var others = document.querySelectorAll('body > *:not(.shade)');
//遍历nodeList, 如果该元素不是script, 则给该元素添加滤镜
[].forEach.call(others, function(elem){
if(elem.nodeName != 'SCRIPT'){
elem.style.webkitFilter = 'blur(6px)';
}
})
//模态对话框本身的动画效果
prompt.style.opacity = 1;
prompt.style.padding = 0;
}, 50);
模态对话框的移除也类似, 只不过这次模态对话框已经被移除, 所以直接选择document.body
下的第一级元素就好
function modualRemoval(){
document.body.removeChild(shade);
var others = document.querySelectorAll('body > *');
[].forEach.call(others, function(elem){
if(elem.nodeName != 'SCRIPT'){
//去除模糊效果
elem.style.webkitFilter = '';
}
});
}
巴扎黑2017-04-11 12:08:18
不要直接给 body
元素设置 -webkit-filter: blur
例如你的弹窗 class
为 .layer-modal
那么你可以这么写 css
Style:
body.blur > *:not(.layer-modal){
-webkit-filter: blur(6px);
overflow: hidden;
}
HTML:
<body class="blur">...</body>
怪我咯2017-04-11 12:08:18
利用 positon: fixed;
和 z-index
,下面的例子随手写的,最上层先后放置,就没管 z-index
,其次还要注意滚动条等,可以去看下 bootstrap 的 modal 和 modal-dropback 的代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style>
.cover {position: fixed; width: 100%; height: 100%; background: #ccc; filter: alpha(opacity=50); opacity: .5;}
.modal {position: fixed; width: 100%; height: 100%;}
.modal-content {width: 100px; height: 100px; background: #fff; margin: 100px auto; margin-bottom: 0; border: 1px solid red;}
</style>
</head>
<body>
<p class="cover">
</p>
<p class="modal">
<p class="modal-content">
lsdjflsdfsldfsdf<br/>
lsjflsdfjlsfd
</p>
</p>
lsjflsjdfljsdfljsldfjsldfjs
lsdfjlsjdflsjdf<br/>
lsfjlsdfjlsjdflsdfj
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
lsjflsfjlsjdflsjdfljsl
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
lsjlfjslfjsldf
</body>
</html>