这个演示最初是由 Martin Ivanov 创建的,它使用隐藏的复选框和相邻兄弟选择器来设置每个文件夹的“状态”。实时演示已经从互联网上消失了,所以我会在这里发布它的副本,以及它下面的原始代码。
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 嵌套文件夹,无需 JS。
.css-treeview ul,
.css-treeview li
{
padding: 0;
margin: 0;
list-style: none;
}
.css-treeview input
{
position: absolute;
opacity: 0;
}
.css-treeview
{
font: normal 11px "Segoe UI", Arial, Sans-serif;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
}
.css-treeview a
{
color: #00f;
text-decoration: none;
}
.css-treeview a:hover
{
text-decoration: underline;
}
.css-treeview input + label + ul
{
margin: 0 0 0 22px;
}
.css-treeview input + label + ul
{
display: none;
}
.css-treeview label,
.css-treeview label::before
{
cursor: pointer;
}
.css-treeview input:disabled + label
{
cursor: default;
opacity: .6;
}
.css-treeview input:checked:not(:disabled) + label + ul
{
display: block;
}
.css-treeview label,
.css-treeview label::before
{
background: url("icons.png") no-repeat;
}
.css-treeview label,
.css-treeview a,
.css-treeview label::before
{
display: inline-block;
height: 16px;
line-height: 16px;,
vertical-align: middle;
}
.css-treeview label
{
background-position: 18px 0;
}
.css-treeview label::before
{
content: "";
width: 16px;
margin: 0 22px 0 0;
vertical-align: middle;
background-position: 0 -32px;
}
.css-treeview input:checked + label::before
{
background-position: 0 -16px;
}
/* webkit adjacent element selector bugfix */
@media screen and (-webkit-min-device-pixel-ratio:0)
{
.css-treeview
{
-webkit-animation: webkit-adjacent-element-selector-bugfix infinite 1s;
}
@-webkit-keyframes webkit-adjacent-element-selector-bugfix
{
from
{
padding: 0;
}
to
{
padding: 0;
}
}
}
<div class="css-treeview">
<ul>
<li><input type="checkbox" id="item-0" /><label for="item-0">This Folder is Closed By Default</label>
<ul>
<li><input type="checkbox" id="item-0-0" /><label for="item-0-0">Ooops! A Nested Folder</label>
<ul>
<li><input type="checkbox" id="item-0-0-0" /><label for="item-0-0-0">Look Ma - No Hands!</label>
<ul>
<li><a href="./">First Nested Item</a></li>
<li><a href="./">Second Nested Item</a></li>
<li><a href="./">Third Nested Item</a></li>
<li><a href="./">Fourth Nested Item</a></li>
</ul>
</li>
<li><a href="./">Item 1</a></li>
<li><a href="./">Item 2</a></li>
<li><a href="./">Item 3</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-0-1" /><label for="item-0-1">Yet Another One</label>
<ul>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-0-2" disabled="disabled" /><label for="item-0-2">Disabled Nested Items</label>
<ul>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
</ul>
</li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-1" checked="checked" /><label for="item-1">This One is Open by Default...</label>
<ul>
<li><input type="checkbox" id="item-1-0" /><label for="item-1-0">And Contains More Nested Items...</label>
<ul>
<li><a href="./">Look Ma - No Hands</a></li>
<li><a href="./">Another Item</a></li>
<li><a href="./">And Yet Another</a></li>
</ul>
</li>
<li><a href="./">Lorem</a></li>
<li><a href="./">Ipsum</a></li>
<li><a href="./">Dolor</a></li>
<li><a href="./">Sit Amet</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-2" /><label for="item-2">Can You Believe...</label>
<ul>
<li><input type="checkbox" id="item-2-0" /><label for="item-2-0">That This Treeview...</label>
<ul>
<li><input type="checkbox" id="item-2-2-0" /><label for="item-2-2-0">Does Not Use Any JavaScript...</label>
<ul>
<li><a href="./">But Relies Only</a></li>
<li><a href="./">On the Power</a></li>
<li><a href="./">Of CSS3</a></li>
</ul>
</li>
<li><a href="./">Item 1</a></li>
<li><a href="./">Item 2</a></li>
<li><a href="./">Item 3</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-2-1" /><label for="item-2-1">This is a Folder With...</label>
<ul>
<li><a href="./">Some Nested Items...</a></li>
<li><a href="./">Some Nested Items...</a></li>
<li><a href="./">Some Nested Items...</a></li>
<li><a href="./">Some Nested Items...</a></li>
<li><a href="./">Some Nested Items...</a></li>
</ul>
</li>
<li><input type="checkbox" id="item-2-2" disabled="disabled" /><label for="item-2-2">Disabled Nested Items</label>
<ul>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
<li><a href="./">item</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
我已经将这段代码在我的网站上实现了,但是在 Safari 中渲染时遇到了困难。如果在 Firefox 中“项目”太长,文本就会完美地换行。但是,相同的项目在 Safari 中会重叠,我无法弄清楚如何修复它。
任何帮助将不胜感激。
尝试使用 word-wrap: break-word;
在您想要的位置的项目 CSS 中。
试图弄清楚如何搜索此列表(可能使用 Javascript),并且只显示搜索返回的文件夹和最底层的节点。有什么想法吗?
“@-webkit-keyframes webkit-adjacent-element-selector-bugfix” 在 Firefox 中出现故障,所有后续 CSS 不会被渲染。
我想知道是否有办法将树的状态反映在 URL 中,这样我就可以创建指向具有给定折叠状态的页面的链接?