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 25 Javascript
javascript面向对象编程代码
Dec 19 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
JS实现单行文字不间断向上滚动的方法
Jan 29 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
详解javascript传统方法实现异步校验
Jan 22 Javascript
jQuery的文档处理程序详解
May 10 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 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高自定义性安全验证码代码
2011/11/27 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
python基础教程之lambda表达式使用方法
2014/02/12 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
高级运动鞋:GREATS
2019/07/19 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
给分销商的致歉信
2014/01/14 职场文书
高考寄语大全
2014/04/08 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
政审证明范文
2015/06/19 职场文书
英语导游欢迎词
2015/09/30 职场文书