原生JavaScript實現(xiàn)拖拽功能制作滑動條的實例教程


//獲取外包裹元素var eBarWrap = document.getElementById('wrap');//獲取滑動條var eBarCon = eBarWrap.getElementsByClassName('bar_container')[0];//獲取滑動痕跡元素var eBarInto = eBarWrap.getElementsByClassName('bar_into')[0];//獲取滑塊var eBarDrag = eBarWrap.getElementsByClassName('bar_drag')[0];//獲取文本元素var eBarText = eBarWrap.getElementsByClassName('bar_text')[0];
因為滑塊只能在滑動條內(nèi)滑動,所以需要限制最大滑動位置。而DOM元素計算位置是從元素的左側(cè)開始,所以最大值應(yīng)該是 滑動條的寬度-滑塊 的寬度,如下所示:
//獲取最大位置var nMax = eBarCon.offsetWidth - eBarDrag.offsetWidth;
//滑塊添加拖拽事件eBarDrag.addEventListener('mousedown',function(event){});
需要拖動滑塊,肯定要先知道滑塊原來的位置,才能根據(jù)鼠標(biāo)的移動來拖拽滑塊。在滑塊上綁定的事件函數(shù)上有傳入一個event對象,這個event對象代表當(dāng)前事件的實例對象,包含當(dāng)前事件相關(guān)信息。
//滑塊添加拖拽事件eBarDrag.addEventListener('mousedown',function(event){//初始化鼠標(biāo)開始拖拽的點擊位置var nInitX = event.clientX;//初始化滑塊位置var nInitLeft = this.offsetLeft;});
操作時,在滑塊上按下鼠標(biāo),再移動鼠標(biāo)就可以使滑塊跟隨鼠標(biāo)移動。但一般移動鼠標(biāo)不可能只在滑動條上面移動,所以需要在頁面上綁定鼠標(biāo)移動事件,如下所示:
//滑塊添加拖拽事件eBarDrag.addEventListener('mousedown',function(event){/*...*///頁面綁定鼠標(biāo)移動事件document.onmousemove = event=>{//鼠標(biāo)移動時取消默認行為,避免選中其他元素或文字event.preventDefault();//獲取鼠標(biāo)移動后滑塊應(yīng)該移動到的位置let nX = event.clientX - nInitX + nInitLeft;//限制滑塊最大移動位置if(nX>=nMax){nX = nMax;}//限制滑塊最小移動位置if(nX<=0){nX = 0;}//修改滑塊位置(因為用的是箭頭函數(shù),所以this還是指向滑塊)this.style.left = nX + 'px';//修改滑動痕跡寬度eBarInto.style.width = nX + this.offsetWidth/2 + 'px';//修改文本數(shù)值eBarText.innerhtml = Math.ceil(nX/nMax*100)/10;};});
當(dāng)釋放鼠標(biāo)的時候,滑塊固定在當(dāng)前移動到的位置,滑動痕跡和文本數(shù)值已經(jīng)一起修改。
//滑塊添加拖拽事件eBarDrag.addEventListener('mousedown',function(event){/*...*///鼠標(biāo)松開綁定事件,取消頁面上所有事件document.onmouseup = function(event){document.onmousemove = null;document.onmouseup = null;}});
//修改默認數(shù)值eBarText.innerHTML = 0;
當(dāng)點擊滑動條上除滑塊之外的位置時,滑塊應(yīng)該直接滑動到鼠標(biāo)點擊的位置。需要在滑動條上添加點擊事件實現(xiàn)此功能,代碼如下:
//滑動條添加點擊事件eBarCon.addEventListener('click',function(event){//設(shè)置滑動條位置var nLeft = this.offsetLeft;//獲取有定位的父元素var eParent = this.offsetParent;//循環(huán)所有有定位的父元素while(eParent){//添加定位父元素offsetLeft值,用于準(zhǔn)確定位滑動條與頁面左側(cè)的距離nLeft += eParent.offsetLeft;//再次獲取父元素外的定位父元素eParent = eParent.offsetParent;}//計算滑塊位置var nX = event.clientX - nLeft;//修改滑塊位置eBarDrag.style.left = nX +'px';//修改滑動痕跡寬度eBarInto.style.width = nX + eBarDrag.offsetWidth/2 + 'px';//修改文本數(shù)值eBarText.innerHTML = Math.ceil(nX/nMax*100)/10});

評論
圖片
表情
