效果演示
实现了一个按钮的动画效果,当鼠标悬停在按钮上时,按钮的背景颜色和图标会发生变化,并且图标会旋转45度并向右移动1.2em,同时按钮中的文字也会向右移动5em。当鼠标点击按钮时,按钮会变小并向下移动0.1em。整个效果看起来像是按钮在飞翔或跳跃。
Code
<button>
<div class="svg-wrapper-1">
<div class="svg-wrapper">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z"></path>
<path fill="currentColor"
d="M1.946 9.315c-.522-.174-.527-.455.01-.634l19.087-6.362c.529-.176.832.12.684.638l-5.454 19.086c-.15.529-.455.547-.679.045L12 14l6-8-8 6-8.054-2.685z">
</path>
</svg>
</div>
</div>
<span>Send</span>
</button>
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #212121;
}
button {
font-family: inherit;
font-size: 20px;
background: royalblue;
color: white;
padding: 0.7em 1em;
padding-left: 0.9em;
display: flex;
align-items: center;
border: none;
border-radius: 16px;
overflow: hidden;
transition: all 0.2s;
cursor: pointer;
}
button span {
display: block;
margin-left: 0.3em;
transition: all 0.3s ease-in-out;
}
button svg {
display: block;
transform-origin: center center;
transition: transform 0.3s ease-in-out;
}
button:hover .svg-wrapper {
animation: fly-1 0.6s ease-in-out infinite alternate;
}
button:hover svg {
transform: translateX(1.2em) rotate(45deg) scale(1.1);
}
button:hover span {
transform: translateX(5em);
}
button:active {
transform: scale(0.95);
}
@keyframes fly-1 {
from {
transform: translateY(0.1em);
}
to {
transform: translateY(-0.1em);
}
}
实现思路拆分
body {
height: 100vh; /* 设置body高度为视口高度 */
display: flex; /* 设置body元素为flex布局 */
justify-content: center; /* 设置flex容器中内容的水平对齐方式为居中 */
align-items: center; /* 设置flex容器中内容的垂直对齐方式为居中 */
background-color: #212121; /* 设置body元素的背景颜色为深灰色 */
}
这段代码设置了页面的基本样式,包括高度、居中对齐方式和背景颜色。
button {
font-family: inherit; /* 设置字体为继承父元素的字体 */
font-size: 20px; /* 设置字体大小为20像素 */
background: royalblue; /* 设置背景颜色为蓝色 */
color: white; /* 设置字体颜色为白色 */
padding: 0.7em 1em; /* 设置内边距为上下各0.7em,左右各1em */
padding-left: 0.9em; /* 设置左内边距为0.9em */
display: flex; /* 设置元素为flex布局 */
align-items: center; /* 设置flex容器中内容的垂直对齐方式为居中 */
border: none; /* 设置边框为无边框 */
border-radius: 16px; /* 设置边框圆角为16像素 */
overflow: hidden; /* 设置内容溢出隐藏 */
transition: all 0.2s; /* 设置过渡效果持续时间为0.2秒 */
cursor: pointer; /* 设置鼠标指针为手型 */
}
这段代码设置了按钮的基本样式,包括字体、字体大小、背景颜色、字体颜色、内边距、边框、边框圆角、溢出隐藏、过渡效果和鼠标指针。
button span {
display: block; /* 设置元素为块级元素 */
margin-left: 0.3em; /* 设置左侧外边距为0.3em */
transition: all 0.3s ease-in-out; /* 设置过渡效果持续时间为0.3秒,缓动函数为ease-in-out */
}
这段代码设置了按钮中的文字样式,包括块级元素、左侧外边距和过渡效果。
button svg {
display: block; /* 设置元素为块级元素 */
transform-origin: center center; /* 设置变换原点为中心点 */
transition: transform 0.3s ease-in-out; /* 设置过渡效果持续时间为0.3秒,缓动函数为ease-in-out */
}
这段代码设置了按钮中的图标样式,包括块级元素、变换原点和过渡效果。
button:hover.svg-wrapper {
animation: fly-1 0.6s ease-in-out infinite alternate; /* 设置鼠标悬停时,动画名称为fly-1,持续时间为0.6秒,缓动函数为ease-in-out,无限循环,交替执行 */
}
这段代码设置了鼠标悬停时,按钮中的图标的动画效果,包括动画名称、持续时间、缓动函数、无限循环和交替执行。
button:hover svg {
transform: translateX(1.2em) rotate(45deg) scale(1.1); /* 设置鼠标悬停时,图标向右移动1.2em,旋转45度,放大1.1倍 */
}
这段代码设置了鼠标悬停时,按钮中的图标的变换效果,包括向右移动1.2em,旋转45度,放大1.1倍。
button:hover span {
transform: translateX(5em); /* 设置鼠标悬停时,文字向右移动5em */
}
这段代码设置了鼠标悬停时,按钮中的文字的变换效果,包括向右移动5em。
button:active {
transform: scale(0.95); /* 设置鼠标点击时,按钮放大0.95倍 */
}
这段代码设置了鼠标点击时,按钮的变换效果,包括放大0.95倍。
@keyframes fly-1 {
from {
transform: translateY(0.1em); /* 设置动画的起始状态,将图标向下移动0.1em */
}
to {
transform: translateY(-0.1em); /* 设置动画的结束状态,将图标向上移动0.1em */
}
}
这段代码定义了一个名为fly-1的动画,包括起始状态和结束状态。在起始状态时,图标向下移动0.1em,在结束状态时,图标向上移动0.1em。这个动画会在鼠标悬停时无限循环执行,交替向下和向上移动图标。