亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

Language:中文 En
新聞中心

JS實(shí)現頁(yè)面側邊欄效果探究     DATE: 2026-05-05 07:47:24

這篇文章主要介紹了JS實(shí)現頁(yè)面側邊欄效果探究,實(shí)現本文通過(guò)實(shí)例代碼給大家介紹的非常詳細,對大家的頁(yè)??面學(xué)習(xi)或工作具有一定的參(can)考借鑒價(jià)值,需要的側邊朋友可(ke)以參考下

目錄

發(fā)現:display動(dòng)畫(huà)的應用

實(shí)現:如何實(shí)現文首??展示的效果

其實(shí)效果大概是(╬?益?)這樣的:

而標題,也許是欄效我當時(shí)看到這種(′▽?zhuān)?效果時(shí)的真實(shí)感受。因為第一反(fan)應是果探:“還可以把page整體移出頁(yè)面?”

發(fā)現:display動(dòng)畫(huà)的應用

整件事的起因是什么呢?在筆者最近為社團計劃的官網(wǎng)上打算做一個(gè)這樣的效果:點(diǎn)擊頭像,左邊/右邊滑出一個(gè)“面板”,實(shí)現里面展示用戶(hù)的頁(yè)面個(gè)人信息。

當然,側邊這有很多種做法,欄效比如:利用position定位+overflow溢出隱藏、果探利用opacity/visibility隱藏+pointer-events元素穿透… 但是ヽ(′ー`)ノ實(shí)現筆者當時(shí)想到的是如何給&( ?ヮ?)rdquo;真正的隱藏,display “加上動(dòng)畫(huà)!頁(yè)面

我們大概(′?_?`)都知道的側邊是:HTML渲染過(guò)程中有一個(gè)可能執行的、影響??頁(yè)面性能的欄效“回流”和“重繪”的過(guò)程。導致這個(gè)過(guò)程被觸發(fā)的果探原因(′_`)有很多:元素位置移動(dòng)、大小改變、增刪節點(diǎn)以及這里要說(shuō)的display顯示與隱藏切換等等。而元素的變動(dòng)需要頁(yè)面快速的顯示出來(lái),所以在我們看來(lái)是“突兀”的。

而且有一點(diǎn)需要注意的是:瀏覽器是“有點(diǎn)智(′?ω?`)能&rdquo??;的 —— 它可以判斷如果會(huì )觸發(fā)頁(yè)面回流的代碼有很多,那么它會(huì )將這些(′▽?zhuān)?代碼都讀取完再(合并)一起執行 ,所以這也是下面這段代碼會(huì )有如下圖效果的(de)原因:

/** css代碼 */
width: 50px;??
height: 50px;
background-color:?? red;
display: none;
transform: translateX(0);
transition: all .6s ease; //似乎沒(méi)用?

//js代碼
ds.style.??display="block";
ds.style.transform="translateX(100(O_O)px)";

但是同樣(°o°)的,當對以下屬性進(jìn)行操作的時(shí)候,由于瀏覽器的渲染機制有一些API可以使頁(yè)面強制渲染(因為要獲得詳細確切的信息),包括??:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidthヽ(′ー`)ノ、clientHeight、getComputedStyle() (currentStyle in IE)。這會(huì )直接導致前后兩行相當于“渲染了兩遍&rdquo??;。

所以將上方j(luò )s代碼改為下面這樣:

//js代碼
ds.style.disヽ(′ー`)ノplay="block";
ds.offsetHeight;
ds.style.transform="translateX(10(′?ω?`)0px)(′?`*)";

就可以了

目前csdn官網(wǎng)PC端blink發(fā)布頁(yè)面的圖片上傳(chuan)就用了類(lèi)似這個(gè)功能!

后(′?ω?`)來(lái)還是覺(jué)得這種方式需(′ω`*)要涉及js對頁(yè)面結構的改變(bian),于是乎…

實(shí)現:如何實(shí)現文首展示的效果

這基于position定位是會(huì )“重合”的:在兩個(gè)行內元素都設置了定位屬性(但沒(méi)有加top/left/bottom/right定位)后,后面的會(huì )覆蓋前面的;這時(shí)候可以通過(guò)margin移動(dòng)位置展示 。

只能是行內元素,行內塊元素都不行。 ——云小夢(mèng)

它大概結構是這樣的:

<div clasヽ(′ー`)ノs='page_l??ist'>
<div class='z_t(′?`)wo_page??'>
<!-- 這里放ヽ(′▽?zhuān)?ノ右側彈框展示的信息 -->
</div>
<div class="box">
<!-- "頁(yè)面"的遮罩層 -->
<div( ???) class='zb_mask'></div>
<!-- 這里放“頁(yè)面”數據結構(也就是原本應該在body標簽下的所有東西) -->
</div>??;
<!-??- 這是占位元素 -->
<div class="space"></div>
</div>

實(shí)際就像這樣的:

<div class='page_list'>
<div class='z_two_page'>哈哈哈</div>
<div class='box'>
<div class='zb_mask'></div>

<div id="boxs">
<div class='left' styヽ(′ー`)ノle='background-color??:#ffc5c5;'></div>
<div class="right" style=(′▽?zhuān)?)"background-color:#7171f7;"&g??t;
flex下兩列布局左邊固定右邊寬高自適應
</div>
</div>
<div class="(′?`)color"></div>
<a href="#" rel="external nofollow" class='a'>千萬(wàn)小心像對a設置全局樣式(這叫啥樣式重置)</a>
<div class="center">
<div class='ds'></div>
<button class??="but">到指定地點(diǎn)</button>
</div>
<form id='form' action='#'>
<input type='submit' value="="踢腳板(T_T) />
</(′ω`*)form&gヾ(′?`)?t;
<img id='img' src="compress/compress??/img/mxc_16x16.png" />
</div>(′Д` )

<div class='space'></div>
</div&ヾ(′▽?zhuān)??gt;

如上,class為“box”的div里面(°□°)放的就是“原本的頁(yè)面整體&rdqu(╬?益?)o;部分。為了達到想要的效果,我們采用了flex布局!

flex簡(jiǎn)寫(xiě)時(shí)包括三個(gè)屬性:flex-grow、flex-shrink和flex-basis &md(′?ω?`)ash;—

