问题描述
<!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的解决方案,通过单击黄色框,它会平滑增长,以填满整个屏幕,而不会产生突然跳跃效果。如果您的浏览器滚动位置为0px(即页面顶部),则上述我的解决方案有效。但是当您向下滚动100vh时,单击黄色框会使它在增长之前向下跳一点,我在这30秒的视频中对此进行了澄清:https://www.youtube.com/watch?v=2hVNg-OPZ6Q。
有人可以建议我如何仅使用CSS和HTML来使我的黄色框平滑过渡,以使其生长并填充整个屏幕吗?
解决方法
仅使用css的解决方案,恐怕您要实现的目标并非100%可能。
正如另一个答案所述,主要问题来自您要从position
到固定absolute
的事实。问题是position
属性是不可动画的,这意味着无论您在transition
属性中应用多少秒,它都不会起作用。
最接近纯CSS的解决方案是:
/* Some code */
input:checked~.contain .box {
background: pink;
top: 0;
height: 100%;
width: 100%;
}
/* Some code */
该框将进行动画处理以填充整个视口,但是动画时间会略有不同,以填充整个高度。动画还将从初始的黄色框位置开始,而不是从屏幕底部开始。
如果要准确地动画化帖子中的描述方式,则必须使用一些JavaScript。
,突然跳动效果的原因是输入:检查您是否已固定位置将其更改为绝对位置。
position:absolute;
固定位置使元素相对于其包含块(即包含类)的位置和尺寸,而从绝对角度而言,它相对于通常是视口的初始包含块:浏览器窗口或纸张的页面框。