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 相关文章推荐
通过 Dom 方法提高 innerHTML 性能
Mar 26 Javascript
使用jquery为table动态添加行的实现代码
Mar 30 Javascript
封装了一个js图片轮换效果的函数
Sep 28 Javascript
JS访问SWF的函数用法实例
Jul 01 Javascript
jquery操作select元素和option的实例代码
Feb 03 Javascript
JavaScript数组复制详解
Feb 02 Javascript
JavaScript实现时间表动态效果
Jul 15 Javascript
vue实现全选和反选功能
Aug 31 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
Sep 28 Javascript
webpack 打包压缩js和css的方法示例
Mar 20 Javascript
jQuery Raty星级评分插件使用方法实例分析
Nov 25 jQuery
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
php array_unique之后json_encode需要注意
2011/01/02 PHP
php实现用户在线时间统计详解
2011/10/08 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
js function使用心得
2010/05/10 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
antd Upload 文件上传的示例代码
2018/12/14 Javascript
python 测试实现方法
2008/12/24 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Django实现组合搜索的方法示例
2018/01/23 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
降低python版本的操作方法
2020/09/11 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
搞笑创意广告语
2014/03/17 职场文书
暂住证明怎么写
2015/06/19 职场文书