根据先前 class 的兄弟姐妹动态地向元素添加 Class()?
Dynamically addClass() to elements depending on the siblings previous class?
我有一个 <ul>
元素,里面有 <li>
。列表项有一个:
<li class="folder">
<!-- or... -->
<li class="file">
嵌套在每个 folder's
中,有一个 color-label
.
<li class="folder">
Folder 1
<i class="blue"></i>
</li>
我需要使用 jQuery 动态查看所有 <li class="folder">
列表项并找到 <i class="color">
标签,然后将 class 应用于每个<li class="file">
siblings 直到找到下一个文件夹颜色标签,并重复该过程,直到所有 <li>
都具有正确的颜色,具体取决于文件夹的 color-label
class.
下面是它的外观示例:
我已经尝试使用 .nextUntil()
jquery 方法,但没有得到最好的结果。这是我的代码:
https://jsfiddle.net/5c11sqL5/
<nav class="directory">
<h1 class="title">Directory</h1>
<ul class="container">
<!-- Folder 1 -->
<li class="folder">Folder 1 <i class="blue"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
<!-- Folder 2 -->
<li class="folder">Folder 2 <i class="green"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
<!-- Folder 3 -->
<li class="folder">Folder 3 <i class="gray"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
</ul>
</nav>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Courier New", Courier, monospace;
}
/* Directory */
.directory {
display: flex;
flex-direction: column;
background: #ccc;
width: 240px;
height: 100vh;
}
.directory .title {
letter-spacing: 3px;
text-transform: uppercase;
opacity: .07;
text-align: center;
margin: 1rem 0 0;
}
.directory .container {
list-style: none;
}
/* Folder and Files */
.folder {
font-weight: bold;
font-size: 1rem;
position: relative;
padding: 0 0 0 1rem;
margin: 1rem 0 0;
}
.file {
font-size: .8rem;
padding: 0 0 0 1rem;
}
/* Colors */
.blue,
.green,
.gray {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 5px;
display: block;
}
.blue {
background: rgba(0, 194, 224, 1);
}
.green {
background: rgba(81, 232, 152, 1);
}
.gray {
background: rgba(131, 140, 145, 1);
}
您可以通过遍历每个 i
元素然后将其 class 名称复制到每个后续 .file
元素来实现此目的,如下所示:
$('.directory .folder i').each(function() {
var className = $(this).prop('class');
$(this).closest('li').nextUntil('.folder').addClass(className);
})
另请注意,您需要修改已定义的 classes,以便 position: absolute
规则仅适用于 i
元素,如下所示:
i.blue,
i.green,
i.gray {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 5px;
display: block;
}
i.blue {
background: rgba(0, 194, 224, 1);
}
i.green {
background: rgba(81, 232, 152, 1);
}
i.gray {
background: rgba(131, 140, 145, 1);
}
.file.blue {
color: rgba(0, 194, 224, 1);
}
.file.green {
color: rgba(81, 232, 152, 1);
}
.file.gray {
color: rgba(131, 140, 145, 1);
}
我有一个 <ul>
元素,里面有 <li>
。列表项有一个:
<li class="folder">
<!-- or... -->
<li class="file">
嵌套在每个 folder's
中,有一个 color-label
.
<li class="folder">
Folder 1
<i class="blue"></i>
</li>
我需要使用 jQuery 动态查看所有 <li class="folder">
列表项并找到 <i class="color">
标签,然后将 class 应用于每个<li class="file">
siblings 直到找到下一个文件夹颜色标签,并重复该过程,直到所有 <li>
都具有正确的颜色,具体取决于文件夹的 color-label
class.
下面是它的外观示例:
我已经尝试使用 .nextUntil()
jquery 方法,但没有得到最好的结果。这是我的代码:
https://jsfiddle.net/5c11sqL5/
<nav class="directory">
<h1 class="title">Directory</h1>
<ul class="container">
<!-- Folder 1 -->
<li class="folder">Folder 1 <i class="blue"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
<!-- Folder 2 -->
<li class="folder">Folder 2 <i class="green"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
<!-- Folder 3 -->
<li class="folder">Folder 3 <i class="gray"></i></li>
<li class="file">File 1</li>
<li class="file">File 2</li>
<li class="file">File 3</li>
</ul>
</nav>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Courier New", Courier, monospace;
}
/* Directory */
.directory {
display: flex;
flex-direction: column;
background: #ccc;
width: 240px;
height: 100vh;
}
.directory .title {
letter-spacing: 3px;
text-transform: uppercase;
opacity: .07;
text-align: center;
margin: 1rem 0 0;
}
.directory .container {
list-style: none;
}
/* Folder and Files */
.folder {
font-weight: bold;
font-size: 1rem;
position: relative;
padding: 0 0 0 1rem;
margin: 1rem 0 0;
}
.file {
font-size: .8rem;
padding: 0 0 0 1rem;
}
/* Colors */
.blue,
.green,
.gray {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 5px;
display: block;
}
.blue {
background: rgba(0, 194, 224, 1);
}
.green {
background: rgba(81, 232, 152, 1);
}
.gray {
background: rgba(131, 140, 145, 1);
}
您可以通过遍历每个 i
元素然后将其 class 名称复制到每个后续 .file
元素来实现此目的,如下所示:
$('.directory .folder i').each(function() {
var className = $(this).prop('class');
$(this).closest('li').nextUntil('.folder').addClass(className);
})
另请注意,您需要修改已定义的 classes,以便 position: absolute
规则仅适用于 i
元素,如下所示:
i.blue,
i.green,
i.gray {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 5px;
display: block;
}
i.blue {
background: rgba(0, 194, 224, 1);
}
i.green {
background: rgba(81, 232, 152, 1);
}
i.gray {
background: rgba(131, 140, 145, 1);
}
.file.blue {
color: rgba(0, 194, 224, 1);
}
.file.green {
color: rgba(81, 232, 152, 1);
}
.file.gray {
color: rgba(131, 140, 145, 1);
}