Bootstrap模态框原理分析及问题解决
最近自学了bootstrap觉得里面模板样式挺好的,就想自己实现实现,不多说了,开始进入正题了
今天就来实现bootstrap里面的模态框弹出效果
首先很简单 实现一个类似于panel的modal
1 <body>
2 <button type="button" class="btn btn-default" style="display: block;margin: 20px auto;">Click me!</button>
3 <div class="chw-dialog">
4 <div class="chw-modal">
5 <div class="chw-title">
6 <button type="button" class="close">
7 <span>×</span>
8 </button>
9 <h4>chw-Modal title</h4>
10 </div>
11 <div class="chw-content">
12 <p>fantasy baby</p>
13 </div>
14 <div class="chw-footer">
15 <button class="btn btn-info">Save changes</button>
16 <button class="btn btn-default">Close</button>
17 </div>
18 </div>
19 </div>
20 <!-- <script src="js/jquery-1.11.1.js"></script>
21 <script src="js/bootstrap.min.js"></script> -->
22 </body>
然后完成他的css
.chw-dialog {
display: none;
position: fixed;
top:0;
right: 0;
bottom: 0;
left: 0;
z-index: 1100;
opacity: 0;
transition : opacity .15s linear;
}
.chw-modal{
width: 600px;
margin: 30px auto;
box-shadow: 0 5px 10px rgba(0,0,0,.5);
border-radius: 6px;
border: 1px solid rgba(0,0,0,.5);
z-index: 1200;
background-color: white;
transform: translate(0,-25%);
transition: transform 0.3s ease-out;
}
.chw-panel{
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1024;
background-color: black;
opacity: 0;
transition : opacity .15s linear;
}
.chw-title{
padding:15px;
border-bottom: 1px solid #dddddd;
}
.chw-title h4{
line-height: 1.4;
font-size: 23px;
margin: 0;
}
.chw-content{
padding:15px;
border-bottom: 1px solid #dddddd;
}
.chw-footer{
padding: 15px;
clear: both;
overflow: hidden;
}
.chw-footer button{
float: right;
margin-right: 10px;
}
</style>
好了不多说开始重点部分,先看看bootstrap的源代码,点击button后

发现有一个后面有一个蒙层 看见myModa和其子元素都没有background-color和opacity结合使用的,说明这个蒙层不是myModal生成的,那这个蒙层是怎么生成的?
我把myModal的类全部删除后(剔除css样式)发现蒙层还在,从而更加确信了我的猜测,然后用chrome去获取蒙层 发现 这个蒙层在整个html最下面。

