Bootstrap Modal遮罩弹出层(完整版)


Posted in Javascript onNovember 21, 2016

之前发表过一篇文章叫Bootstrap Modal弹窗代码,其实那个只是一个弹出层代码而已,并不是仿造Bootstrap的,Bootstrap modal是给外层添加固定fixed,然后内容使用自适应靠上居中方式。今天分享的这篇文章正是这种方式。

html结构

考虑到内容区域需要居中对齐,所以至少要有一个div来定位和显示背景,再用一个div居中内容,内容区域想分成header、body和footer。

<div class="rs-dialog" id="myModal1">
<div class="rs-dialog-box">
<a class="close" href="#">×</a>
<div class="rs-dialog-header">
<h3>标题</h3>
</div>
<div class="rs-dialog-body">
<p>内容</p>
</div>
<div class="rs-dialog-footer">
<input type="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的滚动条模拟浏览器滚动条。

弹窗打开关闭时滚动效果用css3 transition来实现。

.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 .15s linear;
-o-transition: opacity .15s linear;
transition: opacity .15s linear;
}
.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-transform 0.3s ease-out;
-o-transition: -o-transform 0.3s ease-out;
transition: transform 0.3s ease-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:30px auto;
width: 600px;
background-color: #ffffff;
border-radius:10px;
border: 1px solid #999999;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
}
.logged-in .rs-dialog .rs-dialog-box{
margin-top:60px;
}
.rs-dialog-box a.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: 0 1px 0 #ffffff;
color: #fff;
background-color:#8b8b8b;
border:2px solid #fff;
border-radius: 25px;
box-shadow:0 0 3px 1px #999;
outline: none;
}
.rs-dialog-box a.close:hover{
background-color:#444;
}
.rs-dialog-header{
padding: 20px;
border-bottom: 1px solid #e5e5e5;
}
.rs-dialog-header h3{
font-size: 18px;
}
.rs-dialog-body{
padding: 20px;
line-height: 1.4
}
.rs-dialog-body p{
margin-bottom:10px;
}
.rs-dialog-footer{
padding: 20px;
border-top:1px solid #e5e5e5;
overflow: hidden;
}
@media (max-width: 767px) {
.rs-dialog .rs-dialog-box {
width: auto;
margin: 30px 20px;
}
}

添加控制脚本

大部分用css实现,所以脚本通过简单的addClass和removeClass就可以控制开关。

还可以增加点击弹窗外部关闭窗口的功能。

jQuery(document).ready(function($){
$('body').append('<div class="rs-overlay" />');
$("a[rel='rs-dialog']").each(function(){
var trigger = $(this);
var rs_dialog = $('#' + trigger.data('target'));
var rs_box = rs_dialog.find('.rs-dialog-box');
var rs_close = rs_dialog.find('.close');
var rs_overlay = $('.rs-overlay');
if( !rs_dialog.length ) return true;
// Open dialog
trigger.click(function(){
//Get the scrollbar width and avoid content being pushed
var w1 = $(window).width();
$('html').addClass('dialog-open');
var w2 = $(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');
});
return false;
});
// Close dialog when clicking on the close button
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', '');
});
return false;
});
// Close dialog when clicking outside the dialog
rs_dialog.click(function(e){
rs_close.trigger('click');
});
rs_box.click(function(e){
e.stopPropagation();
});
});
});

防止网页内容偏移

打开弹窗时给body增加overflow:hidden属性,导致滚动条消失,这时会使网页的内容往右移动一下,待弹窗打开滚动条再出现时,又会复原,视觉效果不友好。如果在有滚动条的情况下知道其宽度,给body增加padding-right属性就可以抵消这个便宜效果。

触发弹窗

最后,根据上面的脚本,触发弹窗的链接如下

<a href="#" rel="rs-dialog" data-target="myModal">Launch Demo Modal</a>

rel="rs-dialog"表示这是弹窗触发链接

data-target="myModal"表示要打开HTML ID为myModal的弹窗。

Javascript 相关文章推荐
国外的为初学者写的JavaScript教程
Jun 09 Javascript
学习从实践开始之jQuery插件开发 对话框插件开发
Apr 26 Javascript
javascript实现base64 md5 sha1 密码加密
Sep 09 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
js仿微信公众平台打标签功能
Apr 08 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
js移动端事件基础及常用事件库详解
Aug 15 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
vue 实现 rem 布局或vw 布局的方法
Nov 13 Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 Javascript
npm全局环境变量配置详解
Dec 15 Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 #Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 #Javascript
js学习之----深入理解闭包
Nov 21 #Javascript
浅谈js原生拖放
Nov 21 #Javascript
weUI应用之JS常用信息提示弹层的封装
Nov 21 #Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
Nov 21 #Javascript
JS中判断null的方法分析
Nov 21 #Javascript
You might like
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
买房子个人收入证明
2014/01/16 职场文书
文明倡议书范文
2014/04/15 职场文书
相亲大会策划方案
2014/06/05 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
文案策划岗位职责
2015/02/11 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
《学会看病》教学反思
2016/02/17 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
React更新渲染原理深入分析
2022/12/24 Javascript