Bootstrap Modal遮罩弹出层(完整版)
之前发表过一篇文章叫BootstrapModal弹窗代码,其实那个只是一个弹出层代码而已,并不是仿造Bootstrap的,Bootstrapmodal是给外层添加固定fixed,然后内容使用自适应靠上居中方式。今天分享的这篇文章正是这种方式。
html结构
考虑到内容区域需要居中对齐,所以至少要有一个div来定位和显示背景,再用一个div居中内容,内容区域想分成header、body和footer。
<divclass="rs-dialog"id="myModal1"> <divclass="rs-dialog-box"> <aclass="close"href="#">×</a> <divclass="rs-dialog-header"> <h3>标题</h3> </div> <divclass="rs-dialog-body"> <p>内容</p> </div> <divclass="rs-dialog-footer"> <inputtype="button"class="close"value="Close"style="float:right"> </div> </div> </div>
添加样式
透明背景用background和opacity来实现,也可以选择rgba,只是IE8及以下浏览器不支持。为了让一个position为fixed的div铺满整个窗口,可以将其top、right、left、bottom属性全部设为0。
当内容区域过长时,模拟浏览器纵向滚动条,方法是将body(或HTML)的overflow属性设为hidden,禁止浏览器真正的滚动条出现,然后给弹窗最外层的div设置overflow-y:auto,用这个div的滚动条模拟浏览器滚动条。
弹窗打开关闭时滚动效果用css3transition来实现。
.dialog-open{
overflow-y:hidden!important;
}
.rs-overlay{
background:#000;
opacity:.5;
filter:alpha(opacity=50);
position:fixed;
z-index:1000;
top:0;
bottom:0;
left:0;
right:0;
display:none;
}
.rs-dialog{
display:none;
opacity:0;
overflow:hidden;
position:fixed;
top:0;
bottom:0;
left:0;
right:0;
z-index:1040;
-webkit-overflow-scrolling:touch;
outline:0;
/*background:rgba(0,0,0,.5);*/
-webkit-transition:opacity.15slinear;
-o-transition:opacity.15slinear;
transition:opacity.15slinear;
}
.dialog-open.rs-dialog{
overflow-x:hidden;
overflow-y:auto;
}
.rs-dialog.in{
opacity:1;
}
.rs-dialog.rs-dialog-box{
-webkit-transform:translate(0,-25%);
-ms-transform:translate(0,-25%);
-o-transform:translate(0,-25%);
transform:translate(0,-25%);
-webkit-transition:-webkit-transform0.3sease-out;
-o-transition:-o-transform0.3sease-out;
transition:transform0.3sease-out;
}
.rs-dialog.in.rs-dialog-box{
-webkit-transform:translate(0,0);
-ms-transform:translate(0,0);
-o-transform:translate(0,0);
transform:translate(0,0);
}
.rs-dialog.rs-dialog-box{
position:relative;
margin:30pxauto;
width:600px;
background-color:#ffffff;
border-radius:10px;
border:1pxsolid#999999;
border:1pxsolidrgba(0,0,0,0.2);
-webkit-box-shadow:03px9pxrgba(0,0,0,0.5);
box-shadow:03px9pxrgba(0,0,0,0.5);
}
.logged-in.rs-dialog.rs-dialog-box{
margin-top:60px;
}
.rs-dialog-boxa.close{
position:absolute;
top:-12px;
right:-12px;
width:25px;
height:25px;
padding:0;
line-height:25px;
font-size:20px;
font-family:Arial,sans-serif;
font-weight:bold;
text-decoration:none;
text-align:center;
text-shadow:01px0#ffffff;
color:#fff;
background-color:#8b8b8b;
border:2pxsolid#fff;
border-radius:25px;
box-shadow:003px1px#999;
outline:none;
}
.rs-dialog-boxa.close:hover{
background-color:#444;
}
.rs-dialog-header{
padding:20px;
border-bottom:1pxsolid#e5e5e5;
}
.rs-dialog-headerh3{
font-size:18px;
}
.rs-dialog-body{
padding:20px;
line-height:1.4
}
.rs-dialog-bodyp{
margin-bottom:10px;
}
.rs-dialog-footer{
padding:20px;
border-top:1pxsolid#e5e5e5;
overflow:hidden;
}
@media(max-width:767px){
.rs-dialog.rs-dialog-box{
width:auto;
margin:30px20px;
}
}
添加控制脚本
大部分用css实现,所以脚本通过简单的addClass和removeClass就可以控制开关。
还可以增加点击弹窗外部关闭窗口的功能。
jQuery(document).ready(function($){
$('body').append('<divclass="rs-overlay"/>');
$("a[rel='rs-dialog']").each(function(){
vartrigger=$(this);
varrs_dialog=$('#'+trigger.data('target'));
varrs_box=rs_dialog.find('.rs-dialog-box');
varrs_close=rs_dialog.find('.close');
varrs_overlay=$('.rs-overlay');
if(!rs_dialog.length)returntrue;
//Opendialog
trigger.click(function(){
//Getthescrollbarwidthandavoidcontentbeingpushed
varw1=$(window).width();
$('html').addClass('dialog-open');
varw2=$(window).width();
c=w2-w1+parseFloat($('body').css('padding-right'));
if(c>0)$('body').css('padding-right',c+'px');
rs_overlay.fadeIn('fast');
rs_dialog.show('fast',function(){
rs_dialog.addClass('in');
});
returnfalse;
});
//Closedialogwhenclickingontheclosebutton
rs_close.click(function(e){
rs_dialog.removeClass('in').delay(150).queue(function(){
rs_dialog.hide().dequeue();
rs_overlay.fadeOut('slow');
$('html').removeClass('dialog-open');
$('body').css('padding-right','');
});
returnfalse;
});
//Closedialogwhenclickingoutsidethedialog
rs_dialog.click(function(e){
rs_close.trigger('click');
});
rs_box.click(function(e){
e.stopPropagation();
});
});
});
防止网页内容偏移
打开弹窗时给body增加overflow:hidden属性,导致滚动条消失,这时会使网页的内容往右移动一下,待弹窗打开滚动条再出现时,又会复原,视觉效果不友好。如果在有滚动条的情况下知道其宽度,给body增加padding-right属性就可以抵消这个便宜效果。
触发弹窗
最后,根据上面的脚本,触发弹窗的链接如下
<ahref="#"rel="rs-dialog"data-target="myModal">LaunchDemoModal</a>
rel="rs-dialog"表示这是弹窗触发链接
data-target="myModal"表示要打开HTMLID为myModal的弹窗。