flex-grow:指定了容器剩余空間多余時(shí)候的分配規則,默認值是0,多余空間??不分配;

flex-shrink:指定了容器剩余空間不足時(shí)候的分配規則,默認值是1,空間不足要分配;

f(╯°□°)╯︵ ┻━┻lex-basis:flex-basis則是指定了固定的分配數量,(′ω`*)默認值是auto。

設置的同時(shí)需設置width或者height屬性;

/* 列表僅水平滾動(dòng) */
.page_list { width: 100vw; display(′?_?`): flex; overflow-y: hidden; }
/* 主內容寬度100%,白色背景覆蓋 */
.box { flex: 0 0 100vw; height: 100%; backgroun???(???)d-color: #fff; posi??tion: relative; overflow-y: auto;overflow-x: hidden;transition: all .6s ease; }
/** 遮罩層樣式 */
.zb_mask{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 100;
background-color: rgba(0,0,0,.2);
pointe?r-events: none;
opacity: 0;
transition: all .6s ease;
}
/* 空標(′?`*)簽元素,作用是騰出水平滾動(dòng)空間 */
.space { flex: 0 0 12rem; }
/* 按鈕固定定位,藏在內容白色背景后面 */
.z_two_page { width: 12rem; position: fixed; righ(⊙_⊙)t: 0; top: 0; }

大概就是:什么也不干的情況下只展示box的內容(也就是和不加這些花里胡哨的div一樣的效果),它是用background覆蓋后面的class為“space”的占位元素;在”哈哈哈“展示的時(shí)候,box右移。

這里需要注意的是:為??什么“??哈哈哈”所屬divヽ(′ー`)ノ在前而&ldヾ(?■_■)ノquo;頁(yè)面”所(′ω`)屬div在后?

因為根據前(qian)面(mian)所說(shuō),這里采用的是position覆蓋,它的規則就是“后面的覆蓋前面的”,所以(′?_?`)如果采用這種布局方式,那么??一開(kāi)始被隱藏的元素就要放在前面。

代碼中flex的前兩個(gè)(′▽?zhuān)?屬性值為0,表示在空間增大或縮小時(shí)依然保持原狀(這是本文的基礎?。?,第三個(gè)元素則寫(xiě)了展示時(shí)的“默認大小”??:如你所看,box承載的是頁(yè)面,所以它是100vw,而class為“z_two_page”的元素這里設置了12rem ,你完全可以將這個(gè)值換掉!

那如何將“哈哈哈”展示在視野中? —&mdas┐(′?`)┌h; js控制“代表頁(yè)面的元素”整體移動(dòng)即可。

這里有個(gè)“遮罩層效果”,按照傳統的js實(shí)現肯定就要去找display了,再進(jìn)一步??(bu)可以用上面所說(shuō)的&l??dquo;display動(dòng)畫(huà)效果&rdq(′_`)uo;增強體驗。

但是本文上ヽ(′?`)ノ面css代碼中加了 pointer-events 屬性:元素是否穿透;設置為none時(shí)就可以不用在意對應元素是否存在了(從事件上看此時(shí)有和沒(méi)有一樣了),也就不用控制display什么的,大大增強性能了有木有!

let right=document.querySelector(".right");
let box=document.querySelector(".box");
let mask=document.query???Selector(".zb_mask");
right.onclick=function(){
box.style.marginLeft="-12rem";
mask.style.cssText+="opacity: 1;poin???ter-events: all??;"
}
mask.onclick=function(){
box.s(′?`)tyle.marginLeft='0';
mask.style.cssText+="opacity??: 0;pointe(′▽?zhuān)?r-events: none;"
}

最后,考慮到移動(dòng)端頁(yè)面展示的一些問(wèn)題,比如(ru):右側留白問(wèn)題、原生手勢對頁(yè)面整體的影響等,我們一般會(huì )在css中設置 html{ max-width: 100vw;overflow-x: hidden;} 。如果你想要用戶(hù)在移動(dòng)端依然只能夠通過(guò)點(diǎn)擊彈出側(′ω`*)邊欄,在這(zhe)里我們可以在css中加上限制 —— 設置上方功能只有在PC端生效:

@media (any-hover: none) {
.page_li?st{
ov??erflow-x: hidden;
}
}

到此(′?`*)這篇關(guān)于JS實(shí)現頁(yè)面側邊欄效果探究的文章就介紹到這了,更多相關(guān)js頁(yè)面側邊欄內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多┐(′ー`)┌多支持腳本之家!

來(lái)源:腳本之家

鏈接:https://www.jb51.net/article/203747.htm


亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 凤山县| 海口市| 云南省| 宁波市| 社会| 桂东县| 阿克苏市| 万载县| 东乌| 繁昌县| 礼泉县| 木兰县| 六枝特区| 秦皇岛市| 南乐县| 广河县| 晋州市| 宁德市| 义乌市| 临湘市| 六枝特区| 林周县| 积石山| 金阳县| 丰原市| 遵化市| 凤山市| 榆林市| 鲁甸县| 贵州省| 洞口县| 望江县| 游戏| 重庆市| 靖安县| 邮箱| 望城县| 灵石县| 邻水| 锡林浩特市| 松溪县| http://444 http://444 http://444 http://444 http://444 http://444