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 相关文章推荐
js实现单一html页面两套css切换代码
Apr 11 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
js倒计时简单实现方法
Dec 17 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
Jun 17 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
Sep 18 Javascript
使用zrender.js绘制体温单效果
Oct 31 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 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
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php设计模式之单例模式代码
2016/06/11 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Javascript的闭包
2009/12/31 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
bootstrap table小案例
2016/10/21 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python 自动去除空行的实例
2018/07/24 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
CSS书写规范、顺序和命名规则
2014/03/06 HTML / CSS
教学实习自我评价
2014/01/28 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
政风行风建设整改方案
2014/10/27 职场文书
销售2014年度工作总结
2014/12/08 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
python for循环赋值问题
2021/06/03 Python
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle