js实现类bootstrap模态框动画


Posted in Javascript onFebruary 07, 2017

在pc端开发,模态框是一个很常用的插件,之前一直用的第三方插件,比如bootstrap,jQuery的模态框插件,最近还用了elementUI的。但是会发现其实动画效果都差不多,那么如何去实现这样一个动画效果呢?

模态框的构成

 常见的模态框的结构我们很容易就可以看出,一个遮罩层,还有内容区。内容区主要是头部(包括标题,关闭按钮)和body部分(body中常常会有确认和取消按钮)。

布局

 1.背景要充满全屏,而且如果页面有滚动,当模态框弹出的时候是无法滚动的;
 2.内容区要水平居中显示,至于垂直方向看设计喽;
 3.模态框出现是渐渐显示出来,而且从顶部滑下;

实现

 遮罩使用最外层元素占满全屏(position:fixed;),并设置背景色不透明度(rgba(0,0,0,0.5))。
 水平居中有很多方式,这里使用

margin:30px auto;

重点介绍下关于模态框动画的实现

 关于渐渐显示使用opacity就可以,而从顶部滑下使用translate也很容易实现。这么看来,很容易做嘛,只需要改变classname就可以了。
html

<input type="button" value="click" id="btn">
<div class="modal" id="modal">
  <div class="dialog">
    <header class="dialog-header">
      <h3>this is dialog title</h3>
      <span id="close">×</span>
    </header>
    <div class="dialog-content">
      this is dialog content
     </div>
   </div>
</div>

style

.modal{
    position:fixed;
    left:0;
    right:0;
    top:0;
    bottom:0;
    background-color:rgba(0,0,0,0.5);
    display:none;
    z-index:1050;
    opacity:0;
    transition: all .5s ease-out 0s;
  }
  .dialog{
    width:500px;
    height:300px;
    position:relative;
    box-shadow:0 5px 15px rgba(0,0,0,.5);
    border-radius:10px;
    background-color:#fff;
    margin:30px auto;
    transform: translate(0,-40%);
    -webkit-transform: translate(0,-40%);
    transition: all .5s ease-out 0s;
  }
  .dialog-header{
    box-sizing:border-box;
    border-bottom:1px solid #ccc;
  }
  .dialog-header h3,.dialog-header span{
    display:inline-block;
  }
  .dialog-header span{
    float:right;
    margin-right:10px;
    overflow: hidden;
    line-height:58px;
    cursor:default;
    font-size:18px;
  }
  .in{
    opacity: 1;
  }
  .in .dialog{
    transform: translate(0,0);
    -webkit-transform: translate(0,0);
  }

js

var oBtn = document.getElementById("btn");
var oModal = document.getElementById("modal");
var oClose = document.getElementById("close");
oBtn.addEventListener("click", function(){
  oModal.style.display = "block";
  oModal.className = "modal in";
});
oClose.addEventListener("click", function(){
  oModal.style.display = "none";
  oModal.className = "modal";
});

是不是看起来很容易,运行之后,诶?并没有我们所希望看到的动画效果,这是为什么呢?当我们点击按钮的时候不是已经把动画加上了么?

其实仔细想想,点击按钮改变classname的时候,是一下子把元素display和动画属性全都加上了,当模态框显示出来的时候动画也随着完成了,就类似于打开一个html页面一样,页面元素的css属性都在页面渲染的时候发挥了作用。而我们在页面直接去触发一个已经显示出来的元素动画的时候是有效的。所以我们需要把元素显示和动画分开来做。

这里我做了一个异步操作(setTimeout)。

oModal.style.display = "block";
  var timer = setTimeout(function(){
    oModal.className = "modal in";
    clearTimeout(timer);
  },0);

元素显示出来之后在给它加动画效果,这样就可以实现我们所期望的动画效果了。
所有代码在github上https://github.com/Stevenzwzhai/plugs/tree/master/dialog,在这个项目下有多个js的常用插件,欢迎点赞。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
AJAX的跨域与JSONP(为文章自动添加短址的功能)
Jan 17 Javascript
JavaScript 题型问答有答案参考
Feb 17 Javascript
jquery remove方法应用详解
Nov 22 Javascript
jquery 获取表单元素里面的值示例代码
Jul 28 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
node.js中的console.error方法使用说明
Dec 10 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
基于jQuery的ajax方法封装
Jul 14 Javascript
js实现动态显示时间效果
Mar 06 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
jQuery设置图片等比例缩小的方法
Apr 29 jQuery
浅析vue中的MVVM实现原理
Mar 04 Javascript
canvas实现探照灯效果
Feb 07 #Javascript
javascript数据类型详解
Feb 07 #Javascript
JS简单获取当前年月日星期的方法示例
Feb 07 #Javascript
vuejs指令详解
Feb 07 #Javascript
fullCalendar中文API官方文档
Feb 07 #Javascript
JS常用倒计时代码实例总结
Feb 07 #Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 #Javascript
You might like
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python打开文件并获取文件相关属性的方法
2015/04/23 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Python适配器模式代码实现解析
2019/08/02 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Python中对象的比较操作==和is区别详析
2021/02/12 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
建设工程授权委托书
2014/09/22 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
行政介绍信范文
2015/05/04 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers