亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

基于Fixed定位的框選功能的實現代碼

2024-05-06 16:50:50
字體:
來源:轉載
供稿:網友

最近項目涉及到一個支持批量操作的小需求,交互上需要使用框選來觸發。在查閱了一些資料后發現,網上的方案基本都是基于絕對定位布局的,此方案如果是針對全局(在body上)的框選,還是可用的。但是現實需求里幾乎都是針對某個區域的框選。如果用絕對定位實現就比較繁瑣了,需要調整定位原點。下面介紹一種基于Fixed定位的框選實現。

需求描述

Fixed,定位,框選,代碼

  • 按住鼠標左鍵不放,移動鼠標出現選擇框
  • 在鼠標移動的過程中,在框選范圍內的元素高亮
  • 松開鼠標左鍵,彈出編輯框,批量操作所有被框選的元素

實現

事件綁定

首先梳理一下需要用到的事件。

按住鼠標左鍵,因為并沒有原生的鼠標左鍵按下事件,所以使用mousedown事件配合setTimeout模擬實現。mousedown事件綁定在當前區域上。 使用一個標志變量mouseOn來代表是否開始繪制

handleMouseDown(e) { // 判斷是否為鼠標左鍵被按下 if (e.buttons !== 1 || e.which !== 1) return; this.settimeId = window.setTimeout(() => {  this.mouseOn = true;  // 設置選框的初始位置  this.startX = e.clientX;  this.startY = e.clientY; }, 300);},handleMouseUp(e) { //在mouseup的時候清除計時器,如果按住的時間不足300毫秒 //則mouseOn為false this.settimeId && window.clearTimeout(this.settimeId) if (!this.mouseOn) return;}

這里有一個小的注意點,就是clearTimeout一定要寫成 window.clearTimeout ,否則在vue里會報錯timeout.close is not a function,具體的原因尚未找到,有大佬了解望告知。

鼠標移動,使用mousemove事件。 鼠標抬起,使用mouseup事件,注意抬起事件需要 綁定在document上 。因為用戶的框選操作不會局限在當前區域,在任意位置松開鼠標都應能夠結束框選的繪制。

選框繪制

在明確了事件之后,就只需要在幾個事件中填充具體的繪制和判斷邏輯了。先來看繪制的邏輯。在mousedown事件中,設置選框的初始位置,也就是鼠標按下的位置。這里我們提前寫好一個div,用來代表選框。

<div class="promotion-range__select" ref="select"></div>.promotion-range__select { background: #598fe6; position: fixed; width: 0; height: 0; display: none; top: 0; left: 0; opacity:.6; pointer-events: none;}

按下后顯示這個div并且設置初始定位即可

this.$refs.select.style.cssText = `display:block;                  left:${this.startX}px;                  top:${this.startY}px                  width:0;                  height:0;`;

有了初始位置,在mousemove事件中,設置選框的寬高和定位。

handleMouseMove(e) { if (!this.mouseOn) return; const $select = this.$refs.select; const _w = e.clientX - this.startX; const _h = e.clientY - this.startY; //框選有可能是往左框選,此時框選矩形的左上角就變成 //鼠標移動的位置了,所以需要判斷。同理寬高要取絕對值 this.top = _h > 0 ? this.startY : e.clientY; this.left = _w > 0 ? this.startX : e.clientX; this.width = Math.abs(_w); this.height = Math.abs(_h); $select.style.left = `${this.left}px`; $select.style.top = `${this.top}px`; $select.style.width = `${this.width}px`; $select.style.height = `${this.height}px`;},

如果使用絕對定位,就要去校準坐標原點了,在布局中嵌套多個relative定位容器的情況下,就非常繁瑣了。使用fixed定位就不需要考慮相對于哪個容器的問題了。

判斷被框選的內容

//獲取目標元素const selList = document.getElementsByClassName( "promotion-range__item-inner");const { bottom, left, right, top } = $select.getBoundingClientRect();for (let i = 0; i < selList.length; i++) { const rect = selList[i].getBoundingClientRect(); const isIntersect = !(  rect.top > bottom ||  rect.bottom < top ||  rect.right < left ||  rect.left > right ); selList[i].classList[isIntersect ? "add" : "remove"]("is-editing");}

判斷使用了getBoundingClientRect,定義引用自MDN

返回值是一個 DOMRect 對象,這個對象是由該元素的 getClientRects() 方法返回的一組矩形的集合, 即:是與該元素相關的CSS 邊框集合 。

DOMRect 對象包含了一組用于描述邊框的只讀屬性——left、top、right和bottom,單位為像素。除了 width 和 height 外的屬性都是相對于 視口的左上角 位置而言的。

從定義中可以看到getBoundingClientRect中獲取的left、top、right和bottom是相對于視口左上角的,這和fixed定位的定義是一致的。因此,我們僅需要對比選框和被框選元素的四個定位值即可。

rect.top > bottom 被框選元素位于選框上方

rect.bottom < top 被框選元素位于選框下方

rect.right < left 被框選元素位于選框左側

rect.left > right 被框選元素位于選框右側

排除這四種情況以外就是選框和被框選元素存在交集,給這些div加上class,因為移動過程中也需要讓用戶感知到被框選的元素,所以上述方法在mousemove中也要執行。

在mouseup中判斷被框選元素后,將選框置為display:none。

功能demo地址

參考鏈接

https://developer.mozilla.org/zh-CN/docs/Web/CSS/position
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久视频这里只有精品| 亚洲色图13p| 日韩精品高清在线| 日韩中文在线视频| 久久99亚洲热视| 久久免费视频在线| 中国日韩欧美久久久久久久久| 在线观看欧美日韩国产| 日韩在线观看免费| 伊人久久精品视频| 久久久日本电影| 成人黄色免费看| 国产精品视频精品视频| 韩国一区二区电影| 国产精品免费视频久久久| 国产www精品| 精品国产一区二区三区久久| 97久久超碰福利国产精品…| 性色av香蕉一区二区| 中文在线不卡视频| 国产精品一区av| 久久久视频精品| 欧美黑人性猛交| 欧美成人在线免费视频| 奇米四色中文综合久久| 日韩在线资源网| 久久成人一区二区| 韩国精品美女www爽爽爽视频| 亚洲一区二区福利| 一本色道久久88综合亚洲精品ⅰ| 亚洲成人网在线| 国产精品久久久久久久久免费看| 亚洲天堂网站在线观看视频| 久久久久国产精品免费| 亚洲国产日韩一区| 久久久欧美一区二区| 日韩网站免费观看高清| 亚洲国产精品专区久久| 欧美性xxxx极品高清hd直播| 日韩av综合网| 欧美一级bbbbb性bbbb喷潮片| 国产精品揄拍500视频| 午夜精品久久久久久99热| 日韩在线视频网站| 欧美老女人在线视频| 成人午夜黄色影院| 国产精品h片在线播放| 亚洲free性xxxx护士白浆| 国产精自产拍久久久久久| 国产999精品久久久| 亚洲国产高清福利视频| 一本色道久久综合亚洲精品小说| 欧美国产第二页| 国产国语刺激对白av不卡| 日韩视频亚洲视频| 久久久久久亚洲精品| 亚洲成av人片在线观看香蕉| 亚洲四色影视在线观看| 国语自产精品视频在线看一大j8| 色综合久久久久久中文网| 成人久久18免费网站图片| 疯狂欧美牲乱大交777| 97视频免费在线观看| 中文字幕无线精品亚洲乱码一区| 欧美大尺度激情区在线播放| 大桥未久av一区二区三区| 亚洲一区二区三区视频| 91精品在线国产| 成人免费高清完整版在线观看| 欧美黑人一级爽快片淫片高清| 欧美日韩在线看| 欧美激情精品久久久久久久变态| 国产免费一区二区三区在线观看| 粉嫩av一区二区三区免费野| 欧美性猛交xxx| 欧美多人乱p欧美4p久久| 91精品在线观看视频| 亚洲男人av电影| 久久成人综合视频| 久久精品国产欧美亚洲人人爽| 欧美激情一二区| 亚洲精品suv精品一区二区| 欧美老妇交乱视频| 国产三级精品网站| 国产狼人综合免费视频| 亚洲精品视频久久| 亚洲欧美精品在线| 九九热r在线视频精品| 欧美性少妇18aaaa视频| 狠狠躁夜夜躁人人爽天天天天97| 中文字幕国产精品久久| 中文字幕国产亚洲2019| 中文字幕v亚洲ⅴv天堂| 成人中文字幕在线观看| 欧美激情视频一区二区| 视频在线观看一区二区| 日韩美女毛茸茸| 中文字幕av一区二区三区谷原希美| 欧美伦理91i| 日韩成人激情视频| 久久久这里只有精品视频| 26uuu亚洲国产精品| 亚洲免费精彩视频| 久久久久久国产三级电影| 17婷婷久久www| 欧美成人一区二区三区电影| 欧美日韩第一页| 伊人久久男人天堂| 国产精品欧美亚洲777777| 日韩av资源在线播放| 国产91精品视频在线观看| 亚洲综合色激情五月| 2019中文字幕免费视频| 日韩高清免费在线| 久久视频在线看| 久久影视电视剧凤归四时歌| 成人av资源在线播放| 国产成人一区二区| 91免费人成网站在线观看18| 69av成年福利视频| 欧美黄色www| 日本一区二三区好的精华液| 国产精品丝袜高跟| 亚洲精品久久久久久下一站| 欧美日韩中文字幕综合视频| 久久久久久国产精品三级玉女聊斋| 亚洲第一免费网站| 色久欧美在线视频观看| 日韩女优在线播放| 97超级碰碰碰久久久| 成人精品一区二区三区电影黑人| 欧美激情亚洲一区| 国产99在线|中文| 亚洲欧美制服另类日韩| 欧美一区二区三区免费观看| 亚洲美女福利视频网站| 日韩中文字幕在线观看| 色天天综合狠狠色| 日韩免费中文字幕| 日产精品99久久久久久| 久久精品99久久久香蕉| 麻豆国产精品va在线观看不卡| 日日骚久久av| 欧美亚洲国产日本| 91精品国产综合久久香蕉| 国产精品白嫩美女在线观看| 777国产偷窥盗摄精品视频| 97成人超碰免| 亚洲精品免费在线视频| 97超碰国产精品女人人人爽| 久久久免费高清电视剧观看| 久久精品久久久久| 成人国内精品久久久久一区| 色综合伊人色综合网站| 在线观看日韩av| 色一情一乱一区二区| 国产欧美久久一区二区| 91九色视频在线| 亚洲国产成人精品电影| 欧美裸体xxxx极品少妇软件| 成人精品在线观看| 亚洲色图色老头| 欧美人与性动交| 岛国av一区二区三区|