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 相关文章推荐
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
JavaScript按位运算符的应用简析
Feb 04 Javascript
jQuery解析XML文件同时动态增加js文件的方法
Jun 01 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
原生javascript实现图片无缝滚动效果
Feb 12 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
Jun 02 Javascript
Bootstrap列表组学习使用
Feb 09 Javascript
防止重复发送 Ajax 请求
Feb 15 Javascript
一文让你彻底搞清楚javascript中的require、import与export
Sep 24 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
Oct 30 Javascript
countup.js实现数字动态叠加效果
Oct 17 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python os模块介绍
2014/11/30 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
python实现任意位置文件分割的实例
2018/12/14 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
医学院校毕业生自荐信范文
2014/01/01 职场文书
离婚财产处理协议书
2014/09/30 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python