使用 CSS 使方框充满整个屏幕而不会突然跳动
Use CSS to animate a box to fill a whole screen without any abrupt jumping
我有以下代码,它只是从容器顶部绘制一个黄色框 80vh:
<!DOCTYPE html>
<html>
<head>
<style>
:root {
--t: 1s;
}
body {
padding:0;
margin:0;
}
.contain {
position:relative;
height:400vh;
background:blue;
}
.box {
position:absolute;
top:80vh;
height:400px;
width:50vw;
left:0;
background:yellow;
transition: position 0s linear var(--t),
background var(--t) ease 0s,
top var(--t) ease 0s,
height var(--t) ease 0s,
width var(--t) ease 0s;
}
input {
display:none;
}
input:checked ~ .contain .box {
position:fixed;
background: pink;
top:0;
height:100vh;
width:100vw;
}
</style>
</head>
<body>
<input id="checkbox" type="checkbox" />
<div class="contain">
<label class="box" for="checkbox"></label>
</div>
</body>
</html>
我想要一个 CSS 唯一的解决方案,如果我点击黄色框,它将 平滑地 增长以填满整个屏幕而没有任何 abrupt跳跃效果。如果您的浏览器滚动位置为 0px(即在页面顶部),我上面的解决方案有效。但是当你向下滚动说 100vh 时,点击黄色框会导致它在增长之前向下跳一点,我在这个 30 秒的视频中澄清了这一点:https://www.youtube.com/watch?v=2hVNg-OPZ6Q .
任何人都可以建议我如何使用 CSS 和 HTML 来实现我的黄色框增长并填满整个屏幕的平滑过渡吗?
突然跳跃效果背后的原因是在input:checked中你有固定位置将其更改为绝对。
position:absolute;
固定位置使元素的位置和尺寸相对于它的包含块,即包含 class,而在绝对位置中,它相对于通常是视口的初始包含块:浏览器 window 或论文的页面框。
恐怕 css-only 解决方案无法 100% 实现您想要实现的目标。
正如另一个答案所述,主要问题来自于您要从 absolute
固定 position
的事实。问题是 position
属性 不可设置动画,这意味着无论您在 transition
属性 中应用多少秒,它都不会产生任何效果。
最接近的 css-only 解决方案是:
/* Some code */
input:checked~.contain .box {
background: pink;
top: 0;
height: 100%;
width: 100%;
}
/* Some code */
盒子将通过动画填充整个视口,但填充整个高度的动画时间略有不同。此外动画将从初始的黄色框位置开始,而不是从屏幕底部开始。
如果您想按照您在 post 中描述的方式进行动画处理,则必须使用一些 javascript。
我有以下代码,它只是从容器顶部绘制一个黄色框 80vh:
<!DOCTYPE html>
<html>
<head>
<style>
:root {
--t: 1s;
}
body {
padding:0;
margin:0;
}
.contain {
position:relative;
height:400vh;
background:blue;
}
.box {
position:absolute;
top:80vh;
height:400px;
width:50vw;
left:0;
background:yellow;
transition: position 0s linear var(--t),
background var(--t) ease 0s,
top var(--t) ease 0s,
height var(--t) ease 0s,
width var(--t) ease 0s;
}
input {
display:none;
}
input:checked ~ .contain .box {
position:fixed;
background: pink;
top:0;
height:100vh;
width:100vw;
}
</style>
</head>
<body>
<input id="checkbox" type="checkbox" />
<div class="contain">
<label class="box" for="checkbox"></label>
</div>
</body>
</html>
我想要一个 CSS 唯一的解决方案,如果我点击黄色框,它将 平滑地 增长以填满整个屏幕而没有任何 abrupt跳跃效果。如果您的浏览器滚动位置为 0px(即在页面顶部),我上面的解决方案有效。但是当你向下滚动说 100vh 时,点击黄色框会导致它在增长之前向下跳一点,我在这个 30 秒的视频中澄清了这一点:https://www.youtube.com/watch?v=2hVNg-OPZ6Q .
任何人都可以建议我如何使用 CSS 和 HTML 来实现我的黄色框增长并填满整个屏幕的平滑过渡吗?
突然跳跃效果背后的原因是在input:checked中你有固定位置将其更改为绝对。
position:absolute;
固定位置使元素的位置和尺寸相对于它的包含块,即包含 class,而在绝对位置中,它相对于通常是视口的初始包含块:浏览器 window 或论文的页面框。
恐怕 css-only 解决方案无法 100% 实现您想要实现的目标。
正如另一个答案所述,主要问题来自于您要从 absolute
固定 position
的事实。问题是 position
属性 不可设置动画,这意味着无论您在 transition
属性 中应用多少秒,它都不会产生任何效果。
最接近的 css-only 解决方案是:
/* Some code */
input:checked~.contain .box {
background: pink;
top: 0;
height: 100%;
width: 100%;
}
/* Some code */
盒子将通过动画填充整个视口,但填充整个高度的动画时间略有不同。此外动画将从初始的黄色框位置开始,而不是从屏幕底部开始。
如果您想按照您在 post 中描述的方式进行动画处理,则必须使用一些 javascript。