JS實現(xiàn)頁面?zhèn)冗厵谛Ч骄?/h1>
更新時間:2021年01月08日 15:15:23 作者:行舟客
這篇文章主要介紹了JS實現(xiàn)頁面?zhèn)冗厵谛Ч骄?本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
其實效果大概是這樣的:

而標(biāo)題,也許是我當(dāng)時看到這種效果時的真實感受。因為第一反應(yīng)是:“還可以把page整體移出頁面?”
發(fā)現(xiàn):display動畫的應(yīng)用
整件事的起因是什么呢?在筆者最近為社團計劃的官網(wǎng)上打算做一個這樣的效果:點擊頭像,左邊/右邊滑出一個“面板”,里面展示用戶的個人信息。
當(dāng)然,這有很多種做法,比如:利用position定位+overflow溢出隱藏、利用opacity/visibility隱藏+pointer-events元素穿透… 但是筆者當(dāng)時想到的是如何給”真正的隱藏,display“加上動畫!
我們大概都知道的是:HTML渲染過程中有一個可能執(zhí)行的、影響頁面性能的“回流”和“重繪”的過程。導(dǎo)致這個過程被觸發(fā)的原因有很多:元素位置移動、大小改變、增刪節(jié)點以及這里要說的display顯示與隱藏切換等等。而元素的變動需要頁面快速的顯示出來,所以在我們看來是“突?!钡摹?br />
而且有一點需要注意的是:瀏覽器是“有點智能”的 —— 它可以判斷如果會觸發(fā)頁面回流的代碼有很多,那么它會將這些代碼都讀取完再(合并)一起執(zhí)行,所以這也是下面這段代碼會有如下圖效果的原因:
/** css代碼 */
width: 50px;
height: 50px;
background-color: red;
display: none;
transform: translateX(0);
transition: all .6s ease; //似乎沒用?
//js代碼
ds.style.display="block";
ds.style.transform="translateX(100px)";

但是同樣的,當(dāng)對以下屬性進(jìn)行操作的時候,由于瀏覽器的渲染機制有一些API可以使頁面強制渲染(因為要獲得詳細(xì)確切的信息),包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。這會直接導(dǎo)致前后兩行相當(dāng)于“渲染了兩遍”。
所以將上方j(luò)s代碼改為下面這樣:
//js代碼
ds.style.display="block";
ds.offsetHeight;
ds.style.transform="translateX(100px)";
就可以了

