javascript - 如何在 JS 上制作高级选项卡
问题描述
我想做一个高级选项卡,但我做不到
我有 15 个从页面(按钮)获得的元素。我们还从页面(跨度)中获得了 5 个元素。
我希望在单击每个元素(按钮)时,将“活动”类分配给它,但有一个条件:当您单击此数组中的随机元素时,将“活动”类分配给它,之后也就是说,如果您单击另一个元素(随机),那么“活动”类也被分配给它,但是如果您单击第三个,再次随机元素,那么“活动”类将从第一个按下的按钮中删除(按钮),但第二个和第三个仍然存在,依此类推。有一个条件,如果我们按下 1 或 2 或 3(按钮),那么类“active-span”被分配给第一个元素(跨度),如果我们按下例如 2 和 6(按钮),那么类"active-span" 被分配了 1 和 2 个元素(span),但是如果我们按下 2 和 6(按钮)然后我们按下 8(按钮),
告诉我解决方案的逻辑。
我的代码:https ://codepen.io/MrMarten/pen/eYmLEPv
let elem = document.querySelectorAll('button');
let elemActive = [];
let span = document.querySelectorAll('span');
let spanActive = [];
for (let x of elem) {
x.addEventListener('click', handlerChange)
}
function handlerChange(event) {
if (!this.classList.contains('active')) {
this.classList.add('active');
if (elemActive.push(this) == 3) {
elemActive[0].classList.remove('active');
elemActive.shift();
}
}
};
.active {
color: red;
}
.active-span {
color: red;
border-color: red;
}
span {
margin: 5px 10px;
border: 1px solid;
padding: 5px;
}
.d-flex {
display: flex;
border: none;
}
<div class="d-flex">
<span>1-3</span>
<span>4-6</span>
<span>7-9</span>
<span>10-12</span>
<span>13-15</span>
</div>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<button>6</button>
<button>7</button>
<button>8</button>
<button>9</button>
<button>10</button>
<button>11</button>
<button>12</button>
<button>13</button>
<button>14</button>
<button>15</button>
解决方案
由于跨度元素的“激活”设置在功能上取决于按钮的活动状态,您可以迭代这些跨度和按钮以查看跨度指定的范围内是否有活动按钮,并设置相应的 CSS 类。
以下是如何扩展您的功能以实现这一目标。
请注意,我已将您的一些变量重命名为复数形式,当它们表示集合/数组时,我更喜欢这种形式:
let elems = document.querySelectorAll('button');
let elemsActive = [];
let spans = document.querySelectorAll('span');
let spansActive = [];
for (let elem of elems) {
elem.addEventListener('click', handlerChange)
}
function handlerChange(event) {
if (!this.classList.contains('active')) {
this.classList.add('active');
if (elemsActive.push(this) == 3) {
elemsActive.shift().classList.remove('active');
}
spansActive.length = 0; // clear
for (let span of spans) {
let [low, high] = span.textContent.split("-").map(Number);
let active = Array.from(elemsActive, elem => +elem.textContent)
.some(n => n >= low && n <= high);
span.classList.toggle('active', active);
if (active) spansActive.push(span); // (if you still need this array?)
}
}
};
.active {
color: red;
}
.active-span {
color: red;
border-color: red;
}
span {
margin: 5px 10px;
border: 1px solid;
padding: 5px;
}
.d-flex {
display: flex;
border: none;
}
<div class="d-flex">
<span>1-3</span>
<span>4-6</span>
<span>7-9</span>
<span>10-12</span>
<span>13-15</span>
</div>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
<button>5</button>
<button>6</button>
<button>7</button>
<button>8</button>
<button>9</button>
<button>10</button>
<button>11</button>
<button>12</button>
<button>13</button>
<button>14</button>
<button>15</button>
推荐阅读
- php - 如何使用 txt 文件的文件列表作为数组变量?
- python-3.x - 期望值:第 1 行第 1 列(字符 0)
- ansible - 带双引号的 ansible playbook 变量
- c++ - 尽管有范围块,std::lock_guard 似乎提供了线程安全
- android - 使用滚动视图时,Edittext 被键盘隐藏
- joomla - 如何在文章中显示导航链接
- docker - Docker 在同一个 Docker Compose 堆栈中运行时不会向 fluentd 发送日志
- java - Java:如何打开不同类型的 url,如 mailto 和 http?
- reactjs - 如何使用 React hook useEffect 添加事件处理程序取决于状态?
- groovy - 如何获取运行 Jenkins 管道作业的文件夹名称