那为什么一开始没有索取到这个元素能,因为z-index的效果 这个蒙层div(z-index:1040;)在modal类的下面(z-index:1050;)退出后,这个蒙层div就没有了,说明通过js添加
好了在清楚大体css结构的时候我们自己来写一个类似的弹出功能 点击按钮,js生成蒙层 你的modal 点击周围或者退出按钮时 蒙层删除 modal隐藏。
1 <script>
2 $("body>button").on('click',function () {
3 var temp = "<div class='chw-panel'></div>";
4 $("body").append(temp);
5 $(".chw-dialog").css("display","block");
6 setTimeout(function(){//后续会说明setTimeout
7 $(".chw-panel").css("opacity","0.5");
8 $(".chw-dialog").css("opacity","1");
9 $(".chw-modal").css( "transform","translate(0,0)");
10 },1);
11 });
12 $('.chw-dialog').on('click',function(){
13 debugger;
14 $(".chw-panel").css("opacity","0");
15 $(".chw-dialog").css("opacity","0");
16 $(".chw-modal").css( "transform","translate(0,-25%)");
17 setTimeout(function () {
18 $(".chw-dialog").hide();
19 $(".chw-panel").remove();
20 },1);
21 });
22 $(".chw-modal").click(function (e) {
23 e.stopPropagation();
24 return false;
25 });
26 $(".close").click(function () {
27 $(".chw-panel").css("opacity","0");
28 $(".chw-dialog").css("opacity","0");
29 $(".chw-modal").css( "transform","translate(0,-25%)");
30 setTimeout(function () {
31 $(".chw-dialog").hide();
32 $(".chw-panel").remove();
33 },1);
34
35 });
36 </script>
首先我是先完成大概功能即点击按钮显示然后退出没有考虑动画,在实现的时候发现了几个问题:
1.点击按钮后生成蒙层没有问题,但是点击modal以外部分没有退出,没有任何反应。(这个问题是因为在实现蒙层的点击生成退出的时候发现的,但实际上是点击chw-dialog来关闭的因为他的 z-index高于那个蒙层div的z-index)
解决方法:使用$.on(),jquery版本1.7+
因为我原来写的函数是$('.chw-panel').click(function(){})无论怎么点击那个蒙层也不会触发函数,查阅资料后发现,我们在给动态添加的标签绑定事件的时候(给通过append添加过来的标签<span class=”test”></span>),不能直接写$(‘.test’).click(function(){});是因为jquery他的事件机制是当页面完全加载成功后,会根据所有目前页面上符合要求的dom添加事件标示,这样当你触发事件的时候,拥有该事件标示的DOM就会给予响应。但append很可能是页面加载完成后,再触发的事件,这样的话,初始化的时候就没有成功加上,所以你不能简单的使用click需要用on,$(“body”).on(‘click’,’.test’,function(){});由于事件的冒泡机制(如果子事件没有完成(没有定义子事件的处理函数)或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)举个例子我有个子事件没有被处理,那么他会传递到他的父级看看父级是否能解决,如果不能继续向上级传递直到解决为止)$(“body”).on(‘click’,’.test’,function(){});这个表明是body这个对象绑定事件,如果body的子元素.test的div触发了点击事件,因为.test没有绑定事件(通过append添加的div),那么他要向上传递,当传递到body的时候,body通过jquery知道是哪个子元素触发了函数,如果这个子元素刚好和自己选择的元素一致的话就执行函数。如果这样写$(“body”).on(‘click’,function(){});表明只要他的子元素触发事件都会执行函数,就像点击了body触发函数一样,然而实际是子元素触发事件传递到body执行函数
2.无论点击哪个地方都会退出
解决方法:使用stopPropagation()
如果我没有加红色的那段代码时,发现点击按钮后,无论我点击哪个地方都会退出,这和我们的预期不一样啊,他应该是点击modal以外的部分退出。怎么会出现这样的情况呢?因为我的.chw-modal是.chw-dialog的子元素,在定义事件触发函数的时候是这样写的$('.chw-dialog').on('click',function(){});由于事件的冒泡机制,无论你点击.chw-dialog的任何子元素,在这些子元素没有绑定函数的前提下,你的子元素都会执行.chw-dialog绑定的函数
在实现弹出退出后,添加延迟来实现动画过度
1 .chw-dialog {
2 display: none;
3 position: fixed;
4 top:0;
5 right: 0;
6 bottom: 0;
7 left: 0;
8 z-index: 1100;
9 opacity: 0;
10 transition : opacity .15s linear;
11 }
12 .chw-modal
13 {
14 width: 600px;
15 margin: 30px auto;
16 box-shadow: 0 5px 10px rgba(0,0,0,.5);
17 border-radius: 6px;
18 border: 1px solid rgba(0,0,0,.5);
19 z-index: 1200;
20 background-color: white;
21 transform: translate(0,-25%);//初始div位置
22 transition: transform 0.3s ease-out;
23 }
24 .chw-panel
25 {
26 position: fixed;
27 top: 0;
28 left: 0;
29 right: 0;
30 bottom: 0;
31 z-index: 1024;
32 background-color: black;
33 opacity: 0;
34 transition : opacity .15s linear;
35 }
在初始化位置和定义相应的transition后,接下来就是通过js添加css来触发动画,改变css的时候发现了一个问题,改变css后但是动画没有出现失效了,这是为什么呢?经过自己测试
<div class="test" style="width: 200px;height: 200px;opacity: 0.2;transition:opacity 0.5s linear; "></div> $("button").click(function(){$(".test").css("opacity","1");});
发现可以实现动画效果,那为什么myModal的动画效果没有出来呢,经过查阅资料发现,如果在css中先执行了让display:none;变成block的操作的时候动画不会出现,原因是因为在js中语句几乎是同时执行,所以要想他们之间有个前后运行的效果 有两种办法
1.使用setTimeout来控制css属性值变化
2.使用animate在回调函数里面设置display(不能和transition同时使用)
解决了以上问题后就能做到类似的弹出效果啦是不是很炫~~~~~上面需要引用bootstrap.css
Bootstrap模态框原理分析及问题解决的更多相关文章
- 页面遮罩层,并且阻止页面body滚动。bootstrap模态框原理
实现思路: 1.需要有一个层将body遮住,放在body上方. 2.修改body的overflow属性值为:hidden 废话不多说了,将关键代码贴出来了,兼容火狐,谷歌,ie 遮罩层的样式代码,红色 ...
- Bootstrap, 模态框实现值传递,自动勾选
目录 Bootstrap,模态框自动勾选,值传递 1.父页面 2. 子页面(modal) 模态框 Bootstrap,模态框自动勾选,值传递 场景: 有一个这样的需求, 在父页面有一个table, ...
- js控制Bootstrap 模态框(Modal)插件
js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html
- Bootstrap模态框按钮
1.触发模态框弹窗的代码 这里复制了一段Bootstrap模态框的代码 <h2>创建模态框(Modal)</h2> <!-- 按钮触发模态框 --> <but ...
- 解决bootstrap模态框内输入框无法获取焦点
bootstrap 模态框中的input标签在某些情况下会无法获取焦点. 最终解决方法:去除模态框的 tabindex="-1" 属性即可
- Bootstrap 模态框(Modal)插件
原文链接:http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html Bootstrap 模态框(Modal)插件 模态框(Modal)是覆 ...
- Bootstrap 模态框在用户点击背景空白处时会自动关闭
问题: Bootstrap 模态框在用户点击背景空白处时,会自动关闭. 解决方法: 在HTML页面中编写模态框时,在div初始化时添加属性 aria-hidden=”true” data-backdr ...
- Bootstrap模态框(MVC)
BZ这篇博客主要是为大家介绍一下MVC如何弹出模态框.本文如果有什么不对的地方,希望大神们多多指教,也希望和我一样的小菜多多学习.BZ在这里谢过各位. 首先要在页面加上一个点击事件: @Html.Ac ...
- 去除bootstrap模态框半透明阴影
当使用bootstrap模态框默认自带半透明阴影,如果想要去除阴影,需要怎么做呢? 今天在项目中我遇到了这个问题,想要去除模态框的阴影,试了好久都没解决.后来问同事的时候才知道,当模态框弹出后,会加上 ...
随机推荐
- IE环境表单提交不跳转页面
<head> <base target="_self"></base> </head>
- 浪院长 | spark streaming的使用心得
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/82505159 今天.主要想聊聊spar ...
- centos 安装gitee备忘
centos 安装gitee备忘:安装前需要升级git.需要安装mysql阿里云主机需要把端口加入例外需要修改全局配置文件把localhost改为ip需要设置为后台运行
- Centos7中在线/离线安装DockerCE最新版
Docker在Centos7在线/离线安装 一.在线安装 1.检查系统是否支持,因为Docker 要求 CentOS 系统的内核版本高于 3.10 uname -r 2.确保 yum 包更新到最新 y ...
- ionic 视图滚动到顶部
问题描述 进入页面, 滚动到底部 点击一个连接, 当前视图内容更新了 内容滚动到了上次的位置导致底部的内容没显示 需要控制自动回滚到顶部 <ion-content delegate-handle ...
- RobotFrameWork接口设计规范
1. 前言 继前面一章<RobotFramework环境搭建>介绍了在本地如何将接口自动化实施过程所需要的基础环境搭建好,在这里假设大家都已经知道环境如何搭建了,如果不清楚的可直接查看上一 ...
- 并行排序ShearSort ---[MPI , c++]
思想: (1) 对于一个nxm的数组,使用N个work进行处理. (2) 先按行对数组进行升序和降序排序[由左至右],一般奇数序列work升序,偶数序号的work进行降序 (3)再按列对数组进行升序排 ...
- K-means算法原理
聚类的基本思想 俗话说"物以类聚,人以群分" 聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中.簇内 ...
- service_names配置不正确,导致dg创建失败
service_names配置不正确,导致dg创建失败 伙伴发来消息,创建dg后,主备一直无法进行日志同步. 以下是查看过程 备库的alert日志: 2018-11-13T17:47:36.23129 ...
- [windows+cocos2dx]文本类
文字也是游戏最重要的元素之中的一个,以下就看看使用动态字体和静态字体库怎样创建文字.使用动态字体库创建的文字能够包括经常使用的不论什么字符,一般假设用户要输入名字,这就最好用动态字体库.由于你不知道用 ...