HTML+CSS:飞翔按钮

效果演示

实现了一个按钮的动画效果,当鼠标悬停在按钮上时,按钮的背景颜色和图标会发生变化,并且图标会旋转45度并向右移动1.2em,同时按钮中的文字也会向右移动5em。当鼠标点击按钮时,按钮会变小并向下移动0.1em。整个效果看起来像是按钮在飞翔或跳跃。

Code

html 复制代码
<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>
css 复制代码
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);
    }
}

实现思路拆分

css 复制代码
body {
  height: 100vh; /* 设置body高度为视口高度 */
  display: flex; /* 设置body元素为flex布局 */
  justify-content: center; /* 设置flex容器中内容的水平对齐方式为居中 */
  align-items: center; /* 设置flex容器中内容的垂直对齐方式为居中 */
  background-color: #212121; /* 设置body元素的背景颜色为深灰色 */
}

这段代码设置了页面的基本样式,包括高度、居中对齐方式和背景颜色。

css 复制代码
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; /* 设置鼠标指针为手型 */
}

这段代码设置了按钮的基本样式,包括字体、字体大小、背景颜色、字体颜色、内边距、边框、边框圆角、溢出隐藏、过渡效果和鼠标指针。

css 复制代码
button span {
  display: block; /* 设置元素为块级元素 */
  margin-left: 0.3em; /* 设置左侧外边距为0.3em */
  transition: all 0.3s ease-in-out; /* 设置过渡效果持续时间为0.3秒,缓动函数为ease-in-out */
}

这段代码设置了按钮中的文字样式,包括块级元素、左侧外边距和过渡效果。

css 复制代码
button svg {
  display: block; /* 设置元素为块级元素 */
  transform-origin: center center; /* 设置变换原点为中心点 */
  transition: transform 0.3s ease-in-out; /* 设置过渡效果持续时间为0.3秒,缓动函数为ease-in-out */
}

这段代码设置了按钮中的图标样式,包括块级元素、变换原点和过渡效果。

css 复制代码
button:hover.svg-wrapper {
  animation: fly-1 0.6s ease-in-out infinite alternate; /* 设置鼠标悬停时,动画名称为fly-1,持续时间为0.6秒,缓动函数为ease-in-out,无限循环,交替执行 */
}

这段代码设置了鼠标悬停时,按钮中的图标的动画效果,包括动画名称、持续时间、缓动函数、无限循环和交替执行。

css 复制代码
button:hover svg {
  transform: translateX(1.2em) rotate(45deg) scale(1.1); /* 设置鼠标悬停时,图标向右移动1.2em,旋转45度,放大1.1倍 */
}

这段代码设置了鼠标悬停时,按钮中的图标的变换效果,包括向右移动1.2em,旋转45度,放大1.1倍。

css 复制代码
button:hover span {
  transform: translateX(5em); /* 设置鼠标悬停时,文字向右移动5em */
}

这段代码设置了鼠标悬停时,按钮中的文字的变换效果,包括向右移动5em。

css 复制代码
button:active {
  transform: scale(0.95); /* 设置鼠标点击时,按钮放大0.95倍 */
}

这段代码设置了鼠标点击时,按钮的变换效果,包括放大0.95倍。

css 复制代码
@keyframes fly-1 {
  from {
    transform: translateY(0.1em); /* 设置动画的起始状态,将图标向下移动0.1em */
  }

  to {
    transform: translateY(-0.1em); /* 设置动画的结束状态,将图标向上移动0.1em */
  }
}

这段代码定义了一个名为fly-1的动画,包括起始状态和结束状态。在起始状态时,图标向下移动0.1em,在结束状态时,图标向上移动0.1em。这个动画会在鼠标悬停时无限循环执行,交替向下和向上移动图标。

相关推荐
GIS程序媛—椰子38 分钟前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_00144 分钟前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端1 小时前
Content Security Policy (CSP)
前端·javascript·面试
木舟10091 小时前
ffmpeg重复回听音频流,时长叠加问题
前端
王大锤43911 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
我血条子呢1 小时前
[Vue]防止路由重复跳转
前端·javascript·vue.js
黎金安1 小时前
前端第二次作业
前端·css·css3
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
半开半落2 小时前
nuxt3安装pinia报错500[vite-node] [ERR_LOAD_URL]问题解决
前端·javascript·vue.js·nuxt