溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用JavaScript怎么實現一個頁面側邊欄效果

發布時間:2021-01-11 15:18:29 來源:億速云 閱讀:338 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關利用JavaScript怎么實現一個頁面側邊欄效果,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

/** 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)";

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

所以將上方js代碼改為下面這樣:

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

目前csdn官網PC端blink發布頁面的圖片上傳就用了類似這個功能!

后來還是覺得這種方式需要涉及js對頁面結構的改變,于是乎…

實現:如何實現文首展示的效果

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

只能是行內元素,行內塊元素都不行。 ——云小夢

它大概結構是這樣的:

<div class="page_list">
	<div class="z_two_page">
		<!-- 這里放右側彈框展示的信息 -->
	</div>
	<div class="box">
		<!-- "頁面"的遮罩層 -->
		<div class="zb_mask"></div>
		<!-- 這里放“頁面”數據結構(也就是原本應該在body標簽下的所有東西) -->
	</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" ></div>
		 <div class="right" >
			 flex下兩列布局左邊固定右邊寬高自適應
		 </div>
		</div>
		<div class="color"></div>
		<a href="#" rel="external nofollow" class="a">千萬小心像對a設置全局樣式(這叫啥樣式重置)</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里面放的就是“原本的頁面整體”部分。為了達到想要的效果,我們采用了flex布局!

flex簡寫時包括三個屬性:flex-grow、flex-shrink和flex-basis ——

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

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

  • flex-basis:flex-basis則是指定了固定的分配數量,默認值是auto。

設置的同時需設置width或者height屬性;

/* 列表僅水平滾動 */
.page_list { width: 100vw; display: flex; overflow-y: hidden; }
/* 主內容寬度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;
}
/* 空標簽元素,作用是騰出水平滾動空間 */
.space { flex: 0 0 12rem; }
/* 按鈕固定定位,藏在內容白色背景后面 */
.z_two_page { width: 12rem; position: fixed; right: 0; top: 0; }

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

這里需要注意的是:為什么“哈哈哈”所屬div在前而“頁面”所屬div在后?
因為根據前面所說,這里采用的是position覆蓋,它的規則就是“后面的覆蓋前面的”,所以如果采用這種布局方式,那么一開始被隱藏的元素就要放在前面。

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

那如何將“哈哈哈”展示在視野中? —— js控制“代表頁面的元素”整體移動即可。

這里有個“遮罩層效果”,按照傳統的js實現肯定就要去找display了,再進一步可以用上面所說的“display動畫效果”增強體驗。
但是本文上面css代碼中加了 pointer-events 屬性:元素是否穿透;設置為none時就可以不用在意對應元素是否存在了(從事件上看此時有和沒有一樣了),也就不用控制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;"
}

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

@media (any-hover: none) {
	.page_list{
		overflow-x: hidden;
	}
}

以上就是利用JavaScript怎么實現一個頁面側邊欄效果,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女