一種離譜到極致的頁面側邊欄效果探究
發現:display動畫的應用
整件事的起因是什麼呢?在筆者最近為社團計劃的官網上打算做一個這樣的效果:點選頭像,左邊/右邊滑出一個“皮膚”,裡面展示使用者的個人資訊。
當然,這有很多種做法,比如:利用position定位+overflow溢位隱藏、利用opacity/visibility隱藏+pointer-events元素穿透… 但是筆者當時想到的是如何給”真正的隱藏,display“加上動畫!
我們大概都知道的是:HTML渲染過程中有一個可能執行的、影響頁面效能的“迴流”和“重繪”的過程。導致這個過程被觸發的原因有很多:元素位置移動、大小改變、增刪節點以及這裡要說的display顯示與隱藏切換等等。而元素的變動需要頁面快速的顯示出來,所以在我們看來是“突兀”的。
而且有一點需要注意的是:瀏覽器是“有點智慧”的 —— 它可以判斷如果會觸發頁面迴流的程式碼有很多,那麼它會將這些程式碼都讀取完再(合併)一起執行,所以這也是下面這段程式碼會有如下圖效果的原因:
/** 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>
<div>
<!-- 這裡放右側彈框展示的資訊 -->
</div>
<div>
<!-- "頁面"的遮罩層 -->
<div></div>
<!-- 這裡放“頁面”資料結構(也就是原本應該在body標籤下的所有東西) -->
</div>
<!-- 這是佔位元素 -->
<div></div></div>
實際就像這樣的:
<div>
<div>哈哈哈</div>
<div>
<div></div>
<div id="boxs">
<div style="background-color:#ffc5c5;"></div>
<div style="background-color:#7171f7;">
flex下兩列布局左邊固定右邊寬高自適應
</div>
</div>
<div></div>
<a href="#">千萬小心像對a設定全域性樣式(這叫啥樣式重置)</a>
<div>
<div></div>
<button>到指定地點</button>
</div>
<form id="form" action="#">
<input type="submit" value="="踢腳板 />
</form>
<img id="img" src="compress/compress/img/mxc_16x16.png" />
</div>
<div></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.>
box.style.marginLeft="-12rem";
mask.style.cssText+="opacity: 1;pointer-events: all;"}
mask.>
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;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989477/viewspace-2754869/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TornadoFx實現側邊欄選單效果
- Flutter drawer側邊欄Flutter
- 直播app原始碼,根據頁面滾動高亮顯示目錄的側邊欄APP原始碼
- 又一個 iOS 側邊欄元件: SideMenuiOS元件IDE
- 線上直播原始碼,JS動態效果之,側邊欄滾動固定效果原始碼JS
- Vue Element Admin 新增側邊欄Vue
- jQuery固定側邊欄外掛ssMenujQuerySSM
- Flutter側邊欄控制元件-SideBarFlutter控制元件IDE
- OctoberCMS 外掛學習 側邊欄
- flutter實戰1:完成一個有側邊欄的主介面Flutter
- 更改 Sublime text 3 側邊欄字型大小
- SideNotes:螢幕側邊欄的高效筆記應用IDE筆記
- 具有緩衝效果的側欄展開客服系統
- vue-element-admin之修改側邊欄的icon圖示Vue
- Typora 隱藏側邊欄圖片資料夾
- Qt介面設計--側邊欄隱藏和滑出QT
- Vue後臺管理開發之側邊欄(初稿)Vue
- Win10 隱藏左側邊側欄(導航視窗)中的資料夾Win10
- sublime設定預設開啟側邊欄(失敗)
- 三星新專利將邊緣曲面屏推向極致:兩側完全被螢幕包裹
- 微軟推出全新Win10 App Project Newsbar:桌面右側新聞側邊欄微軟Win10APPProject
- jQuery簡單實用的響應式固定側邊欄外掛jQuery
- CSS3實現側邊欄快速定位的隱藏和消失CSSS3
- React 折騰記 - (3) 結合Mobx實現一個比較靠譜的動態tab水平選單,同時關聯側邊欄React
- React 折騰記 – (3) 結合Mobx實現一個比較靠譜的動態tab水平選單,同時關聯側邊欄React
- 影片直播原始碼,預設展開側邊欄選單原始碼
- 如何用 CocosCreator 對接抖音小遊戲的側邊欄復訪遊戲
- 給你的頁面帶上側滑返回——SlideBackIDE
- 使用webpack從0搭建多入口網站腳手架,可複用導航欄/底部通欄/側邊欄,根據頁面檔案自動更改配置,支援ES6/LessWeb網站
- jQuery點選彈出側邊欄提示資訊皮膚特效jQuery特效
- 直播軟體搭建,通過Android DrawerLayout實現側邊欄功能Android
- ElementUI側邊欄導航選單隱藏顯示問題UI
- 網頁頂部陰影邊框效果網頁
- 彈性效果網頁右側浮動框詳解網頁
- alicdn邊緣節點不穩定導致頁面崩潰問題
- 頁面內跳轉到相應位置的3種方法
- JavaScript 頁面跳轉效果JavaScript
- 適合移動手機的jQuery多級側邊欄選單外掛jQuery