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 相关文章推荐
javascript判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
JS版网站风格切换实例代码
Oct 06 Javascript
JavaScript和JQuery实用代码片段(一)
Apr 07 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
Javascript字符串对象的常用方法简明版
Jun 26 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
Jun 13 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
Jan 10 Javascript
jQuery中将json数据显示到页面表格的方法
May 27 jQuery
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
Canvas三种动态画圆实现方法说明(小结)
Apr 16 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
koa2实现登录注册功能的示例代码
2018/12/03 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
python的exec、eval使用分析
2017/12/11 Python
基于python绘制科赫雪花
2018/06/22 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
简单介绍django提供的加密算法
2019/12/18 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
家长通知书家长评语
2014/04/17 职场文书
共青团员自我评价
2015/03/10 职场文书
七年级作文之冬景
2019/11/07 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle
Oracle使用别名的好处
2022/04/19 Oracle