記錄一下我前段時間封裝的一個vue組件吧。技術需要積累,有時間我把我之前寫的還不錯的組件都開源出來。並嘗試vue和react 兩種方式的組件封裝。今天簡單寫下滑鼠框選div選中效果的封裝吧。 div框選實現 div框選效果,其實沒有什麼好的方法,就是獲取滑鼠事件,根據滑鼠的位置,動態創建一個跟隨滑鼠 ...
記錄一下我前段時間封裝的一個vue組件吧。技術需要積累,有時間我把我之前寫的還不錯的組件都開源出來。並嘗試vue和react 兩種方式的組件封裝。今天簡單寫下滑鼠框選div選中效果的封裝吧。
div框選實現
div框選效果,其實沒有什麼好的方法,就是獲取滑鼠事件,根據滑鼠的位置,動態創建一個跟隨滑鼠的div。【註:這種方式需要依賴position的定位方式,一般滑鼠事件位置是針對全局的,所以滑鼠框選的div 位置的position最好父級元素是根元素的定位。不然,滑鼠框選區域和被框選區域很難保持一致。】
其實總結起來就兩步:
滑鼠左鍵按下不放,移動滑鼠出現矩形選框;
滑鼠左鍵鬆開,根據上邊出現的矩形選框統計選框範圍內的DOM元素;
創建一個跟隨滑鼠的div,代碼如下:
// 創建選框節點
this.selectBoxDashed = document.createElement('div')
this.selectBoxDashed.className = 'haorooms-select-box'
document.body.appendChild(this.selectBoxDashed)
this.scrollX = document.documentElement.scrollLeft || document.body.scrollLeft
this.scrollY = document.documentElement.scrollTop || document.body.scrollTop
// 設置選框的初始位置
this.startX = e.x + this.scrollX || e.clientX + this.scrollX // e是滑鼠事件的event
this.startY = e.y + this.scrollY || e.clientY + this.scrollY // e是滑鼠事件的event
this.selectBoxDashed.style.cssText = `left:${this.startX}px;top:${this.startY}px`
滑鼠移動,獲取被選中div列表,增加一個臨時class
this.selectBoxDashed.style.display = 'block' // 上面創建的滑鼠跟隨div出現
// 根據滑鼠移動,設置選框的位置、寬高
this.initx = e.x + this.scrollX || e.clientX + this.scrollX //滑鼠移動的初始位置+滾動軸的位置
this.inity = e.y + this.scrollY || e.clientY + this.scrollY
// 暫存選框的位置及寬高,用於將 select-item 選中
this.left = Math.min(this.initx, this.startX)
this.top = Math.min(this.inity, this.startY)
this.width = Math.abs(this.initx - this.startX)
this.height = Math.abs(this.inity - this.startY)
this.selectBoxDashed.style.left = `${this.left}px`
this.selectBoxDashed.style.top = `${this.top}px`
this.selectBoxDashed.style.width = `${this.width}px`
this.selectBoxDashed.style.height = `${this.height}px`
let fileDivs = document.getElementsByClassName('list') // 獲取要選中的div列表
for (let i = 0; i < fileDivs.length; i++) {
let itemX_pos = fileDivs[i].offsetWidth + fileDivs[i].offsetLeft
let itemY_pos = fileDivs[i].offsetHeight + fileDivs[i].offsetTop
let condition1 = itemX_pos >