目前csdn官網(wǎng)PC端blink發(fā)布頁面的圖片上傳就用了類似這個功能!
后來還是覺得這種方式需要涉及js對頁面結(jié)構(gòu)的改變,于是乎…
實現(xiàn):如何實現(xiàn)文首展示的效果
這基于position定位是會“重合”的:在兩個行內(nèi)元素都設(shè)置了定位屬性(但沒有加top/left/bottom/right定位)后,后面的會覆蓋前面的;這時候可以通過margin移動位置展示。
只能是行內(nèi)元素,行內(nèi)塊元素都不行。 ——云小夢
它大概結(jié)構(gòu)是這樣的:
<div class="page_list">
<div class="z_two_page">
<!-- 這里放右側(cè)彈框展示的信息 -->
</div>
<div class="box">
<!-- "頁面"的遮罩層 -->
<div class="zb_mask"></div>
<!-- 這里放“頁面”數(shù)據(jù)結(jié)構(gòu)(也就是原本應(yīng)該在body標(biāo)簽下的所有東西) -->
</div>
<!-- 這是占位元素 -->
<div class="space"></div>
</div>
實際就像這樣的:
<div class="page_list">
<div class="z_two_page">哈哈哈</div>
<div class="box">
<div class="zb_mask"></div>
<div id="boxs">
<div class="left" style="background-color:#ffc5c5;"></div>
<div class="right" style="background-color:#7171f7;">
flex下兩列布局左邊固定右邊寬高自適應(yīng)
</div>
</div>
<div class="color"></div>
<a href="#" rel="external nofollow" class="a">千萬小心像對a設(shè)置全局樣式(這叫啥樣式重置)</a>
<div class="center">
<div class="ds"></div>
<button class="but">到指定地點</button>
</div>
<form id="form" action="#">
<input type="submit" value="="踢腳板 />
</form>
<img id="img" src="compress/compress/img/mxc_16x16.png" />
</div>
<div class="space"></div>
</div>
如上,class為“box”的div里面放的就是“原本的頁面整體”部分。為了達(dá)到想要的效果,我們采用了flex布局!
flex簡寫時包括三個屬性:flex-grow、flex-shrink和flex-basis ——
- flex-grow:指定了容器剩余空間多余時候的分配規(guī)則,默認(rèn)值是0,多余空間不分配;
- flex-shrink:指定了容器剩余空間不足時候的分配規(guī)則,默認(rèn)值是1,空間不足要分配;
- flex-basis:flex-basis則是指定了固定的分配數(shù)量,默認(rèn)值是auto。
設(shè)置的同時需設(shè)置width或者h(yuǎn)eight屬性;
/* 列表僅水平滾動 */
.page_list { width: 100vw; display: flex; overflow-y: hidden; }
/* 主內(nèi)容寬度100%,白色背景覆蓋 */
.box { flex: 0 0 100vw; height: 100%; background-color: #fff; position: 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);
pointer-events: none;
opacity: 0;
transition: all .6s ease;
}
/* 空標(biāo)簽元素,作用是騰出水平滾動空間 */
.space { flex: 0 0 12rem; }
/* 按鈕固定定位,藏在內(nèi)容白色背景后面 */
.z_two_page { width: 12rem; position: fixed; right: 0; top: 0; }
大概就是:什么也不干的情況下只展示box的內(nèi)容(也就是和不加這些花里胡哨的div一樣的效果),它是用background
覆蓋后面的class
為“space”的占位元素;在”哈哈哈“展示的時候,box右移。
這里需要注意的是:為什么“哈哈哈”所屬div在前而“頁面”所屬div在后?
因為根據(jù)前面所說,這里采用的是position覆蓋,它的規(guī)則就是“后面的覆蓋前面的”,所以如果采用這種布局方式,那么一開始被隱藏的元素就要放在前面。
代碼中flex的前兩個屬性值為0,表示在空間增大或縮小時依然保持原狀(這是本文的基礎(chǔ)?。?,第三個元素則寫了展示時的“默認(rèn)大小”:如你所看,box承載的是頁面,所以它是100vw
,而class
為“z_two_page”的元素這里設(shè)置了12rem
,你完全可以將這個值換掉!
那如何將“哈哈哈”展示在視野中? —— js控制“代表頁面的元素”整體移動即可。
這里有個“遮罩層效果”,按照傳統(tǒng)的js實現(xiàn)肯定就要去找display了,再進(jìn)一步可以用上面所說的“display動畫效果”增強體驗。
但是本文上面css代碼中加了 pointer-events
屬性:元素是否穿透;設(shè)置為none時就可以不用在意對應(yīng)元素是否存在了(從事件上看此時有和沒有一樣了),也就不用控制display什么的,大大增強性能了有木有!
let right=document.querySelector(".right");
let box=document.querySelector(".box");
let mask=document.querySelector(".zb_mask");
right.onclick=function(){
box.style.marginLeft="-12rem";
mask.style.cssText+="opacity: 1;pointer-events: all;"
}
mask.onclick=function(){
box.style.marginLeft="0";
mask.style.cssText+="opacity: 0;pointer-events: none;"
}
最后,考慮到移動端頁面展示的一些問題,比如:右側(cè)留白問題、原生手勢對頁面整體的影響等,我們一般會在css中設(shè)置 html{max-width: 100vw;overflow-x: hidden;}
。如果你想要用戶在移動端依然只能夠通過點擊彈出側(cè)邊欄,在這里我們可以在css中加上限制 —— 設(shè)置上方功能只有在PC端生效:
@media (any-hover: none) {
.page_list{
overflow-x: hidden;
}
}
到此這篇關(guān)于JS實現(xiàn)頁面?zhèn)冗厵谛Ч骄康奈恼戮徒榻B到這了,更多相關(guān)js頁面?zhèn)冗厵趦?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 博客側(cè)邊欄模塊跟隨滾動條滑動固定效果的實現(xiàn)方法(js+jquery等)
- javascript實現(xiàn)動態(tài)側(cè)邊欄代碼
- javascript 實現(xiàn)動態(tài)側(cè)邊欄實例詳解
- 利用js編寫響應(yīng)式側(cè)邊欄
- JS實現(xiàn)側(cè)邊欄鼠標(biāo)經(jīng)過彈出框+緩沖效果
- JavaScript實現(xiàn)簡單的隱藏式側(cè)邊欄功能示例
- 基于slideout.js實現(xiàn)移動端側(cè)邊欄滑動特效
- JS運動框架之分享側(cè)邊欄動畫實例
- JavaScript中實現(xiàn)無縫滾動、分享到側(cè)邊欄實例代碼
- js+css實現(xiàn)全屏側(cè)邊欄
- JS實現(xiàn)京東商品分類側(cè)邊欄
- javascript實現(xiàn)固定側(cè)邊欄
相關(guān)文章
-
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法詳解【先序、中序、后序】
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法,結(jié)合實例形式詳細(xì)分析了javascript二叉樹的定義及先序遍歷、中序遍歷、后序遍歷等相關(guān)遍歷操作實現(xiàn)技巧,需要的朋友可以參考下 2019-02-02
-
跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理
跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理,小編對JScript的Bug與內(nèi)存管理也不甚了解,所以整理了本篇文章,希望可以解決大家學(xué)習(xí)時的困擾。 2015-11-11
-
Elasticsearch實現(xiàn)復(fù)合查詢高亮結(jié)果功能
這篇文章主要介紹了Elasticsearch實現(xiàn)復(fù)合查詢,高亮結(jié)果功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下 2019-09-09
-
js實現(xiàn)鍵盤上下左右鍵選擇文字并顯示在文本框的方法
這篇文章主要介紹了js實現(xiàn)鍵盤上下左右鍵選擇文字并顯示在文本框的方法,涉及javascript操作鍵盤事件及文本框的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下 2015-05-05
-
JavaScript?canvas?實現(xiàn)用代碼畫畫
這篇文章主要為大家介紹了JavaScript?canvas?實現(xiàn)用代碼畫畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2022-11-11
-
JavaScript學(xué)習(xí)筆記之ES6數(shù)組方法
ES6給數(shù)組添加了一些新特性,而這些新特性到目前為止完全可以運用到自己的業(yè)務(wù)層。在這一節(jié)中將總結(jié)有關(guān)于ES6給數(shù)組提供一些新特性的使用方法 2016-03-03
最新評論
其實效果大概是這樣的:
而標(biāo)題,也許是我當(dāng)時看到這種效果時的真實感受。因為第一反應(yīng)是:“還可以把page整體移出頁面?”
發(fā)現(xiàn):display動畫的應(yīng)用
整件事的起因是什么呢?在筆者最近為社團計劃的官網(wǎng)上打算做一個這樣的效果:點擊頭像,左邊/右邊滑出一個“面板”,里面展示用戶的個人信息。
當(dāng)然,這有很多種做法,比如:利用position定位+overflow溢出隱藏、利用opacity/visibility隱藏+pointer-events元素穿透… 但是筆者當(dāng)時想到的是如何給”真正的隱藏,display“加上動畫!
我們大概都知道的是:HTML渲染過程中有一個可能執(zhí)行的、影響頁面性能的“回流”和“重繪”的過程。導(dǎo)致這個過程被觸發(fā)的原因有很多:元素位置移動、大小改變、增刪節(jié)點以及這里要說的display顯示與隱藏切換等等。而元素的變動需要頁面快速的顯示出來,所以在我們看來是“突?!钡摹?br /> 而且有一點需要注意的是:瀏覽器是“有點智能”的 —— 它可以判斷如果會觸發(fā)頁面回流的代碼有很多,那么它會將這些代碼都讀取完再(合并)一起執(zhí)行,所以這也是下面這段代碼會有如下圖效果的原因:
/** css代碼 */ width: 50px; height: 50px; background-color: red; display: none; transform: translateX(0); transition: all .6s ease; //似乎沒用?
//js代碼 ds.style.display="block"; ds.style.transform="translateX(100px)";
但是同樣的,當(dāng)對以下屬性進(jìn)行操作的時候,由于瀏覽器的渲染機制有一些API可以使頁面強制渲染(因為要獲得詳細(xì)確切的信息),包括:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)。這會直接導(dǎo)致前后兩行相當(dāng)于“渲染了兩遍”。
所以將上方j(luò)s代碼改為下面這樣:
//js代碼 ds.style.display="block"; ds.offsetHeight; ds.style.transform="translateX(100px)";
就可以了
目前csdn官網(wǎng)PC端blink發(fā)布頁面的圖片上傳就用了類似這個功能!
后來還是覺得這種方式需要涉及js對頁面結(jié)構(gòu)的改變,于是乎…
實現(xiàn):如何實現(xiàn)文首展示的效果
這基于position定位是會“重合”的:在兩個行內(nèi)元素都設(shè)置了定位屬性(但沒有加top/left/bottom/right定位)后,后面的會覆蓋前面的;這時候可以通過margin移動位置展示。
只能是行內(nèi)元素,行內(nèi)塊元素都不行。 ——云小夢
它大概結(jié)構(gòu)是這樣的:
<div class="page_list"> <div class="z_two_page"> <!-- 這里放右側(cè)彈框展示的信息 --> </div> <div class="box"> <!-- "頁面"的遮罩層 --> <div class="zb_mask"></div> <!-- 這里放“頁面”數(shù)據(jù)結(jié)構(gòu)(也就是原本應(yīng)該在body標(biāo)簽下的所有東西) --> </div> <!-- 這是占位元素 --> <div class="space"></div> </div>
實際就像這樣的:
<div class="page_list"> <div class="z_two_page">哈哈哈</div> <div class="box"> <div class="zb_mask"></div> <div id="boxs"> <div class="left" style="background-color:#ffc5c5;"></div> <div class="right" style="background-color:#7171f7;"> flex下兩列布局左邊固定右邊寬高自適應(yīng) </div> </div> <div class="color"></div> <a href="#" rel="external nofollow" class="a">千萬小心像對a設(shè)置全局樣式(這叫啥樣式重置)</a> <div class="center"> <div class="ds"></div> <button class="but">到指定地點</button> </div> <form id="form" action="#"> <input type="submit" value="="踢腳板 /> </form> <img id="img" src="compress/compress/img/mxc_16x16.png" /> </div> <div class="space"></div> </div>
如上,class為“box”的div里面放的就是“原本的頁面整體”部分。為了達(dá)到想要的效果,我們采用了flex布局!
flex簡寫時包括三個屬性:flex-grow、flex-shrink和flex-basis ——
- flex-grow:指定了容器剩余空間多余時候的分配規(guī)則,默認(rèn)值是0,多余空間不分配;
- flex-shrink:指定了容器剩余空間不足時候的分配規(guī)則,默認(rèn)值是1,空間不足要分配;
- flex-basis:flex-basis則是指定了固定的分配數(shù)量,默認(rèn)值是auto。
設(shè)置的同時需設(shè)置width或者h(yuǎn)eight屬性;
/* 列表僅水平滾動 */ .page_list { width: 100vw; display: flex; overflow-y: hidden; } /* 主內(nèi)容寬度100%,白色背景覆蓋 */ .box { flex: 0 0 100vw; height: 100%; background-color: #fff; position: 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); pointer-events: none; opacity: 0; transition: all .6s ease; } /* 空標(biāo)簽元素,作用是騰出水平滾動空間 */ .space { flex: 0 0 12rem; } /* 按鈕固定定位,藏在內(nèi)容白色背景后面 */ .z_two_page { width: 12rem; position: fixed; right: 0; top: 0; }
大概就是:什么也不干的情況下只展示box的內(nèi)容(也就是和不加這些花里胡哨的div一樣的效果),它是用background
覆蓋后面的class
為“space”的占位元素;在”哈哈哈“展示的時候,box右移。
這里需要注意的是:為什么“哈哈哈”所屬div在前而“頁面”所屬div在后?
因為根據(jù)前面所說,這里采用的是position覆蓋,它的規(guī)則就是“后面的覆蓋前面的”,所以如果采用這種布局方式,那么一開始被隱藏的元素就要放在前面。
代碼中flex的前兩個屬性值為0,表示在空間增大或縮小時依然保持原狀(這是本文的基礎(chǔ)?。?,第三個元素則寫了展示時的“默認(rèn)大小”:如你所看,box承載的是頁面,所以它是100vw
,而class
為“z_two_page”的元素這里設(shè)置了12rem
,你完全可以將這個值換掉!
那如何將“哈哈哈”展示在視野中? —— js控制“代表頁面的元素”整體移動即可。
這里有個“遮罩層效果”,按照傳統(tǒng)的js實現(xiàn)肯定就要去找display了,再進(jìn)一步可以用上面所說的“display動畫效果”增強體驗。
但是本文上面css代碼中加了 pointer-events
屬性:元素是否穿透;設(shè)置為none時就可以不用在意對應(yīng)元素是否存在了(從事件上看此時有和沒有一樣了),也就不用控制display什么的,大大增強性能了有木有!
let right=document.querySelector(".right"); let box=document.querySelector(".box"); let mask=document.querySelector(".zb_mask"); right.onclick=function(){ box.style.marginLeft="-12rem"; mask.style.cssText+="opacity: 1;pointer-events: all;" } mask.onclick=function(){ box.style.marginLeft="0"; mask.style.cssText+="opacity: 0;pointer-events: none;" }
最后,考慮到移動端頁面展示的一些問題,比如:右側(cè)留白問題、原生手勢對頁面整體的影響等,我們一般會在css中設(shè)置 html{max-width: 100vw;overflow-x: hidden;}
。如果你想要用戶在移動端依然只能夠通過點擊彈出側(cè)邊欄,在這里我們可以在css中加上限制 —— 設(shè)置上方功能只有在PC端生效:
@media (any-hover: none) { .page_list{ overflow-x: hidden; } }
到此這篇關(guān)于JS實現(xiàn)頁面?zhèn)冗厵谛Ч骄康奈恼戮徒榻B到這了,更多相關(guān)js頁面?zhèn)冗厵趦?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 博客側(cè)邊欄模塊跟隨滾動條滑動固定效果的實現(xiàn)方法(js+jquery等)
- javascript實現(xiàn)動態(tài)側(cè)邊欄代碼
- javascript 實現(xiàn)動態(tài)側(cè)邊欄實例詳解
- 利用js編寫響應(yīng)式側(cè)邊欄
- JS實現(xiàn)側(cè)邊欄鼠標(biāo)經(jīng)過彈出框+緩沖效果
- JavaScript實現(xiàn)簡單的隱藏式側(cè)邊欄功能示例
- 基于slideout.js實現(xiàn)移動端側(cè)邊欄滑動特效
- JS運動框架之分享側(cè)邊欄動畫實例
- JavaScript中實現(xiàn)無縫滾動、分享到側(cè)邊欄實例代碼
- js+css實現(xiàn)全屏側(cè)邊欄
- JS實現(xiàn)京東商品分類側(cè)邊欄
- javascript實現(xiàn)固定側(cè)邊欄
相關(guān)文章
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法詳解【先序、中序、后序】
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法,結(jié)合實例形式詳細(xì)分析了javascript二叉樹的定義及先序遍歷、中序遍歷、后序遍歷等相關(guān)遍歷操作實現(xiàn)技巧,需要的朋友可以參考下2019-02-02跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理
跟我學(xué)習(xí)JScript的Bug與內(nèi)存管理,小編對JScript的Bug與內(nèi)存管理也不甚了解,所以整理了本篇文章,希望可以解決大家學(xué)習(xí)時的困擾。2015-11-11Elasticsearch實現(xiàn)復(fù)合查詢高亮結(jié)果功能
這篇文章主要介紹了Elasticsearch實現(xiàn)復(fù)合查詢,高亮結(jié)果功能,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09js實現(xiàn)鍵盤上下左右鍵選擇文字并顯示在文本框的方法
這篇文章主要介紹了js實現(xiàn)鍵盤上下左右鍵選擇文字并顯示在文本框的方法,涉及javascript操作鍵盤事件及文本框的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下2015-05-05JavaScript?canvas?實現(xiàn)用代碼畫畫
這篇文章主要為大家介紹了JavaScript?canvas?實現(xiàn)用代碼畫畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11JavaScript學(xué)習(xí)筆記之ES6數(shù)組方法
ES6給數(shù)組添加了一些新特性,而這些新特性到目前為止完全可以運用到自己的業(yè)務(wù)層。在這一節(jié)中將總結(jié)有關(guān)于ES6給數(shù)組提供一些新特性的使用方法2016-03-03