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 相关文章推荐
ajax异步刷新实现更新数据库
Dec 03 Javascript
javascript表单验证 - Parsley.js使用和配置
Jan 25 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
JS实现自动变换的菜单效果代码
Sep 09 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
Jun 16 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 Javascript
vue实现淘宝购物车功能
Apr 20 Javascript
vue项目打包之开发环境和部署环境的实现
Apr 23 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 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
综合图片计数器
2006/10/09 PHP
实用函数7
2007/11/08 PHP
php 保留字列表
2012/10/04 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
10个php函数实用却不常见
2015/10/13 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
Js中sort()方法的用法
2006/11/04 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
将Python代码打包为jar软件的简单方法
2015/08/04 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
黄继光的英雄事迹材料
2014/02/13 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
永不妥协观后感
2015/06/10 职场文书
公司宣传语大全
2015/07/13 职场文书
表彰大会新闻稿
2015/07/17 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
python生成随机数、随机字符、随机字符串
2021/04/06 Python
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang