記錄一下我前段時間封裝的一個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 >