javascript - CSS 过渡不适用于 height 属性
问题描述
所以我在点击时进行菜单交互,如果你想看看,这是我的代码片段。
let btn = document.querySelector('.trigger');
let icons = document.querySelector('.icons');
let labels = document.querySelector('.labels');
btn.onclick = function() {
icons.classList.toggle('active');
labels.classList.toggle('active');
}
body {
background: #222;
}
.trigger {
cursor: pointer;
}
nav {
position: absolute;
top: 30px;
right: 30px;
color: #222;
}
nav ul.icons {
background: #fff;
width: 60px;
height: 60px;
overflow: hidden;
border-radius: 60px;
transition: 1s ease;
}
nav ul.icons:hover {
height: 100%;
}
nav ul li {
list-style: none;
}
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
</head>
<body>
<nav>
<ul class="icons">
<li class="trigger">
<i class="fas fa-bars"></i>
</li>
<li><i class="fas fa-home"></i></li>
<li><i class="fas fa-users"></i></li>
<li><i class="fas fa-concierge-bell"></i></li>
<li><i class="fas fa-pen"></i></li>
<li><i class="fas fa-phone-alt"></i></li>
</ul>
</nav>
</body>
</html>
我遇到的问题是,transition 属性在 CSS 中不能很好地处理高度。是否有我没有注意到的问题,是否有快速解决方法?
解决方案
所以问题是您尝试将高度转换为 100% - 但 CSS 无法立即处理。
快速但有问题的解决方案:
您可以将 :hover 中的高度设置为固定值,例如 100 像素。
但是,如果您想在其中放置一个新项目或更改项目的大小,则必须手动调整高度。
我会做什么:
首先我会稍微重构一下 HTML 并将触发器移出项目列表:
<nav>
<button class="trigger">
<i class="fas fa-bars"></i>
</button>
<ul class="icons fas-container">
<li><i class="fas fa-home"></i></li>
<li><i class="fas fa-users"></i></li>
<li><i class="fas fa-concierge-bell"></i></li>
<li><i class="fas fa-pen"></i></li>
<li><i class="fas fa-phone-alt"></i></li>
</ul>
</nav>
然后我会调整.icons的CSS:(
删除高度,添加最大高度并调整过渡)
nav ul.icons {
background: #fff;
width: 60px;
overflow: hidden;
border-radius: 60px;
max-height: 0;
transition: max-height 0.2s ease-out;
}
最后,我会让 JavaScript 负责正确设置最大高度。
悬停时:
let btn = document.querySelector('.trigger');
let icons = document.querySelector('.icons');
btn.onmouseover = function () {
icons.style.maxHeight = icons.scrollHeight + "px";
}
btn.onmouseout = function () {
icons.style.maxHeight = null;
}
或单击(如果您愿意的话):
let btn = document.querySelector('.trigger');
let icons = document.querySelector('.icons');
btn.onclick = function() {
if (icons.style.maxHeight){
icons.style.maxHeight = null;
} else {
icons.style.maxHeight = icons.scrollHeight + "px";
}
}
这里有一些(也许)有用的链接:
- https://www.w3schools.com/howto/howto_js_collapsible.asp
- 我怎样才能过渡高度:0;到高度:自动;使用 CSS?
- https://codepen.io/felipefialho/pen/ICkwe
片段:
let btn = document.querySelector('.trigger');
let icons = document.querySelector('.icons');
btn.onmouseover = function () {
icons.style.maxHeight = icons.scrollHeight + "px";
}
btn.onmouseout = function () {
icons.style.maxHeight = null;
}
body {
background: #222;
}
.trigger {
cursor: pointer;
}
nav {
position: absolute;
top: 30px;
right: 30px;
color: #222;
}
nav ul.icons {
background: #fff;
width: 60px;
overflow: hidden;
border-radius: 60px;
max-height: 0;
transition: max-height 0.2s ease-out;
}
nav ul.icons:hover {
height: 100%;
}
nav ul li {
list-style: none;
}
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
</head>
<body>
<nav>
<button class="trigger">
<i class="fas fa-bars"></i>
</button>
<ul class="icons fas-container">
<li><i class="fas fa-home"></i></li>
<li><i class="fas fa-users"></i></li>
<li><i class="fas fa-concierge-bell"></i></li>
<li><i class="fas fa-pen"></i></li>
<li><i class="fas fa-phone-alt"></i></li>
</ul>
</nav>
</body>
</html>
推荐阅读
- python - 如何尽可能高效地将元组列表转换为 pandas DataFrame?
- spring-boot - com.mongodb.MongoSocketOpenException:异常打开套接字。将fladdoodle从2.03更新到3.0.0版本后
- django-views - 如何在 django 中进行批量删除?
- database - 有没有办法在 Typerom 实体中的不同连接之间创建关系?
- javascript - AngularJs Gregorian dateTimePicker 显示日期问题
- shopify - 多标签过滤器没有在没有应用程序的情况下使用自定义代码在 shopify 中获取产品信息
- html - 如何正确地将 css 规则应用于嵌套元素
- db2 - 单击 IBM Cloud Db2 上的管理按钮后网页没有响应
- html - 如何使用 *ngFor 分离键值对并将键保留在列中,并将值保留在另一列中?
- discord - 我如何获得用户状态并给他一个特定的角色,我试过但它不起作用