原生JS拖拽模型(有限制範圍的)

2021-10-01 15:54:03 字數 2865 閱讀 5870

思路:

確定盒子的移動的方式

​ 1、 定位的left top值可以讓盒子移動

​ 2、直接margin 頂(在文件流中,不建議) 父元素的padding頂 (更加不建議)

​ 使用left來實現 ,需要設定定位。全部用 相對定位(疊加計算) 絕對定位都能實現(相對是誰,如果**多,會很亂。),

這裡我們使用 父相子絕(邊界相對定位,移動的盒子絕對定位)

確定是否有邊界

​ 移動的盒子不能超過設定的邊界。

​ 判斷邊界有很多方法。可以使用移動盒子的四個角到視口的距離判斷,也可以使用盒子能夠移動的left來進行判斷邊界。

​ 這裡我們使用 可以移動的最大值來判斷。

橫向可以移動的最大 就是邊界寬 - 移動盒子的寬

縱向可以移動的最大top 就是邊界的高 - 移動盒子的高

思考都觸發了什麼事件。

​ 盒子被拖動,首先需要 盒子被滑鼠 按下不抬起(onmousedown), 然後是拖動(onmousemove),滑鼠鬆開(onmouseup)

深度思考。 確保滑鼠在觸發滑鼠按下不抬起的點,移動到終點的時候,點還在盒子的上相同位置。這個盒子該怎麼樣繪製。

我們這裡使用的思路就是

盒子移動,需要知道滑鼠 「點」在** ,然後根據移動後的「點」再繪製盒子,這裡通過為盒子設定的left和top值,讓盒子移動,移動的left和top減去點在盒子上的距離。就可以保證點還在盒子的相同位置上。

​ 我們可以盒子的四個角來做運算,我們這裡選擇使用 左上角來計算 left值和top值。

這個時候我們又有了兩種演算法,left 可以相對於 父元素的邊框,也可以根據上次移動的left 進行疊加。其實,這都是相對于父元素的邊框。(注意,我們的盒子現在是絕對定位。)來一張醜陋的圖。我們不用疊加。用簡單,不走坑的,相對於大盒子的left。

​ 那麼此時, 需要小盒子左邊框的值到黑盒子,我們可以通過 左上角的點來算。

​ 點在** 使用唯讀屬性 offsetx 和offsety 得到滑鼠的點在小盒子中的位置

​ 小黑盒子 : 點到視口的位置 clientx clienty 減去 點在小綠盒子的offsetx 和 offsety

​ 再減去 大盒子 到視口的位置(pagex),大盒子到視口的位置可以選擇使用 getcomputedstyle(ie也不支援,我用的ie全指的是ie8,ie用的解析是currentstyle。可以做這麼乙個相容) 瀏覽器解析之後的樣式計算,也可以使用pagex,pagey 求得

​ 這裡我們使用pagex和 pagey 來做圖。(page是事件物件,並且ie不支援。下一遍原生js封裝page函式,就可以呼叫page函式來實現,**我們暫時先用getcomputedstyle。想要相容的小夥伴可以解析樣式這裡做乙個相容)。

​ 然後進去大盒子的邊框。(這裡我們使用clientleft得到左邊框)。然後就可以得到的 left 移動值, 相對於大黑盒子移動left。就可以達到相同的位置(展示)

​ 所以移動的left值就為

left值 = 移動後「點」的視口的x座標 - 元素的偏移x座標(offsetx) - 父元素到頁面的距離(pagex) - 父元素的邊框(clientleft)。

1、 需要的事件 onmousedown、onmousemove、onmouseup

2、使用定位的left和top 來作為盒子移動。

3、邊界的判斷使用 可以移動的最大值

*

#box

#move

"box"

>

"move"

>

div>

div>

var box = document.

getelementbyid

('box');

var move = document.

getelementbyid

('move');

// 最大可以移動距離

var maxleft =

parsefloat

(getcomputedstyle

(box)

.width)

-parsefloat

(getcomputedstyle

(move)

.width)

;var maxtop =

parsefloat

(getcomputedstyle

(box)

.height)

-parsefloat

(getcomputedstyle

(move)

.height)

;// 獲得盒子到 距離 視口 的寬和高

var leftt =

getcomputedstyle

(box)

.marginleft;

// 得到的是px

var topp =

getcomputedstyle

(box)

.top;

move.

onmousedown

=function

(e)}

// 滑鼠抬起

document.

onmouseup

=function()

原生JS拖拽

想要讓整個元素移動需要三個事件 滑鼠按下 onmousedown 滑鼠移動 onmousemove 滑鼠抬起 onmouseup html 登入會員 關閉使用者名稱 登入密碼 登入會員 頁面效果如下 jsvar login document.queryselector login 獲取整個彈框的內容...

原生js實現拖拽盒子

盒子必須是絕對定位的盒子 滑鼠在盒子內部按下時獲得相對座標。事件物件在頁面的位置減去盒子距離body的距離 滑鼠移動時,使得盒子的位置發生變化 滑鼠鬆開時,不再拖動 移動事件失效 lang zh charset utf 8 name viewport content width device wid...

原生JS拖拽改變元素大小

js運動,js動畫,js拖拽。我們在之前了解過拖拽的原理,其實利用這個原理我們能夠實現很多效果。今天就來介紹一下,利用拖拽方法來改變元素的大小。這個效果其實非常常見,比如說我們可以將滑鼠放在瀏覽器的邊邊上,然後瀏覽器游標就會變成可以拖拽的樣子,我們可以往左或往右拖拽。我們來實現這個效果。原理 先看一...