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>
添加回答
举报