javascript中實(shí)現(xiàn)框選的功能非常常見,可以用于選擇一段文本,或者選擇一個(gè)區(qū)域內(nèi)的元素,提供用戶更便利的操作體驗(yàn)。
框選的實(shí)現(xiàn)方式一般是監(jiān)聽鼠標(biāo)的mousedown、mousemove、mouseup這三個(gè)事件,記錄鼠標(biāo)按下時(shí)的坐標(biāo),移動(dòng)時(shí)的坐標(biāo),以及鼠標(biāo)松開時(shí)的坐標(biāo),然后計(jì)算出選擇框的坐標(biāo)和尺寸,通過CSS屬性設(shè)置選擇框的樣式。
let start, end, x, y, w, h; let isSelecting = false; const container = document.querySelector('.container'); container.addEventListener('mousedown', (e) =>{ if (e.button !== 0) return; isSelecting = true; start = [e.clientX, e.clientY]; }); container.addEventListener('mousemove', (e) =>{ if (!isSelecting) return; end = [e.clientX, e.clientY]; const [left, top] = [start[0]< end[0] ? start[0] : end[0], start[1]< end[1] ? start[1] : end[1]]; x = left + window.pageXOffset; y = top + window.pageYOffset; w = Math.abs(start[0] - end[0]); h = Math.abs(start[1] - end[1]); selectBox.style.left = x + 'px'; selectBox.style.top = y + 'px'; selectBox.style.width = w + 'px'; selectBox.style.height = h + 'px'; }); container.addEventListener('mouseup', (e) =>{ if (e.button !== 0) return; isSelecting = false; // do something with selected area });
在選擇框的基礎(chǔ)上,我們可以實(shí)現(xiàn)一些常用的功能,比如框選文本、框選元素。下面分別介紹。
框選文本
let selectedText = ''; document.addEventListener('mouseup', () =>{ selectedText = window.getSelection().toString(); });
可以通過監(jiān)聽document上的mouseup事件,在鼠標(biāo)釋放時(shí)獲取選擇的文本內(nèi)容,同時(shí)也可以與選擇框結(jié)合使用。
框選元素
const elements = document.querySelectorAll('.element'); const selectedElements = []; document.addEventListener('mouseup', () =>{ elements.forEach((element) =>{ const bcr = element.getBoundingClientRect(); const [left, top] = [bcr.left + window.pageXOffset, bcr.top + window.pageYOffset]; const [elementX, elementY] = [left + (bcr.width / 2), top + (bcr.height / 2)]; if (elementX >x && elementX< x + w && elementY >y && elementY< y + h) { selectedElements.push(element); } }); });
可以通過獲取元素的位置信息,判斷元素是否被框選到。
總的來說,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的框選功能并不難,但在實(shí)際使用中需要考慮到各種情況,比如多次框選、單次框選、選擇框樣式等等,以提供穩(wěn)定且靈活的操作體驗(yàn)。