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 相关文章推荐
List Information About the Binary Files Used by an Application
Jun 18 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
Sep 16 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
什么是 AngularJS?AngularJS简介
Dec 06 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
关于JavaScript 原型链的一点个人理解
Jul 31 Javascript
jQuery无缝轮播图代码
Dec 22 Javascript
Three.js实现简单3D房间布局
Dec 30 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 Javascript
JavaScript生成一个不重复的ID的方法示例
Sep 16 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
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中的登陆login
2007/01/18 PHP
php变量范围介绍
2012/10/15 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
js onload事件不起作用示例分析
2013/10/09 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
Django异步任务线程池实现原理
2019/12/17 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
python deque模块简单使用代码实例
2020/03/12 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
C++面试题目
2013/06/25 面试题
电子商务专业推荐信范文
2013/12/02 职场文书
手机被没收检讨书
2014/02/22 职场文书
高效课堂标语
2014/06/26 职场文书
开平碉楼导游词
2015/02/06 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书