ReactJS 在悬停时显示元素
ReactJS show element on hover
实现持久效果的最佳方法是什么like in this gif?
我认为 framer-motion whileHover 属性是我最好的机会,但我误解了它是如何工作的,我认为它可以像 CSS 动画中那样输入和输入参数。
我想在光标悬停在其上或达到特定视口高度时显示 'footer'。
gif 中的内容是使用 css 中的关键帧动画制作的。
如果有任何提示、指导、link 视频关于如何构建此类内容,我将不胜感激。
提前致谢
我相信您仅使用 CSS 就可以达到同样的效果。这通常是可取的,因为 javascript 会使您的代码膨胀并且执行速度变慢。
您可以在 this fiddle
中看到实现此效果的方法
基本上,您可以使用“悬停”伪类进行美学上的更改,然后使用“过渡”属性 对其进行动画处理。
在上面的 fiddle 中,这是真正起作用的代码:
/* setting base styles for the footer element */
footer {
margin: 0 auto;
width: 200px;
transform: translateY(60px);
transition: width 1s, transform 1s;
}
/* having an inner child will give that "truncated border radius" effect you see in the gif */
footer .inner {
background-color: lightblue;
padding: 3em;
border-radius: 50%;
transition: border-radius 1s;
}
/* Make changes using the "hover" pseudoclass */
footer:hover {
transform: translateY(0px);
width: 100%;
}
footer:hover .inner {
border-radius: 0%;
}
请注意,我发布的 fiddle 只是关于如何构建此组件的提示,但它仍然缺少一些功能,例如页脚文本内容本身的处理(现在它不会'如果它是多行的,则效果不佳)和可访问性。
仅使用 css 查看此解决方案:
* {
margin: 0px;
padding: 0px;
box-sizing: border-box;
font-family: Segoe UI, sans-serif;
}
.container {
width: 100vw;
height: 100vh;
}
.container main {
width: 80%;
height: 400px;
margin: auto;
border-radius: 30px;
display: flex;
justify-content: center;
align-items: center;
font-size: 3em;
font-weight: 800;
color: white;
background: rgb(70, 100, 52);
}
.container footer {
width: 100%;
display: flex;
justify-content: center;
}
.container footer .expand {
width: 200px;
height: 50px;
background: royalblue;
border-radius: 40px 40px 0 0;
position: fixed;
bottom: 0px;
display: flex;
justify-content: center;
font-size: 1em;
color: white;
transition: 1000ms;
}
.container footer .expand:hover {
width: 100%;
animation-name: resize;
animation-duration: 700ms;
height: 150px;
border-radius: 0;
}
@keyframes resize {
0% {
height: 50px;
border-radius: 60px 60px 0 0;
}
50% {
height: 160px;
border-radius: 90px 90px 0 0;
}
100% {height: 150px;}
}
<div class="container">
<main>
this is your main feed
</main>
<footer>
<div class="expand">^^^</div>
</footer>
</div>
实现持久效果的最佳方法是什么like in this gif? 我认为 framer-motion whileHover 属性是我最好的机会,但我误解了它是如何工作的,我认为它可以像 CSS 动画中那样输入和输入参数。
我想在光标悬停在其上或达到特定视口高度时显示 'footer'。
gif 中的内容是使用 css 中的关键帧动画制作的。
如果有任何提示、指导、link 视频关于如何构建此类内容,我将不胜感激。
提前致谢
我相信您仅使用 CSS 就可以达到同样的效果。这通常是可取的,因为 javascript 会使您的代码膨胀并且执行速度变慢。
您可以在 this fiddle
中看到实现此效果的方法基本上,您可以使用“悬停”伪类进行美学上的更改,然后使用“过渡”属性 对其进行动画处理。
在上面的 fiddle 中,这是真正起作用的代码:
/* setting base styles for the footer element */
footer {
margin: 0 auto;
width: 200px;
transform: translateY(60px);
transition: width 1s, transform 1s;
}
/* having an inner child will give that "truncated border radius" effect you see in the gif */
footer .inner {
background-color: lightblue;
padding: 3em;
border-radius: 50%;
transition: border-radius 1s;
}
/* Make changes using the "hover" pseudoclass */
footer:hover {
transform: translateY(0px);
width: 100%;
}
footer:hover .inner {
border-radius: 0%;
}
请注意,我发布的 fiddle 只是关于如何构建此组件的提示,但它仍然缺少一些功能,例如页脚文本内容本身的处理(现在它不会'如果它是多行的,则效果不佳)和可访问性。
仅使用 css 查看此解决方案:
* {
margin: 0px;
padding: 0px;
box-sizing: border-box;
font-family: Segoe UI, sans-serif;
}
.container {
width: 100vw;
height: 100vh;
}
.container main {
width: 80%;
height: 400px;
margin: auto;
border-radius: 30px;
display: flex;
justify-content: center;
align-items: center;
font-size: 3em;
font-weight: 800;
color: white;
background: rgb(70, 100, 52);
}
.container footer {
width: 100%;
display: flex;
justify-content: center;
}
.container footer .expand {
width: 200px;
height: 50px;
background: royalblue;
border-radius: 40px 40px 0 0;
position: fixed;
bottom: 0px;
display: flex;
justify-content: center;
font-size: 1em;
color: white;
transition: 1000ms;
}
.container footer .expand:hover {
width: 100%;
animation-name: resize;
animation-duration: 700ms;
height: 150px;
border-radius: 0;
}
@keyframes resize {
0% {
height: 50px;
border-radius: 60px 60px 0 0;
}
50% {
height: 160px;
border-radius: 90px 90px 0 0;
}
100% {height: 150px;}
}
<div class="container">
<main>
this is your main feed
</main>
<footer>
<div class="expand">^^^</div>
</footer>
</div>