javascript - 在什么情况下会移除 CSS 过渡?
问题描述
我对 Javascript 还是很陌生,我正在尝试制作一个使用相同 HTML 文件的网页,并且只是交叉淡化内容而不是重定向到新页面。我正在使用事件侦听器来了解当前页面何时淡出并触发新页面进入。为什么在下面的示例中,新页面不会慢慢淡入(它们只是突然出现,忽略过渡属性)?为什么内容不再响应 CSS 过渡?
编辑:我会试着澄清我在这里问什么。我知道该display
功能无法转换,这实际上就是我使用事件侦听器的原因。我正在努力做到这一点,当一页的内容淡出时,下一页淡入同一个地方,我相信这是无法实现的visibility
。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<!-- CSS -->
<style>
/* navagation bar style */
#navbar {
overflow: hidden;
background-color: #000000;
text-align: center;
width: 100%;
height: 36px;
}
#navbar a {
display: inline-block;
color: #ffffff;
padding: 10px 15px 10px 15px;
font-size: 16px;
}
/* content style*/
.page {
padding: 50px;
text-align: center;
transition: opacity 1s;
}
</style>
<!-- Javascript -->
<script>
window.onload = function() {setup()};
function setup() {
var page1link = document.getElementById("page1link");
var page1 = document.getElementById("page1");
page1.style["opacity"] = "1";
var page2link = document.getElementById("page2link");
var page2 = document.getElementById("page2");
page2.style["opacity"] = "0";
page2.style["display"] = "none";
var page3link = document.getElementById("page3link");
var page3 = document.getElementById("page3");
page3.style["opacity"] = "0";
page3.style["display"] = "none";
page1link.onclick = function() {fade(page1, page2, page3)};
page2link.onclick = function() {fade(page2, page1, page3)};
page3link.onclick = function() {fade(page3, page1, page2)};
}
function fade(page_1, page_2, page_3) {
let on_page;
if (page_2.style["opacity"] != "0") {
on_page = page_2
} else if (page_3.style["opacity"] != "0") {
on_page = page_3
} if (on_page != undefined) {
on_page.addEventListener('transitionend', fadePageIn)
on_page.style["opacity"] = "0";
function fadePageIn() {
on_page.style["display"] = "none";
page_1.style["display"] = "";
page_1.style["opacity"] = "1";
on_page.removeEventListener('transitionend', fadePageIn);
}
}
}
</script>
<title>Example</title>
</head>
<body>
<div id="navbar">
<a id="page1link" href="javascript:void(0)">Page 1</a>
<a id="page2link" href="javascript:void(0)">Page 2</a>
<a id="page3link" href="javascript:void(0)">Page 3</a>
</div>
<div class="page" id="page1">
page 1 content here
</div>
<div class="page" id="page2">
page 2 content here
</div>
<div class="page" id="page3">
page 3 content here
</div>
</body>
</html>
解决方案
您不能为display
属性设置动画。因此,当您同时设置opacity
和display
时,opacity
将转换但display
值会立即更改。
作为替代方案,visibility
可以为属性设置动画。它的值之间的插值发生在中间点,所以如果你想让它使用transition
它可能会使事情复杂化。但我过去曾成功使用 CSS 动画同时进行opacity
更改visibility
。使用这样的动画:
@keyframes becomeVisible {
0% { visibility: visible; }
100% { visibility: visible; }
}
@keyframes becomeHidden {
0% { visibility: visible; }
100% { visibility: visible; }
100% { visibility: hidden; }
}
@keyframes fadein {
0% { opacity: 0; }
100% { opacity: 1; }
}
@keyframes fadeout {
0% { opacity: 1; }
100% { opacity: 0; }
}
推荐阅读
- typescript - 使用 fp-ts 在单个输入上运行验证函数列表
- javascript - 如何在订阅 ts angular 中具有异步功能
- c++ - 24位地址和24位算术与24位地址与16位地址的地址算术之间的区别?
- node.js - TypeORM:重复键,同时保存与现有实体的关系
- scala - 在 RDD 中添加新列
- entity-framework - 查询中的可选比较
- stm32 - Nucleo 上的 STM32L476,无法以 80 Mhz 运行
- c# - 使用 iText 正确解码 PDF 文本以进行简单的文本替换
- java - 如何使用 nimbus oauth oidc sdk 使用代理获取令牌
- r - R函数从现有变量创建新变量