CSS3+HTML5+JS 實(shí)現(xiàn)一個(gè)塊的收縮與展開(kāi)動(dòng)畫(huà)效果

最近在做項(xiàng)目時(shí),發(fā)現(xiàn)CSS3中關(guān)于動(dòng)畫(huà)的技術(shù),自己很少運(yùn)用在項(xiàng)目中,平時(shí)一些列表塊的收縮和展開(kāi)動(dòng)畫(huà)效果,幾乎都是使用 display 的 none 和 block,或者 visibility 的 hidden 和 visible 來(lái)進(jìn)行控制。因此,在最近的項(xiàng)目中,就開(kāi)始深入研究CSS3關(guān)于動(dòng)畫(huà)的技術(shù),并且運(yùn)用到了項(xiàng)目中,下面是關(guān)于列表塊的收縮&展開(kāi)動(dòng)畫(huà)。
簡(jiǎn)單的一個(gè)效果圖
實(shí)現(xiàn)思路
大體上我們將列表塊分割成 標(biāo)題塊 和 內(nèi)容塊
(1)標(biāo)題塊: 展示標(biāo)題和一個(gè)帶有收縮&展開(kāi)動(dòng)畫(huà)效果的圖標(biāo)
?、賵D標(biāo)部分,我們可以使用偽類(lèi)來(lái)繪畫(huà)出箭頭,并且使用 transform 的旋轉(zhuǎn)屬性 rotate 進(jìn)行圖標(biāo)的方向控制和其動(dòng)畫(huà)效果。
②動(dòng)畫(huà)控制,通常點(diǎn)擊標(biāo)題部分,列表則收縮&展開(kāi),因此點(diǎn)擊標(biāo)題時(shí),要對(duì)class進(jìn)行控制。
(2)內(nèi)容塊:內(nèi)容塊展示內(nèi)容,且該塊承載了主要的動(dòng)畫(huà)效果——列表的收縮&展開(kāi)
①動(dòng)畫(huà)效果:該塊的動(dòng)畫(huà),我們的思路是整個(gè)塊的高度收起來(lái),里面的內(nèi)容也向左邊隱藏,因此需要控制高度和動(dòng)畫(huà)的隱藏,所以使用 max-height 進(jìn)行高度控制和 transition(設(shè)置動(dòng)畫(huà)時(shí)間)、transform 的屬性 translate 來(lái)進(jìn)行內(nèi)容的隱藏
完整代碼如下:
<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .block_wrap { width: 500px; margin: 0 auto; border: 1px solid #e3e3e3; border-radius: 10px; } .chapter_wrap { background: white; text-align: left; border-radius: 8px; color: #333333; margin-bottom: 15px; font-size: 14px; overflow: hidden; } .title_item_wrap { padding: 10px 10px 10px 0; margin: 0 10px 0 10px; border-bottom: none; display: flex; align-items: center; } /*使用偽類(lèi)進(jìn)行圖標(biāo)繪畫(huà)*/ .title_item_wrap::after { content: ''; width: 10px; height: 10px; border-top: 2px solid #999999; border-right: 2px solid #999999; transform: rotate(-45deg); display: inline-block; transition: 0.3s; float: right; margin-top: 10px; } /*使用類(lèi)acitve類(lèi)控制圖標(biāo)的旋轉(zhuǎn)和展開(kāi)時(shí)標(biāo)題的下邊界*/ .active { border-bottom: 1px solid #F0F0F0; } .active::after{ transform: rotate(135deg); margin-top: 5px; } .chapter_title { font-size: 16px; padding: 0; margin: 0; width: calc(100% - 30px); } .node_wrap { overflow: hidden; overflow-y: scroll; transition: 0.3s; } .node_wrap p { padding: 0 20px 5px 20px; margin: 10px 0; border-bottom: 1px solid #e3e3e3 } /*隱藏內(nèi)容塊的滑動(dòng)條*/ .node_wrap::-webkit-scrollbar { display: none; } /*控制內(nèi)容塊隱藏 隱藏時(shí),整塊向左邊平移200%的寬度,并且將最大高度設(shè)置為0,否則頁(yè)面會(huì)留有空白*/ .node_wrap_hide { transform: translate(-200%, 0); max-height: 0; } /*控制內(nèi)容塊顯示,顯示時(shí),整塊向右邊復(fù)原,并且將最大高度設(shè)置為300px,里面的內(nèi)容即會(huì)將塊撐開(kāi)*/ .node_wrap_show { transform: translate(0, 0); max-height: 300px; } </style> </head> <body> <div class="block_wrap"> <div id="block_wrap" class="title_item_wrap active"> <p class="chapter_title">章節(jié)名稱(chēng)</p> </div> <div id="list_wrap" class="node_wrap node_wrap_show"> <p>節(jié)名稱(chēng)一</p> <p>節(jié)名稱(chēng)二</p> <p>節(jié)名稱(chēng)三</p> <p>節(jié)名稱(chēng)四</p> <p>節(jié)名稱(chēng)五</p> <p>節(jié)名稱(chēng)六</p> <p>節(jié)名稱(chēng)七</p> <p>節(jié)名稱(chēng)八</p> <p>節(jié)名稱(chēng)九</p> <p>節(jié)名稱(chēng)十</p> </div> </div> </body> <script type="text/javascript"> // 獲取標(biāo)題元素 var block_wrap = document.getElementById('block_wrap') //給標(biāo)題元素添加點(diǎn)擊事件,通過(guò)點(diǎn)擊控制class的添加&去除達(dá)成動(dòng)畫(huà)效果 block_wrap.onclick = function() { // 獲取標(biāo)題元素className集合 let classArray = this.className.split(/\s+/) // 獲取內(nèi)容塊元素 let list_wrap = document.getElementById('list_wrap') // 判斷標(biāo)題元素是否有類(lèi)active,如若存在,則說(shuō)明列表展開(kāi),這時(shí)點(diǎn)擊則是隱藏內(nèi)容塊,否則顯示內(nèi)容塊 if (classArray.includes('active')) { // 隱藏內(nèi)容塊 block_wrap.classList.remove('active') list_wrap.classList.remove('node_wrap_show') list_wrap.classList.add('node_wrap_hide') console.log(this.className.split(/\s+/)) return } else { // 顯示內(nèi)容塊 block_wrap.classList.add('active') list_wrap.classList.add('node_wrap_show') list_wrap.classList.remove('node_wrap_hide') return } } </script> </html>
以上代碼直接復(fù)制到HTML文件保存后即可看到效果。此動(dòng)畫(huà)效果適應(yīng)移動(dòng)端,PC端會(huì)有點(diǎn)瑕疵,稍微處理即可。
到此這篇關(guān)于CSS3+HTML5+JS 實(shí)現(xiàn)一個(gè)塊的收縮與展開(kāi)動(dòng)畫(huà)效果的文章就介紹到這了,更多相關(guān)html5展開(kāi)收縮動(dòng)畫(huà)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
CSS3 實(shí)現(xiàn)側(cè)邊欄展開(kāi)收起動(dòng)畫(huà)
這篇文章主要介紹了如何使用CSS3 實(shí)現(xiàn)側(cè)邊欄展開(kāi)收起動(dòng)畫(huà),并附上了示例代碼,非常的詳細(xì),推薦給需要的小伙伴。2014-12-22CSS3超酷環(huán)形動(dòng)畫(huà)菜單其子菜單可環(huán)繞展開(kāi)
一款非常有創(chuàng)意的CSS3動(dòng)畫(huà)菜單,菜單是環(huán)形的2014-05-28CSS3華麗的Tab菜單當(dāng)鼠標(biāo)滑過(guò)時(shí)會(huì)出現(xiàn)展開(kāi)動(dòng)畫(huà)
這款Tab菜單的菜單項(xiàng)是一個(gè)個(gè)小圖標(biāo),鼠標(biāo)滑過(guò)時(shí),菜單項(xiàng)展示對(duì)應(yīng)文字,并出現(xiàn)展開(kāi)的動(dòng)畫(huà)2014-05-04純CSS3實(shí)現(xiàn)的橫向和縱向鼠標(biāo)滑過(guò)手風(fēng)琴自動(dòng)展開(kāi)效果
無(wú)需任何js代碼,純CSS3實(shí)現(xiàn),鼠標(biāo)滑過(guò)自動(dòng)展開(kāi),可以實(shí)現(xiàn)橫向和縱向的手風(fēng)琴效果2013-06-07基于jquery+css3實(shí)現(xiàn)左右搖擺可滑動(dòng)展開(kāi)折疊圓形導(dǎo)航菜單
CSS3實(shí)現(xiàn)的一些菜單導(dǎo)航效果,在不支持CSS3屬性的瀏覽器下效果較差一些,展開(kāi)效果后會(huì)看到文字、搜索框等等2013-02-20