如何防止过渡延迟
How to prevent a transition delay
我一直在为在 jsfiddle 找到的导航菜单玩 CSS 转换。可以在下面找到相同的代码:
CSS:
nav {
background-color: #337AB7;
position: relative;
}
nav:after {
display: table;
content: '';
clear: both;
}
nav h1 {
float: left;
margin: 0;
}
nav #nav-toggle {
display: none;
}
nav label[for='nav-toggle']:after {
float: right;
display: block;
padding: .5em;
margin: .5em;
width: 4em;
content: 'Menu';
text-align: center;
color: #fff;
border: 1px solid #fff;
border-radius: 3px;
}
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
max-height: 0;
overflow: hidden;
transition: max-height 1s ease;
}
nav #nav-toggle:checked ~ ul {
max-height: 1000px;
transition: max-height 1s ease;
}
nav #nav-toggle:checked ~ label:after {
content: 'Close';
background-color: #fff;
color: #337AB7;
}
nav li {
margin: .5em 0;
}
nav a {
display: block;
padding: .5em;
text-decoration: none;
color: #fff;
}
nav a:hover,
nav a:active,
nav a:focus {
background-color: #fff;
color: #337AB7;
}
HTML:
<nav>
<h1><a href="#">Title</a></h1>
<input type="checkbox" id="nav-toggle">
<label for="nav-toggle"></label>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
打开过渡工作正常,但关闭菜单时在过渡实际发生之前会有某种延迟。我该如何停止这种延迟?
将您的转换代码更改为如下内容:transition: max-height .3s ease-in-out;
这将使它更快,并将动画添加到下拉菜单,而不仅仅是下拉菜单。
编辑:
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
max-height: 0;
overflow: hidden;
transition: max-height 100ms ease;
}
nav #nav-toggle:checked ~ ul {
max-height: 1000px;
transition: max-height 1.5s ease;
}
试试上面的方法。下拉菜单会产生很好的平滑效果,但返回上去会很快,并且会有不明显的延迟。
如果这超出了我的实际原因。我的猜测是,由于您点击了一个动作,然后将过渡添加到动作中,因此其他代码在过渡之前被渲染了。不过这只是我的猜测。
您的动画花费这么长时间的原因是因为您正在过渡 max-height
。即使您的最终高度只有 134px,您也不会对其进行转换。它正在为您 max-height
设置的完整 1000px 进行过渡。当它展开时看起来没有任何问题,但当它关闭时它从 1000 开始倒计时。看起来它被延迟了,即使它没有。它只是在达到大约 134px 之前不会对实际高度产生影响。如果您将其更改为高度和过渡,问题就解决了。只需将您的身高降低到更易于管理的水平。
当您使用 height
而不是 max-height
时,您会看到这个问题:
nav {
background-color: #337AB7;
position: relative;
}
nav:after {
display: table;
content: '';
clear: both;
}
nav h1 {
float: left;
margin: 0;
}
nav #nav-toggle {
display: none;
}
nav label[for='nav-toggle']:after {
float: right;
display: block;
padding: .5em;
margin: .5em;
width: 4em;
content: 'Menu';
text-align: center;
color: #fff;
border: 1px solid #fff;
border-radius: 3px;
}
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
height: 0;
overflow: hidden;
transition: height 1s ease;
}
nav #nav-toggle:checked ~ ul {
height: 1000px;
transition: height 1s ease;
}
nav #nav-toggle:checked ~ label:after {
content: 'Close';
background-color: #fff;
color: #337AB7;
}
nav li {
margin: .5em 0;
}
nav a {
display: block;
padding: .5em;
text-decoration: none;
color: #fff;
}
nav a:hover,
nav a:active,
nav a:focus {
background-color: #fff;
color: #337AB7;
}
<nav>
<h1><a href="#">Title</a></h1>
<input type="checkbox" id="nav-toggle">
<label for="nav-toggle"></label>
<ul>
<li><a href="#">Home</a>
</li>
<li><a href="#">About</a>
</li>
<li><a href="#">Contact</a>
</li>
</ul>
</nav>
Updated fiddle - 只有 1 行修复
修复延迟解决方案:
为元素输入 cubic-bezier(0, 1, 0, 1) 转换函数。
.text {
overflow: hidden;
max-height: 0;
transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
&.full {
max-height: 1000px;
transition: max-height 1s ease-in-out;
}
我一直在为在 jsfiddle 找到的导航菜单玩 CSS 转换。可以在下面找到相同的代码:
CSS:
nav {
background-color: #337AB7;
position: relative;
}
nav:after {
display: table;
content: '';
clear: both;
}
nav h1 {
float: left;
margin: 0;
}
nav #nav-toggle {
display: none;
}
nav label[for='nav-toggle']:after {
float: right;
display: block;
padding: .5em;
margin: .5em;
width: 4em;
content: 'Menu';
text-align: center;
color: #fff;
border: 1px solid #fff;
border-radius: 3px;
}
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
max-height: 0;
overflow: hidden;
transition: max-height 1s ease;
}
nav #nav-toggle:checked ~ ul {
max-height: 1000px;
transition: max-height 1s ease;
}
nav #nav-toggle:checked ~ label:after {
content: 'Close';
background-color: #fff;
color: #337AB7;
}
nav li {
margin: .5em 0;
}
nav a {
display: block;
padding: .5em;
text-decoration: none;
color: #fff;
}
nav a:hover,
nav a:active,
nav a:focus {
background-color: #fff;
color: #337AB7;
}
HTML:
<nav>
<h1><a href="#">Title</a></h1>
<input type="checkbox" id="nav-toggle">
<label for="nav-toggle"></label>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
打开过渡工作正常,但关闭菜单时在过渡实际发生之前会有某种延迟。我该如何停止这种延迟?
将您的转换代码更改为如下内容:transition: max-height .3s ease-in-out;
这将使它更快,并将动画添加到下拉菜单,而不仅仅是下拉菜单。
编辑:
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
max-height: 0;
overflow: hidden;
transition: max-height 100ms ease;
}
nav #nav-toggle:checked ~ ul {
max-height: 1000px;
transition: max-height 1.5s ease;
}
试试上面的方法。下拉菜单会产生很好的平滑效果,但返回上去会很快,并且会有不明显的延迟。
如果这超出了我的实际原因。我的猜测是,由于您点击了一个动作,然后将过渡添加到动作中,因此其他代码在过渡之前被渲染了。不过这只是我的猜测。
您的动画花费这么长时间的原因是因为您正在过渡 max-height
。即使您的最终高度只有 134px,您也不会对其进行转换。它正在为您 max-height
设置的完整 1000px 进行过渡。当它展开时看起来没有任何问题,但当它关闭时它从 1000 开始倒计时。看起来它被延迟了,即使它没有。它只是在达到大约 134px 之前不会对实际高度产生影响。如果您将其更改为高度和过渡,问题就解决了。只需将您的身高降低到更易于管理的水平。
当您使用 height
而不是 max-height
时,您会看到这个问题:
nav {
background-color: #337AB7;
position: relative;
}
nav:after {
display: table;
content: '';
clear: both;
}
nav h1 {
float: left;
margin: 0;
}
nav #nav-toggle {
display: none;
}
nav label[for='nav-toggle']:after {
float: right;
display: block;
padding: .5em;
margin: .5em;
width: 4em;
content: 'Menu';
text-align: center;
color: #fff;
border: 1px solid #fff;
border-radius: 3px;
}
nav ul {
float: left;
display: block;
margin: 0;
padding: 0;
list-style: none;
width: 100%;
height: 0;
overflow: hidden;
transition: height 1s ease;
}
nav #nav-toggle:checked ~ ul {
height: 1000px;
transition: height 1s ease;
}
nav #nav-toggle:checked ~ label:after {
content: 'Close';
background-color: #fff;
color: #337AB7;
}
nav li {
margin: .5em 0;
}
nav a {
display: block;
padding: .5em;
text-decoration: none;
color: #fff;
}
nav a:hover,
nav a:active,
nav a:focus {
background-color: #fff;
color: #337AB7;
}
<nav>
<h1><a href="#">Title</a></h1>
<input type="checkbox" id="nav-toggle">
<label for="nav-toggle"></label>
<ul>
<li><a href="#">Home</a>
</li>
<li><a href="#">About</a>
</li>
<li><a href="#">Contact</a>
</li>
</ul>
</nav>
Updated fiddle - 只有 1 行修复
修复延迟解决方案:
为元素输入 cubic-bezier(0, 1, 0, 1) 转换函数。
.text {
overflow: hidden;
max-height: 0;
transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
&.full {
max-height: 1000px;
transition: max-height 1s ease-in-out;
}