純CSS實(shí)現(xiàn)帶點(diǎn)擊模態(tài)框外部自動關(guān)閉的模態(tài)框

在網(wǎng)頁中我們經(jīng)常會用到模態(tài)框篙挽,一般會用于顯示表單或者是提示信息荆萤。由于模態(tài)框涉及到頁面上比較多的交互效果,最簡單的交互就是打開以及關(guān)閉兩個(gè)操作铣卡,而關(guān)閉又會涉及是否需要在打開狀態(tài)下點(diǎn)擊模態(tài)框外部能夠關(guān)閉這樣的功能链韭,因?yàn)檫@些交互問題,所以一般都會首先考慮到使用JavaScript實(shí)現(xiàn)煮落。但是我們也可以使用純CSS來實(shí)現(xiàn)敞峭。

實(shí)現(xiàn)思路:

  1. 使用HTML中checkbox類型的input標(biāo)簽

  2. 使用label來切換checkbox的選中狀態(tài)

  3. 使用css中的:checked偽類選擇器根據(jù)checkbox是否被選中切換頁面元素的樣式

  4. 使用css的屬性選擇器來添加多功能開關(guān)

開始實(shí)現(xiàn):

首先我們先寫出基本結(jié)構(gòu)

HTML

<div id="modal" class="modal__wrapper">
<div class="modal">
<div class="modal__main">
<p> 模態(tài)框內(nèi)容 </p>
</div>
</div>
</div>

CSS:

.modal {
width: 50%;
height: 50vh;
margin: auto;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 2;
background: #ffffff;
}
.modal__body {
padding: 3rem 1rem;
}
.modal-overlay {
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
padding: 0;
background-color: rgba(43, 46, 56, 0.9);
z-index: 1;
}

現(xiàn)在我們能夠看到模態(tài)主體部分以及背景蒙版的樣式了。

基本樣式.png

接下來讓我們給這個(gè)模態(tài)框添加開關(guān)
將HTML改為:

<div id="modal" class="modal__wrapper">
<input id="modal__state" class="modal__state" type="checkbox">
<label class="modal__toggle modal__toggle--outside" for="modal__state">打開模態(tài)框</label>
<div class="modal">
<div class="modal__body">
<p> 模態(tài)框內(nèi) </p>
</div>
</div>
<div class="modal-overlay"></div>
</div>

將模態(tài)框的初始狀態(tài)改為隱藏蝉仇,并在checkbox選中時(shí)顯示

.modal {
width: 50%;
height: 50vh;
margin: auto;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 2;
background: #ffffff;
display: none;
}
.modal__body {
padding: 3rem 1rem;
}
.modal-overlay {
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
padding: 0;
background-color: rgba(43, 46, 56, 0.9);
z-index: 1;
display: none;
}
.modal__state:checked + label{
display: none;
}
.modal__state:checked + label + .modal,
.modal__state:checked + label + .modal + .modal-overlay{
display: block;
}

目前我們可以實(shí)現(xiàn)點(diǎn)擊復(fù)選框打開模態(tài)框了旋讹,但是打開之后我們關(guān)閉不了殖蚕,所以我們需要讓打開的彈框可以關(guān)閉,接下來只需要做一件事情沉迹,就是在打開的模態(tài)框中再添加一個(gè)label睦疫,如:

HTML

<div id="modal" class="modal__wrapper">
<input id="modal__state" class="modal__state" type="checkbox">
<label class="modal__toggle modal__toggle--outside" for="modal__state">打開模態(tài)框</label>
<div class="modal">
<div class="modal__body">
<label class="modal__toggle modal__toggle--outside" for="modal__state">關(guān)閉模態(tài)框</label>
<p> 模態(tài)框內(nèi) </p>
</div>
</div>
<div class="modal-overlay"></div>
</div>

這樣基本的打開以及關(guān)閉模態(tài)框的交互就完成了,讓我們再簡單優(yōu)化一下樣式鞭呕,使其看起來至少美觀一些

CSS

.modal {
width: 50%;
height: 50vh;
margin: auto;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 2;
background: #fff;
display: none;
}
.modal__body {
padding: 3rem 1rem;
}
.modal-overlay {
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
padding: 0;
background-color: rgba(43, 46, 56, 0.9);
z-index: 1;
display: none;
}
.modal__state:checked + label{
display: none;
}
.modal__state:checked + label + .modal,
.modal__state:checked + label + .modal + .modal-overlay{
display: block;
}
.modal__state{
position: fixed;
top: -9999px;
}
.modal__wrapper .modal__toggle {
padding: 1rem;
display: inline-block;
margin-top: -1rem;
margin-right: -1rem;
color: black;
}
.modal__wrapper .modal__toggle--outside {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
margin-top: 1rem;
background: #df2f2f;
cursor: pointer;
}
.modal__wrapper .modal__toggle--inside {
float: right;
font-size: 4rem;
width: 2rem;
height: 2rem;
text-align: center;
cursor: pointer;
transition: 0.15s;
margin-top: -3.5rem;
margin-right: -2rem;
}

現(xiàn)在我們的模態(tài)框看起來就美觀多了

最終效果.png

