CSS3 转换,使用 translateX + translateY 设置为正值,似乎没有正确转换
CSS3 transitions, using translateX + translateY set to positive values, do not appear to transition properly
我目前正在尝试在一组不同的面板上实现一些 CSS 过渡效果,使它们看起来像 "sliding in" 从屏幕上看。我希望它们每个都出现在不同的方向(例如从上到下、从左到右等)
据推测,要从下到上和从右到左,我只想设置 translateX 或 translateY,但要设置正值,而不是负值。然后对于所有这些,当我希望它们出现在屏幕上时,我会将值转换为 0。
这是 what I am trying to do 的真正简化版本:
HTML:
<div class="container">
<div id="about" class="panel">
<h2>About</h2>
<p>I'm Mike and I don't know!</p>
<a href="#">Close</a>
</div>
<div id="projects" class="panel">
<h2>Projects</h2>
<p>Here are some projects I have worked on.</p>
<a href="#">Close</a>
</div>
<div id="contact" class="panel">
<h2>Contact</h2>
<p>You can find me all over the Internet!</p>
<a href="#">Close</a>
</div>
<div id="blog" class="panel">
<h2>Blog</h2>
<p>Here are some blog posts.</p>
<a href="#">Close</a>
</div>
<a href="#projects">projects</a>
<a href="#blog">blog</a>
<a href="#about">about</a>
<a href="#contact">contact</a>
</div>
CSS:
.container {
overflow:hidden;
position:relative;
width:100vw;
height:100vh;
}
.panel{
min-width: 100%;
height: 100%;
position: absolute;
box-shadow: 0px 4px 7px rgba(0,0,0,0.6);
z-index: 2;
-webkit-transition: transform .8s ease-in-out;
-moz-transition: transform .8s ease-in-out;
-o-transition: transform .8s ease-in-out;
transition: transform .8s ease-in-out;
}
.panel:target {
-webkit-transition: transform .8s ease-in-out;
-moz-transition: transform .8s ease-in-out;
-o-transition: transform .8s ease-in-out;
transition: transform .8s ease-in-out;
}
.panel#contact {
transform: translateX(110%);
background-color:whitesmoke;
}
.panel#about {
transform: translateX(-110%);
background-color: red;
}
.panel#projects {
transform: translateY(110%);
background-color: blue;
}
.panel#blog {
transform: translateY(-110%);
background-color: gold;
}
.panel#contact:target{
transform: translateX(0%);
}
.panel#about:target{
transform: translateX(0%);
}
.panel#projects:target{
transform: translateY(0%);
}
.panel#blog:target{
transform: translateY(0%);
}
请注意,"About" 和 "Blog" 链接正在按预期转换,而 "Projects" 和 "Contact" 链接似乎会导致异常。那些是正值的两个。
我真的很难过:
a.) 理解问题到底是什么
b.) 我该如何修复它(如果有的话)
如果有人能解释浏览器现在在处理那些错误的转换并提供解决方案,我将非常感激。 AFAIK,这在每个浏览器中都会发生(无论如何都支持 :target 伪元素)。
如果您需要说明,请告诉我。非常感谢!
更新:未修复,但我注意到如果您将有问题的元素面板(项目 + 联系人)的值设置为 <98%,页面会正确转换,但它不会从屏幕上隐藏。不确定这意味着什么,但如果有帮助...
更新 2.0:感谢您的评论,伙计们!我尝试添加一个容器,并更新了 HTML 和 CSS 以反映这一点。有问题的变化是包装面板的容器 div,以及该容器的以下 CSS:
.container {
overflow:hidden;
position:relative;
width:100vw;
height:100vh;
}
我仍然有类似的行为 -- 这也在 Codepen 中更新。我想我现在明白了这个问题,但我不太确定为什么在应用转换之前页面仍然跳转到有问题的元素。我可以想象有一些 hacky 方法可以解决这个问题,但我宁愿用 "right" 方式来做。
我决定使用 :target 并尝试让它成为纯粹的 CSS 并不是正确的方法,最后只是以一种相当直接的方式使用 Javascript。
经验教训:除非你真的必须这样做,否则不要尝试使用纯 CSS 做事。
我目前正在尝试在一组不同的面板上实现一些 CSS 过渡效果,使它们看起来像 "sliding in" 从屏幕上看。我希望它们每个都出现在不同的方向(例如从上到下、从左到右等)
据推测,要从下到上和从右到左,我只想设置 translateX 或 translateY,但要设置正值,而不是负值。然后对于所有这些,当我希望它们出现在屏幕上时,我会将值转换为 0。
这是 what I am trying to do 的真正简化版本:
HTML:
<div class="container">
<div id="about" class="panel">
<h2>About</h2>
<p>I'm Mike and I don't know!</p>
<a href="#">Close</a>
</div>
<div id="projects" class="panel">
<h2>Projects</h2>
<p>Here are some projects I have worked on.</p>
<a href="#">Close</a>
</div>
<div id="contact" class="panel">
<h2>Contact</h2>
<p>You can find me all over the Internet!</p>
<a href="#">Close</a>
</div>
<div id="blog" class="panel">
<h2>Blog</h2>
<p>Here are some blog posts.</p>
<a href="#">Close</a>
</div>
<a href="#projects">projects</a>
<a href="#blog">blog</a>
<a href="#about">about</a>
<a href="#contact">contact</a>
</div>
CSS:
.container {
overflow:hidden;
position:relative;
width:100vw;
height:100vh;
}
.panel{
min-width: 100%;
height: 100%;
position: absolute;
box-shadow: 0px 4px 7px rgba(0,0,0,0.6);
z-index: 2;
-webkit-transition: transform .8s ease-in-out;
-moz-transition: transform .8s ease-in-out;
-o-transition: transform .8s ease-in-out;
transition: transform .8s ease-in-out;
}
.panel:target {
-webkit-transition: transform .8s ease-in-out;
-moz-transition: transform .8s ease-in-out;
-o-transition: transform .8s ease-in-out;
transition: transform .8s ease-in-out;
}
.panel#contact {
transform: translateX(110%);
background-color:whitesmoke;
}
.panel#about {
transform: translateX(-110%);
background-color: red;
}
.panel#projects {
transform: translateY(110%);
background-color: blue;
}
.panel#blog {
transform: translateY(-110%);
background-color: gold;
}
.panel#contact:target{
transform: translateX(0%);
}
.panel#about:target{
transform: translateX(0%);
}
.panel#projects:target{
transform: translateY(0%);
}
.panel#blog:target{
transform: translateY(0%);
}
请注意,"About" 和 "Blog" 链接正在按预期转换,而 "Projects" 和 "Contact" 链接似乎会导致异常。那些是正值的两个。
我真的很难过:
a.) 理解问题到底是什么 b.) 我该如何修复它(如果有的话)
如果有人能解释浏览器现在在处理那些错误的转换并提供解决方案,我将非常感激。 AFAIK,这在每个浏览器中都会发生(无论如何都支持 :target 伪元素)。
如果您需要说明,请告诉我。非常感谢!
更新:未修复,但我注意到如果您将有问题的元素面板(项目 + 联系人)的值设置为 <98%,页面会正确转换,但它不会从屏幕上隐藏。不确定这意味着什么,但如果有帮助...
更新 2.0:感谢您的评论,伙计们!我尝试添加一个容器,并更新了 HTML 和 CSS 以反映这一点。有问题的变化是包装面板的容器 div,以及该容器的以下 CSS:
.container {
overflow:hidden;
position:relative;
width:100vw;
height:100vh;
}
我仍然有类似的行为 -- 这也在 Codepen 中更新。我想我现在明白了这个问题,但我不太确定为什么在应用转换之前页面仍然跳转到有问题的元素。我可以想象有一些 hacky 方法可以解决这个问题,但我宁愿用 "right" 方式来做。
我决定使用 :target 并尝试让它成为纯粹的 CSS 并不是正确的方法,最后只是以一种相当直接的方式使用 Javascript。
经验教训:除非你真的必须这样做,否则不要尝试使用纯 CSS 做事。