1 回答

TA貢獻1777條經驗 獲得超10個贊
不要因為您遇到的確切原因而使用 mouseover 和 mouseout。
而是在鼠標事件期間跟蹤開始和結束索引。然后簡單地比較每天是否在該范圍之間。
如果用戶以相反的順序選擇,請確保考慮到
end
可能是 <start
。還要確??紤]鼠標在沒有特定日期懸停時可能會被釋放。
1 單擊/拖動:
let div = document.querySelector('div');
for (let i = 0; i < 31; i++) {
let span = document.createElement('span');
span.textContent = i + 1;
div.appendChild(span);
span.addEventListener('mousedown', () => beginSelection(i));
span.addEventListener('mousemove', () => updateSelection(i));
span.addEventListener('mouseup', () => endSelection(i));
}
document.addEventListener('mouseup', () => endSelection());
let selecting, start, end;
let beginSelection = i => {
selecting = true;
start = i;
updateSelection(i);
};
let endSelection = (i = end) => {
updateSelection(i);
selecting = false;
};
let updateSelection = i => {
if (selecting)
end = i;
[...document.querySelectorAll('span')].forEach((span, i) =>
span.classList.toggle('selected', i >= start && i <= end || i >= end && i <= start));
};
div {
display: flex;
width: 200px;
flex-wrap: wrap;
}
span {
width: 30px;
border: 1px solid;
padding: 5px;
user-select: none;
}
span.selected {
background: #adf;
}
span:hover:not(.selected) {
background: #cfefff;
}
<div><div>
2次點擊:
let div = document.querySelector('div');
for (let i = 0; i < 31; i++) {
let span = document.createElement('span');
span.textContent = i + 1;
div.appendChild(span);
span.addEventListener('click', () => toggleSelection(i));
span.addEventListener('mousemove', () => updateSelection(i));
}
let selecting, start, end;
let toggleSelection = i => {
if (selecting)
endSelection(i);
else
beginSelection(i);
};
let beginSelection = i => {
selecting = true;
start = i;
updateSelection(i);
};
let endSelection = (i = end) => {
updateSelection(i);
selecting = false;
};
let updateSelection = i => {
if (selecting)
end = i;
[...document.querySelectorAll('span')].forEach((span, i) =>
span.classList.toggle('selected', i >= start && i <= end || i >= end && i <= start));
};
div {
display: flex;
width: 200px;
flex-wrap: wrap;
}
span {
width: 30px;
border: 1px solid;
padding: 5px;
user-select: none;
}
span.selected {
background: #adf;
}
span:hover:not(.selected) {
background: #cfefff;
}
<div>
<div>
添加回答
舉報