第27天的實作目標是做出在頁面元素可以拖拉並移動該元素。
<div class="items">
<div class="item item1">01</div>
。
<div class="item item25">25</div>
</div>
建立四個事件為按下mousedown
、放開點擊mouseup
、離開元素mouseleave
、移動mousemove
。
const slider = document.querySelector('.items')
slider.addEventListener('mousedown', (e) =>{})
slider.addEventListener('mouseup', () =>{})
slider.addEventListener('mouseleave', () =>{})
slider.addEventListener('mousemove', (e) =>{})
在mouseup
、mouseleave
事件中有旗標isDown
是設為false
,並在移除CSSactive
類別。
isDown = false
slider.classList.remove('active')
.items.active {
background: rgba(255,255,255,0.3);
cursor: grabbing;
cursor: -webkit-grabbing;
transform: scale(1);
}
mousedown
事件觸發時,要讓旗幟isDown
為true
,讓點擊元素加入CSS類別active
,抓取滑鼠在元素中的位置,抓取元素向左移動值。
作者是透過的startX = e.pageX - slider.offsetLeft;
方式來取得滑鼠在元素中的位置,但該數值也可是e.clientX
的值,原因為點擊元素時,元素的寬度跟可視畫面寬度一樣大小,因此可以透過e.clientX
來抓取。
isDown = true;
slider.classList.add('active');
startX = e.pageX - slider.offsetLeft;
// startX = e.clientX得值
scrollLeft = slider.scrollLeft;
接下來為當滑鼠在元素上移動的事件mousemove
,在移動事件中要判斷isDown
來進行動作。
接下來取得滑鼠在元素中的位置e.pageX - slider.offsetLeft;
,並將目前取得的滑鼠位置與mousedown
事件取得的滑鼠位置相減,計算出水平位移。當滑鼠向左移會取得負值,向右移會取得正值,將取得數值與mousedown
事件取得的元素左邊位移數值相減,取的目前位移多少。
if (!isDown) return;
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = (x - startX) * 1;
slider.scrollLeft = scrollLeft - walk;
<div class="items">
<div class="item item1">01</div>
<div class="item item2">02</div>
<div class="item item3">03</div>
<div class="item item4">04</div>
<div class="item item5">05</div>
<div class="item item6">06</div>
<div class="item item7">07</div>
<div class="item item8">08</div>
<div class="item item9">09</div>
<div class="item item10">10</div>
<div class="item item11">11</div>
<div class="item item12">12</div>
<div class="item item13">13</div>
<div class="item item14">14</div>
<div class="item item15">15</div>
<div class="item item16">16</div>
<div class="item item17">17</div>
<div class="item item18">18</div>
<div class="item item19">19</div>
<div class="item item20">20</div>
<div class="item item21">21</div>
<div class="item item22">22</div>
<div class="item item23">23</div>
<div class="item item24">24</div>
<div class="item item25">25</div>
</div>
mouseenter與mouseover的差異為,mouseover的元素(子元素)都會觸發事件,mouseenter的元素才會觸發事件。
mouseleave與mouseout的差異為,mouseout的元素(子元素)都會觸發事件,mouseenter的元素才會觸發事件。
/* Content is not clipped */
overflow: visible;
/* Content is clipped, with no scrollbars */
overflow: hidden;
/* Content is clipped, with scrollbars */
overflow: scroll;
/* Let the browser decide */
overflow: auto;
white-space: normal;
white-space: nowrap;
white-space: pre;
white-space: pre-wrap;
white-space: pre-line;
user-select: none;
user-select: auto;
user-select: text;
user-select: contain;
user-select: all;
MouseEvent