html - CSS Checkbox Hack 可折叠导航
问题描述
我创建了一个可折叠的纯 CSS 导航菜单,它从视口的左边缘或右边缘滑入。它几乎可以工作,除了一些我目前不理解的奇怪行为:
a) 将其放在左侧时,不执行标签的旋转变换(从 + 生成 x)。
b)当通过添加注释行将整个事物放在右侧时,float: right;
转换工作,但没有可见的转换。此外,菜单不是从视口边缘滑动,而是从复选框标签的左侧滑动,然后在它的右侧位置跳转并将标签的宽度添加到 ul。
body {
background-color: lightgreen;
}
a {
color: black;
text-decoration: none;
}
nav {
position: fixed;
left: 0;
/*right: 0;*/
z-index: 10;
}
nav ul {
list-style-type: none;
/*float: right;*/
margin: 0;
padding: 0;
width: 0;
overflow: hidden;
transition: width 0.3s ease;
}
nav a {
display: block;
padding: .5em;
background-color: rgba(255, 255, 255, .5);
transition: 0.25s;
}
nav a:hover {
background-color: rgba(0, 0, 0, .3);
color: white;
transition: 0.2s;
}
/* Toggle mechanism */
nav label {
/*float: right*/
padding: .5em;
cursor: pointer;
text-align: center;
font-size: 2em;
transition: transform 0.5s;
transition: color 0.3s;
}
nav label:hover {
color: white;
}
input#menu {
display: none;
}
input:checked ~ ul {
width: 100%;
}
input:checked ~ label {
transform: rotate(-45deg);
}
input:checked ~ label:hover {
color: red;
}
<nav>
<input type="checkbox" id="menu"><label for="menu">+</label>
<ul>
<li><a href="#">EntryA</a></li>
<li><a href="#">EntryB</a></li>
<li><a href="#">EntryC</a></li>
<li><a href="#">EntryD</a></li>
<li><a href="#">EntryE</a></li>
</ul>
</nav>
是否可以在没有 JavaScript 帮助的情况下修复这些解决方案中的任何一个?
非常感谢你!
解决方案
这个给你:
要变换,nav label
应该是块级元素(应用时float
就是这种情况)
并且transition
s 应该被指定为逗号分隔的集合。
body {
background-color: lightgreen;
}
a {
color: black;
text-decoration: none;
}
nav {
position: fixed;
left: 0;
/*right: 0;*/
z-index: 10;
}
nav ul {
list-style-type: none;
/*float: right;*/
margin: 0;
padding: 0;
width: 0;
overflow: hidden;
transition: width 0.3s ease;
}
nav a {
display: block;
padding: .5em;
background-color: rgba(255, 255, 255, .5);
transition: 0.25s;
}
nav a:hover {
background-color: rgba(0, 0, 0, .3);
color: white;
transition: 0.2s;
}
/* Toggle mechanism */
nav label {
display:block;
box-sizing:border-box;
width:2em; height:2em;
cursor: pointer;
text-align: center;
font-size: 2em; line-height:2;
transition: transform .5s, color 0.3s;
}
nav label:hover {
color: white;
}
input#menu {
display: none;
}
input:checked ~ ul {
width: 100%;
}
input:checked ~ label {
transform: rotateZ(-45deg);
}
input:checked ~ label:hover {
color: red;
}
<nav>
<input type="checkbox" id="menu">
<label for="menu">+</label>
<ul>
<li><a href="#">EntryA</a></li>
<li><a href="#">EntryB</a></li>
<li><a href="#">EntryC</a></li>
<li><a href="#">EntryD</a></li>
<li><a href="#">EntryE</a></li>
</ul>
</nav>
“在右边”版本:使用float
时有时也必须使用clear
。
body {
background-color: lightgreen;
}
a {
color: black;
text-decoration: none;
}
nav {
position: fixed;
right: 0;
z-index: 10;
}
nav ul {
list-style-type: none;
float: right; clear:right;
margin: 0;
padding: 0;
width: 0;
overflow: hidden;
transition: width 0.3s ease;
}
nav a {
display: block;
padding: .5em;
background-color: rgba(255, 255, 255, .5);
transition: 0.25s;
}
nav a:hover {
background-color: rgba(0, 0, 0, .3);
color: white;
transition: 0.2s;
}
/* Toggle mechanism */
nav label {
float:right;
box-sizing:border-box;
width:2em; height:2em;
cursor: pointer;
text-align: center;
font-size: 2em; line-height:2;
transition: transform .5s, color 0.3s;
}
nav label:hover {
color: white;
}
input#menu {
display: none;
}
input:checked ~ ul {
width: 100%;
}
input:checked ~ label {
transform: rotateZ(-45deg);
}
input:checked ~ label:hover {
color: red;
}
<nav>
<input type="checkbox" id="menu">
<label for="menu">+</label>
<ul>
<li><a href="#">EntryA</a></li>
<li><a href="#">EntryB</a></li>
<li><a href="#">EntryC</a></li>
<li><a href="#">EntryD</a></li>
<li><a href="#">EntryE</a></li>
</ul>
</nav>
推荐阅读
- alloy - 合金分析仪在 Mac OS X 10.14 上崩溃
- java - 生成的 PDF 中缺少图像
- r - 绘制由列定义的分组条形图
- javascript - 如何检索 html 'path' 元素属性值
- c++ - 迭代算法之前的高效内存分配
- reactjs - 如何更改状态并获取数据选择选项并在选项中显示数据
- spring-webflux - 如何将 Mono 流转换为 Flux
- notepad++ - 删除 Notepad++ 中的数字,但不更改括号中的数字
- android - 在 Android 应用程序中的数据类模型的属性中使用 Kotlin 折叠
- android - 在android中连接wifi时如何触发工作管理器?