js實(shí)現(xiàn)類(lèi)bootstrap模態(tài)框動(dòng)畫(huà)
在pc端開(kāi)發(fā),模態(tài)框是一個(gè)很常用的插件,之前一直用的第三方插件,比如bootstrap,jQuery的模態(tài)框插件,最近還用了elementUI的。但是會(huì)發(fā)現(xiàn)其實(shí)動(dòng)畫(huà)效果都差不多,那么如何去實(shí)現(xiàn)這樣一個(gè)動(dòng)畫(huà)效果呢?
模態(tài)框的構(gòu)成
常見(jiàn)的模態(tài)框的結(jié)構(gòu)我們很容易就可以看出,一個(gè)遮罩層,還有內(nèi)容區(qū)。內(nèi)容區(qū)主要是頭部(包括標(biāo)題,關(guān)閉按鈕)和body部分(body中常常會(huì)有確認(rèn)和取消按鈕)。
布局
1.背景要充滿(mǎn)全屏,而且如果頁(yè)面有滾動(dòng),當(dāng)模態(tài)框彈出的時(shí)候是無(wú)法滾動(dòng)的;
2.內(nèi)容區(qū)要水平居中顯示,至于垂直方向看設(shè)計(jì)嘍;
3.模態(tài)框出現(xiàn)是漸漸顯示出來(lái),而且從頂部滑下;
實(shí)現(xiàn)
遮罩使用最外層元素占滿(mǎn)全屏(position:fixed;),并設(shè)置背景色不透明度(rgba(0,0,0,0.5))。
水平居中有很多方式,這里使用
margin:30px auto;
重點(diǎn)介紹下關(guān)于模態(tài)框動(dòng)畫(huà)的實(shí)現(xiàn)
關(guān)于漸漸顯示使用opacity就可以,而從頂部滑下使用translate也很容易實(shí)現(xiàn)。這么看來(lái),很容易做嘛,只需要改變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";
});
是不是看起來(lái)很容易,運(yùn)行之后,誒?并沒(méi)有我們所希望看到的動(dòng)畫(huà)效果,這是為什么呢?當(dāng)我們點(diǎn)擊按鈕的時(shí)候不是已經(jīng)把動(dòng)畫(huà)加上了么?
其實(shí)仔細(xì)想想,點(diǎn)擊按鈕改變classname的時(shí)候,是一下子把元素display和動(dòng)畫(huà)屬性全都加上了,當(dāng)模態(tài)框顯示出來(lái)的時(shí)候動(dòng)畫(huà)也隨著完成了,就類(lèi)似于打開(kāi)一個(gè)html頁(yè)面一樣,頁(yè)面元素的css屬性都在頁(yè)面渲染的時(shí)候發(fā)揮了作用。而我們?cè)陧?yè)面直接去觸發(fā)一個(gè)已經(jīng)顯示出來(lái)的元素動(dòng)畫(huà)的時(shí)候是有效的。所以我們需要把元素顯示和動(dòng)畫(huà)分開(kāi)來(lái)做。
這里我做了一個(gè)異步操作(setTimeout)。
oModal.style.display = "block";
var timer = setTimeout(function(){
oModal.className = "modal in";
clearTimeout(timer);
},0);
元素顯示出來(lái)之后在給它加動(dòng)畫(huà)效果,這樣就可以實(shí)現(xiàn)我們所期望的動(dòng)畫(huà)效果了。
所有代碼在github上,在這個(gè)項(xiàng)目下有多個(gè)js的常用插件,歡迎點(diǎn)贊。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS拖動(dòng)鼠標(biāo)畫(huà)出方框?qū)崿F(xiàn)鼠標(biāo)選區(qū)的方法
- angularjs創(chuàng)建彈出框?qū)崿F(xiàn)拖動(dòng)效果
- JS+CSS實(shí)現(xiàn)可拖動(dòng)的彈出提示框
- 原生js實(shí)現(xiàn)可拖動(dòng)的登錄框效果
- JS實(shí)現(xiàn)拖動(dòng)模糊框特效
- js實(shí)現(xiàn)簡(jiǎn)單模態(tài)框?qū)嵗?/a>
- AngularJs 彈出模態(tài)框(model)
- JS實(shí)現(xiàn)圖片點(diǎn)擊后出現(xiàn)模態(tài)框效果
- Vue.js彈出模態(tài)框組件開(kāi)發(fā)的示例代碼
- 原生js實(shí)現(xiàn)簡(jiǎn)單的模態(tài)框示例
- JavaScript實(shí)現(xiàn)可拖動(dòng)模態(tài)框
相關(guān)文章
js刪除對(duì)象中的某一個(gè)字段的方法實(shí)現(xiàn)
這篇文章主要介紹了js刪除對(duì)象中的某一個(gè)字段的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
js+canvas實(shí)現(xiàn)滑動(dòng)拼圖驗(yàn)證碼功能
這篇文章主要介紹了js+canvas實(shí)現(xiàn)滑動(dòng)拼圖驗(yàn)證碼功能,本文結(jié)合實(shí)例代碼分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-03-03
重載toString實(shí)現(xiàn)JS HashMap分析
用過(guò)Java的都知道,里面有個(gè)功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)——HashMap,它能提供鍵與值的對(duì)應(yīng)訪(fǎng)問(wèn)。不過(guò)熟悉JS的朋友也會(huì)說(shuō),JS里面到處都是hashmap,因?yàn)槊總€(gè)對(duì)象都提供了map[key]的訪(fǎng)問(wèn)形式。2011-03-03
mysql輸出數(shù)據(jù)賦給js變量報(bào)unterminated string literal錯(cuò)誤原因
mysql 數(shù)據(jù)庫(kù)數(shù)據(jù)賦給js變量報(bào)unterminated string literal錯(cuò)誤原因2010-05-05
JS+CSS實(shí)現(xiàn)精美的二級(jí)導(dǎo)航效果代碼
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)精美的二級(jí)導(dǎo)航效果代碼,涉及JavaScript基于鼠標(biāo)事件動(dòng)態(tài)變換元素樣式的技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-09-09
JS檢測(cè)瀏覽器開(kāi)發(fā)者工具是否打開(kāi)的方法詳解
本篇文章主要講述幾種前端JS檢測(cè)開(kāi)發(fā)者工具是否打開(kāi)的方法,需要的朋友可以參考下2020-10-10
JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫(xiě)
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆,所以本文給大家介紹了用JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫(xiě),感興趣的小伙伴跟著小編一起來(lái)看看吧2024-05-05

