JavaScript側欄緩動分享選單詳解
本章節分享一段程式碼例項,它實現了簡單的側欄導航選單分享功能。
此程式碼具有緩動跟隨效果,這是比較人性化且動態功能,下面詳細介紹一下它的實現。
程式碼如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> body{ margin:0; padding:0; font:12px/1.5 arial; height:2000px; } #antzone{ width:100px; height:200px; line-height:200px; text-align:center; border:1px solid #ccc; background:#f5f5f5; position:absolute; left:-100px; top:0; } #antzone_tit{ position:absolute; right:-20px; top:60px; width:20px; height:60px; padding:10px 0; background:#06c; text-align:center; line-height:18px; color:#fff; } </style> <script> window.onload = function(){ var antzone = document.getElementById("antzone"); antzone.onmouseover = function(){ startrun(antzone,0,"left") } antzone.onmouseout = function(){ startrun(antzone,-100,"left") } window.onscroll = window.onresize = function(){ var scrtop=document.documentElement.scrollTop; var height=document.documentElement.clientHeight; var top = scrtop + (height - antzone.offsetHeight)/2; top = parseInt(top); startrun(antzone,top,"top") } } var timer = null function startrun(obj,target,direction){ clearInterval(timer); timer = setInterval(function(){ var speed = 0; if(direction == "left"){ speed = (target-obj.offsetLeft)/8; speed = speed>0?Math.ceil(speed):Math.floor(speed); if(obj.offsetLeft == target){ clearInterval(timer); } else{ obj.style.left = obj.offsetLeft + speed + "px"; } } if(direction == "top"){ speed = (target-obj.offsetTop)/8; speed = speed>0?Math.ceil(speed):Math.floor(speed); if(obj.offsetTop == target){ clearInterval(timer); } else{ obj.style.top = obj.offsetTop + speed + "px"; } } },30) } </script> </head> <body> <div id="antzone"> 分享到內容 <span id="antzone_tit">分享到</span> </div> </body> </html>
上面的程式碼實現了我們的要求,下面介紹一下它的實現過程。
一.實現原理:
分享選單之所以位置能夠移動是通過將antzone元素設定為絕對定位,然後調整它的left或者top值來實現。
"分享到"按鈕之所以能夠突出出來是因為將span元素設定為絕對定位,然後將right值設定為負數。由於父元素是採用絕對定位的,所以這個span元素的定位參考物件就是父元素。
拖動滾動條能夠實現跟隨效果是因為註冊了onscroll事件處理函式,然後進行調整相應的top值,並採用緩衝運動效果。
二.程式碼註釋:
(1).window.onload = function(){},當文件內容完全載入完畢再去執行函式中的程式碼。
(2).var antzone = document.getElementById("antzone"),獲取id屬性值為antzone的元素物件。
(3).antzone.onmouseover = function(){
startrun(antzone,0,"left")
},為antzone元素註冊onmouseover事件處理函式。
(4).antzone.onmouseout = function(){
startrun(antzone,-100,"left")
},為antzone元素註冊onmouseout事件處理函式。
(5).window.onscroll = window.onresize = function(){},為window註冊onscroll事件處理函式,也就是當拖動視窗滾動條的時候能夠觸發此事件。
(6).var scrtop=document.documentElement.scrollTop,獲取向上滾動的距離。
(7).var height=document.documentElement.clientHeight|,獲取客戶區的高度。
(8).var top = scrtop + (height - antzone.offsetHeight)/2,這段程式碼的目的是將選單最終的停留位置設定為客戶區垂直居中。
(9).top = parseInt(top),轉換為整數,好像沒必要進行轉換。
(10).startrun(antzone,top,"top"),呼叫此方法進行緩衝運動效果。
(11).var timer = null,宣告一個變數,它將作為定時器函式的標誌。
(12).function startrun(obj,target,direction),此方法實現了緩衝運動定位效果,第一個引數是要定位的元素,這裡也就是選單,第二個引數規定最終選單的位置,第三個引數規定緩衝運動的方向。
(13).clearInterval(timer),停止上一個定時器函式的執行,否則可能會造成多個定時器函式重疊執行的情況。
(14).timer = setInterval(function(){},30),每隔30秒執行一次回撥函式。
(15).if(direction == "left"){
speed = (target-obj.offsetLeft)/8;
speed = speed>0?Math.ceil(speed):Math.floor(speed);
if(obj.offsetLeft == target){
clearInterval(timer);
}
else{
obj.style.left = obj.offsetLeft + speed + "px";
}
}判斷運動的方向。
運動的速度是通過目標座標位置和當前位置的差,並通過一定的計算來確定的,由於這個差越來越小,所以會產生緩衝效果。
當於運動到指定位置的時候就會停止定時器函式的執行。
三.相關閱讀:
(1).onresize事件參閱JavaScript resize 事件一章節。
(2).document.documentElement.scrollTop參閱JavaScript scrollTop一章節。
(3).document.documentElement.clientHeight參閱JavaScript clientHeight一章節。
(4).offsetHeight參閱offsetHeight一章節。
(5).parseInt()方法參閱JavaScript parseInt()一章節。
(6).Math.ceil()方法參閱JavaScript Math.ceil()一章節。
(7).Math.floor()方法參閱JavaScript Math.floor()一章節。
相關文章
- JavaScript 側欄選項卡JavaScript
- vue 動態載入路由,渲染左側選單欄Vue路由
- HTML歷理 ICbA的側欄選單HTML
- TornadoFx實現側邊欄選單效果
- JavaScript 動畫效果緩慢二級下拉選單JavaScript動畫
- JavaScript二級下拉選單詳解JavaScript
- 適合移動手機的jQuery多級側邊欄選單外掛jQuery
- 影片直播原始碼,預設展開側邊欄選單原始碼
- 具有緩衝效果的側欄展開客服系統
- 採用JavaScript+XML實現具有樹形選單功能的論壇側邊導航欄JavaScriptXML
- ElementUI側邊欄導航選單隱藏顯示問題UI
- 使用Vue實現後臺管理系統的動態路由以及側邊欄選單Vue路由
- React 折騰記 - (4) 側邊欄聯動Tabs選單-增強版(結合Mobx)React
- vue-element-admin左側選單欄隱藏功能去除修改Vue
- JavaScript滑鼠懸浮展開側欄導航JavaScript
- css3實現側邊滑動選單CSSS3
- JavaScript 緩衝運動JavaScript
- 『言善信』Fiddler工具 — 3、Fiddler介面佈局詳解【選單欄】
- JavaScript左右滑動切換的選項卡詳解JavaScript
- 分享一下解決Dcat Admin左側選單不重新整理的問題
- [BUG反饋]為什麼左側選單欄和導航欄無緣無故消失了
- 工具欄選單
- JavaScript動態操作select下拉選單JavaScript
- 在PyQt中構建 Python 選單欄、選單和工具欄QTPython
- JavaScript點選按鈕返回底部詳解JavaScript
- 彈性效果網頁右側浮動框詳解網頁
- Flutter 側滑欄及城市選擇UI的實現FlutterUI
- JavaScript滑動門特效詳解JavaScript特效
- 【Flutter 專題】130 圖解 DraggableScrollableSheet 可手勢滑動的選單欄Flutter圖解
- JavaScript核取方塊全選和全不選詳解JavaScript
- JavaScript實現HTML導航欄下拉選單[懸浮顯示]JavaScriptHTML
- Flutter drawer側邊欄Flutter
- 模擬select下拉選單詳解
- 原生Android 側滑選單實踐(部分)Android
- JavaScript自定義滾動條詳解JavaScript
- Ubuntu 20.04 自動隱藏左側導航欄Ubuntu
- Android最簡單的側劃選單,DrawerLayout的使用Android
- JS錯誤記錄 – 右側懸浮框 – 緩衝運動JS