vue封裝一個簡單的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 > this.left let condition2 = itemY_pos > this.top let condition3 = fileDivs[i].offsetLeft < (this.left + this.width) let condition4 = fileDivs[i].offsetTop < (this.top + this.height) if (condition1 && condition2 && condition3 && condition4) {// 在框選范圍之內 fileDivs[i].classList.add('temp-selected') } else { fileDivs[i].classList.remove('temp-selected') } }

鼠標抬起,增加選中class

 let selectDom = document.getElementsByClassName('temp-selected'); [].slice.call(selectDom).forEach(item => { if (item.classList.contains('selected')) { item.classList.remove('selected') } else { item.classList.add('selected') } item.classList.remove('temp-selected') }) if (this.selectBoxDashed) { try { this.selectBoxDashed.parentNode.removeChild(this.selectBoxDashed) } catch (err) { // console.log(err) } } let fileDivs = document.getElementsByClassName('list') // 這里是改變數據 for (let i = 0; i < fileDivs.length; i++) { if (fileDivs[i].classList.contains('selected')) { this.timeList[i] = '1' } else { this.timeList[i] = '0' } }

效果如下如:

enter image description here

代碼發布到npm

這個組件,包括我之前寫的vue移動端下拉加載下一頁數據的組件,都發布到了npm,

npm地址:https://www.npmjs.com/package/timedivselect

使用:

npm install timedivselect -S import timeDivSelect from 'timedivselect'

使用例子:

https://www.jkys120.com

順便說說npm發布遇到的一個小問題吧

之前我npm也發布過一些,關於如何發布npm包,我博客之前雖然沒有寫,但是網上很多。

第一次用的時候一般是:

npm adduser // 輸入用戶名,密碼等【npm 網站要提前注冊,npm網站的用戶名和密碼】

不是第一次

npm login

發布、刪除等

npm publish // 發布 npm unpublish 包名 // 撤銷刪除

回到正題,我今天遇到的問題是npm: no_perms Private mode enable, only admin can publish this module

之前發布都是好好的,為啥突然這次發布會有這個錯誤信息呢?原來是因為我指定了npm的淘寶鏡像。

目前推薦使用NRM

sudo npm install -g nrm

查看源列表

nrm ls

使用某個源

nrm use npm

這樣再發布既可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM