我想在打开对话框元素时对其应用
transition
,但我的 transition
属性似乎没有任何效果。这是我的代码:
const dialog = document.querySelector("dialog");
document.querySelector("#open-button").addEventListener("click", () => {
dialog.showModal();
});
document.querySelector("#close-button").addEventListener("click", () => {
dialog.close();
});
button {
display: block;
}
dialog {
position: absolute;
top: 50px;
margin: auto;
padding: 0;
width: 50%;
height: 50%;
background-color: red;
opacity: 0;
-webkit-transition: opacity 2s ease-in, background-color 2s ease-in;
-o-transition: opacity 2s ease-in, background-color 2s ease-in;
transition: opacity 2s ease-in, background-color 2s ease-in;
}
dialog[open] {
background-color: green;
opacity: 1;
}
<button id="open-button">Open Dialog Element</button>
<dialog>
<button id="close-button">Close Dialog Element</button>
</dialog>
我的目的是随着对话框的背景明显从红色变为绿色,慢慢淡出对话框。
而是立即应用
dialog[open]
的规则? MDN 文章 没有在任何地方提到 transition
或动画,这意味着它应该像任何其他元素一样工作。
我正在 Windows 10 上的 Firefox 中测试此功能。
您的对话框从
display:none
过渡到 display:block
,这会毁掉 transition
。想法是添加 dialog { display:block; }
但结果很糟糕,因为对话框只是隐藏的并且对键盘 TAB 导航做出反应......所以我们需要保持一个关闭的对话框 display:none
。
有几个解决方案:
animation
,因为它是一个纯CSS解决方案:dialog[open] {
animation: fadein 2s ease-in forwards;
}
@keyframes fadein{
0%{
opacity:0;
}
100%{
opacity:1;
background-color: green;
}
}
const dialog = document.querySelector("dialog");
document.querySelector("#open-button").addEventListener("click", () => {
dialog.showModal();
});
document.querySelector("#close-button").addEventListener("click", () => {
dialog.close();
});
button {
display: block;
}
dialog {
position: absolute;
top: 50px;
margin: auto;
padding: 0;
width: 50%;
height: 50%;
background-color: red;
opacity: 0;
}
dialog[open] {
animation: fadein 2s ease-in forwards;
}
@keyframes fadein{
0%{
opacity:0;
}
100%{
opacity:1;
background-color: green;
}
}
<button id="open-button">Open Dialog Element</button>
<dialog>
<button id="close-button">Close Dialog Element</button>
</dialog>
setTimeout
添加 CSS 类,以允许重新渲染 DOM,并在关闭时将其删除,同时保持 transition
保持不变。setTimeout(()=>dialog.classList.add('open'));
dialog.addEventListener('close', () => dialog.classList.remove('open'));
const dialog = document.querySelector("dialog");
dialog.addEventListener('close', () => dialog.classList.remove('open'));
document.querySelector("#open-button").addEventListener("click", () => {
dialog.showModal();
setTimeout(()=>dialog.classList.add('open'));
});
document.querySelector("#close-button").addEventListener("click", () => {
dialog.close();
});
button {
display: block;
}
dialog {
position: absolute;
top: 50px;
margin: auto;
padding: 0;
width: 50%;
height: 50%;
background-color: red;
opacity: 0;
-webkit-transition: opacity 2s ease-in, background-color 2s ease-in;
-o-transition: opacity 2s ease-in, background-color 2s ease-in;
transition: opacity 2s ease-in, background-color 2s ease-in;
}
dialog.open {
background-color: green;
opacity: 1;
}
<button id="open-button">Open Dialog Element</button>
<dialog>
<button id="close-button">Close Dialog Element</button>
</dialog>