vue封裝一個簡單的div框選時間的組件

来源:https://www.cnblogs.com/zqw111/archive/2019/08/03/11295525.html
-Advertisement-
Play Games

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

這樣再發佈既可以了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • jdbc:mysql://localhost:3306/db_film?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8每次把資料庫問好後面的加上,什麼時區問題還是亂碼問題全都解決謝謝! ...
  • NameNode並不會將文件的分塊數據持久化存儲,這些信息會在HDFS啟動時由各個dataNode上報過來。他把這些數據存入記憶體中。並且會定時對記憶體中的數據進行快照。所以對於NameNode節點的機器記憶體應該大一些 ...
  • 背景介紹 我們先來看一下為什麼要做集群,如果我們要部署一個單節點Redis,很明顯會遇到單點故障的問題。 首先能想到解決單點故障的方法,就是做主從,但是當有海量存儲需求時,單一的主從結構就會出問題,說問題之前要先瞭解一下主從之間是如何複製的。 我們把Redis分為三個部分,分別是客戶端、主節點以及從 ...
  • 1、視圖的概念 視圖是關係資料庫系統提供給用戶以多角度觀察資料庫中數據的重要機制。它不僅滿足了各用戶的個性需要,還提供了一種屏蔽未授權數據或無關數據的保護機制,將用戶的處理或查詢操作限定在他有權處理或查詢的數據上。 視圖是從一個或多個基本表和視圖導出的虛表,它只有定義,沒有對應的物理數據。視圖中的內 ...
  • Win7 Eclipse 搭建spark java1.8環境:WordCount helloworld例子 ...
  • 眾所周知, iOS開發找工作越來越難, 企業要求越來越高,一方面是資本寒冬期+七八月是企業招人淡季, 另外一方面也是iOS市場飽和。最近有出去看新機會, 所以下麵記錄一下麵試XimalayaFM的大概過程。 面試一共分為4輪,全程手寫代碼和演算法。 一面:自我介紹, 然後問一下手頭開發App日活和崩潰 ...
  • 在網路中,數據交互通常是以XML和Json的格式進行,所以對這兩種格式的數據進行解析,是Android開發中的必備功能,本文以一個簡單的小例子,簡述Android開發中Xml和Json解析的常用方式,僅供學習分享使用。 ...
  • #0x00 前言 安卓應用加固技術是伴隨安卓應用破解技術一同發展起來的。加固技術分為加殼保護和反反彙編保護技術。市面上成熟的加固廠商一般會使用加殼保護技術配合反反彙編技術對安卓應用進行加固。 安卓反反彙編技術的總結在我另一篇博客中將進行詳細探討,鏈接: http://................ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...