som*_*one 16 html javascript css
我有一张数字表。当我单击表格中的单元格时,它会切换活动状态。我想选择一个单元格并按 crtl 并选择另一个单元格,结果第一个和第二个之间的单元格将变为活动状态。如何实施?
代码笔https://codepen.io/geeny273/pen/GRJXBQP
<div id="grid">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
<div class="cell">5</div>
<div class="cell">6</div>
</div>
Run Code Online (Sandbox Code Playgroud)
const grid = document.getElementById("grid")
grid.onclick = (event) => {
event.stopPropagation();
const { className } = event.target;
if (className.includes('cell')) {
if (className.includes('active')) {
event.target.className = 'cell';
} else {
event.target.className = 'cell active';
}
}
}
Run Code Online (Sandbox Code Playgroud)
它应该像轮班突出显示一样工作并且双向工作
awr*_*an5 11
尝试这个:
const cells = document.querySelectorAll(".cell");
let lastClicked;
function handleClick(e) {
// Toggle class active
if (e.target.classList.contains("active")) {
e.target.classList.remove("active");
} else {
e.target.classList.add("active");
}
// Check if CTRL key is down and if the clicked cell has aready class active
let inRange = false;
if (e.ctrlKey && this.classList.contains("active")) {
// loop over cells
cells.forEach(cell => {
// check for the first and last cell clicked
if (cell === this || cell === lastClicked) {
// reverse inRange
inRange = !inRange;
}
// If we are in range, add active class
if (inRange) {
cell.classList.add("active");
}
});
}
// Mark last clicked
lastClicked = this;
}
cells.forEach(cell => cell.addEventListener("click", handleClick));
Run Code Online (Sandbox Code Playgroud)
#grid {
display: grid;
grid-template-columns: repeat(3, 50px);
grid-template-rows: repeat(2, 50px);
}
.cell {
display: flex;
justify-content: center;
align-items: center;
border: solid 1px #ccc;
}
.active {
background-color: #80aaff;
}
Run Code Online (Sandbox Code Playgroud)
<div id="grid">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
<div class="cell">5</div>
<div class="cell">6</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我编写的Javascript部分与您编写的完全不同。我希望你仍然可以使用它。但它完全符合您的要求。
使用Shift+ Cell 您可以选择中间的所有单元格。
var $lastSelected = [],
container = $('#grid'),
collection = $('.cell');
container.on('click', '.cell', function(e) {
var that = $(this),
$selected,
direction;
if (e.shiftKey){
if ($lastSelected.length > 0) {
if(that[0] == $lastSelected[0]) {
return false;
}
direction = that.nextAll('.lastSelected').length > 0 ? 'forward' : 'back';
if ('forward' == direction) {
// Last selected is after the current selection
$selected = that.nextUntil($lastSelected, '.cell');
} else {
// Last selected is before the current selection
$selected = $lastSelected.nextUntil(that, '.cell');
}
collection.removeClass('selected');
$selected.addClass('selected');
$lastSelected.addClass('selected');
that.addClass('selected');
} else {
$lastSelected = that;
that.addClass('lastSelected');
collection.removeClass('selected');
that.addClass('selected');
}
} else {
$lastSelected = that;
collection.removeClass('lastSelected selected');
that.addClass('lastSelected selected');
}
});
Run Code Online (Sandbox Code Playgroud)
.selected {background-color: #80aaff;}
#grid{
display: grid;
grid-template-columns: repeat(3, 50px);
grid-template-rows: repeat(2, 50px);
}
.cell {
display: flex;
justify-content: center;
align-items: center;
border: solid 1px #ccc;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="grid">
<div class="cell">1</div>
<div class="cell">2</div>
<div class="cell">3</div>
<div class="cell">4</div>
<div class="cell">5</div>
<div class="cell">6</div>
</div>
Run Code Online (Sandbox Code Playgroud)
使用previousElementSibling
和compareDocumentPosition()
const grid = document.getElementById("grid");
const cells = [...grid.querySelectorAll(".cell")];
let recentActive;
grid.onclick = event => {
event.stopPropagation();
const { className } = event.target;
if (!className.includes("cell")) {
return;
}
let compareMask = recentActive && recentActive.compareDocumentPosition(event.target);
let property = compareMask == 2 ? "nextElementSibling" : "previousElementSibling";
let state = event.target.classList.toggle("active");
let sibiling = event.target[property];
while (event.ctrlKey && state && !sibiling.classList.contains("active")) {
sibiling.classList.add("active");
sibiling = sibiling[property];
}
recentActive = event.target;
};
Run Code Online (Sandbox Code Playgroud)
工作演示
https://codepen.io/aswinkumar863/pen/QWbVVNG