目前已經(jīng)實(shí)現(xiàn)了打開和關(guān)閉的切換蛤育,那么如何實(shí)現(xiàn)點(diǎn)擊模塊框外面關(guān)閉模態(tài)框呢?可能這部分看起來比較復(fù)雜一些葫松,但是其實(shí)也非常的簡單瓦糕。默認(rèn)狀態(tài)下我們顯示的是由一個(gè)DIV實(shí)現(xiàn)的蒙層,但是如果我們將DIV也換成一個(gè)label呢腋么?那應(yīng)該就跟關(guān)閉按鈕的邏輯一樣了咕娄。
另外,為了使得我們的模塊框能夠適應(yīng)點(diǎn)擊模塊框外部關(guān)閉或者不關(guān)閉兩種情況珊擂,我們還可以利用css的屬性選擇器來實(shí)現(xiàn)功能的開關(guān)圣勒。下面是我們最終的html和css。

HTML

<div id="modal" class="modal__wrapper" outside-close>
<input id="modal__state" class="modal__state" type="checkbox">
<label class="modal__toggle modal__toggle--outside" for="modal__state">打開模態(tài)框</label>
<div class="modal">
<div class="modal__body">
<label class="modal__toggle modal__toggle--outside" for="modal__state">關(guān)閉模態(tài)框</label>
<p> 模態(tài)框內(nèi) </p>
</div>
</div>
<div class="modal-overlay"></div>
</div>

CSS樣式

.modal {
width: 50%;
height: 50vh;
margin: auto;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 2;
background: #fff;
display: none;
}
.modal__body {
padding: 3rem 1rem;
}
.modal-overlay {
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
padding: 0;
background-color: rgba(43, 46, 56, 0.9);
z-index: 1;
display: none;
}
.modal__state:checked + label{
display: none;
}
.modal__state:checked + label + .modal,
.modal__state:checked + label + .modal + .modal-overlay{
display: block;
}
.modal__state{
position: fixed;
top: -9999px;
}
.modal__wrapper .modal__toggle {
padding: 1rem;
display: inline-block;
margin-top: -1rem;
margin-right: -1rem;
color: black;
}
.modal__wrapper .modal__toggle--outside {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
margin-top: 1rem;
background: #df2f2f;
cursor: pointer;
}
.modal__wrapper .modal__toggle--inside {
float: right;
font-size: 4rem;
width: 2rem;
height: 2rem;
text-align: center;
cursor: pointer;
transition: 0.15s;
margin-top: -3.5rem;
margin-right: -2rem;
}
.modal__wrapper[outside-close] .modal__state:checked + label + .modal + .modal-overlay {
display: none;
}
.modal__wrapper[outside-close] .modal__state:checked + label.modal__toggle--outside{
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
padding: 0;
background-color: rgba(43, 46, 56, 0.9);
z-index: 1;
display: block;
transform: translate(0, 0);
margin-top: 0;
color: transparent;
}

現(xiàn)在的這種實(shí)現(xiàn)目前只適用于頁面上只有一個(gè)模態(tài)框的情況未玻,如果需要實(shí)現(xiàn)多個(gè)也是可能的灾而,只需要做幾個(gè)簡單的改動即可實(shí)現(xiàn)。

Demo 1: 單模態(tài)框?qū)崿F(xiàn)
Demo 2: 多模態(tài)框?qū)崿F(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳剿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昼激,更是在濱河造成了極大的恐慌庇绽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橙困,死亡現(xiàn)場離奇詭異瞧掺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凡傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門辟狈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夏跷,你說我怎么就攤上這事哼转。” “怎么了槽华?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵壹蔓,是天一觀的道長。 經(jīng)常有香客問我猫态,道長佣蓉,這世上最難降的妖魔是什么披摄? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮勇凭,結(jié)果婚禮上疚膊,老公的妹妹穿的比我還像新娘。我一直安慰自己虾标,他們只是感情好酿联,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夺巩,像睡著了一般贞让。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柳譬,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天喳张,我揣著相機(jī)與錄音,去河邊找鬼美澳。 笑死销部,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的制跟。 我是一名探鬼主播舅桩,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雨膨!你這毒婦竟也來了擂涛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤聊记,失蹤者是張志新(化名)和其女友劉穎撒妈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排监,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狰右,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舆床。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棋蚌。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挨队,靈堂內(nèi)的尸體忽然破棺而出谷暮,到底是詐尸還是另有隱情,我是刑警寧澤瞒瘸,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布坷备,位于F島的核電站,受9級特大地震影響情臭,放射性物質(zhì)發(fā)生泄漏省撑。R本人自食惡果不足惜赌蔑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竟秫。 院中可真熱鬧娃惯,春花似錦、人聲如沸肥败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒稍。三九已至皿哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纽谒,已是汗流浹背证膨。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鼓黔,地道東北人央勒。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像澳化,于是被迫代替她去往敵國和親崔步。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在學(xué)習(xí)weex的過程中看到了常用標(biāo)簽相關(guān)的內(nèi)容缎谷,為了自己以后能夠快速查閱特整理出此文檔井濒。 a 簡介組件定義了指向某...
    TyroneTang閱讀 4,644評論 1 3
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評論 1 92
  • 各種純css圖標(biāo) CSS3可以實(shí)現(xiàn)很多漂亮的圖形慎陵,我收集了32種圖形眼虱,在下面列出。直接用CSS3畫出這些圖形席纽,要比...
    劍殘閱讀 9,476評論 0 8
  • 1、垂直對齊 如果你用CSS撞蚕,則你會有困惑:我該怎么垂直對齊容器中的元素润梯?現(xiàn)在,利用CSS3的Transform甥厦,...
    kiddings閱讀 3,148評論 0 11
  • 姓名:黃太平 公司:寧波大發(fā)化纖有限公司 組別:301期反省組學(xué)員 【知~學(xué)習(xí)】 1纺铭、《六項(xiàng)精進(jìn)》讀 1遍 2、《...
    黃太平閱讀 145評論 0 0