下面是详细的攻略:
背景知识
在实现 HTML5 按钮背景动画之前,有些基础知识需要了解:
CSS3 伪类
CSS3 中的伪类可以让我们在某些元素状态改变的时候(如:鼠标 hover、点击等),加入一些特殊的样式。常见的伪类有以下几种:
- :hover - 鼠标悬停在该元素上时
- :active - 点击该元素时(鼠标还没松开时)
- :focus - 该元素被选中(例如:表单控件)
CSS3 过渡
过渡可以在 CSS 属性发生变化时,通过动画实现平滑的过渡效果。常见的属性包括:background、height、width、top、left 等。
CSS3 动画
动画是一种更加复杂的 CSS3 特性。与过渡相比,动画更加动态、多样,可以定义更多的关键帧。
步骤说明
第一步:创建 HTML 按钮
首先需要在 HTML 文件中编写一个按钮,作为后续样式与动画示范的素材。
<button class="btn">我是一个按钮</button>
第二步:设置按钮样式
对按钮进行样式设置(如:背景、字体、圆角等),设置的样式需要支持伪类与动画过渡。
.btn {
font-size: 20px;
font-weight: 600;
color: #fff;
background-color: #c57fc5;
padding: 8px 20px;
border: none;
border-radius: 5px;
outline: none;
transition: all 0.3s;
}
第三步:添加鼠标悬浮样式
通过在按钮上应用伪类,设置鼠标悬停(:hover)时的样式。
.btn:hover {
background-color: #e8a2e8;
}
第四步:添加鼠标点击样式
通过在按钮上应用伪类,设置鼠标点击(:active)时的样式。这里我们让按钮在被点击时,背景色变为不透明的深紫色;同时将文本内容略作上移,模拟按钮被压下的效果。
.btn:active {
background-color: #6a2d6a;
color: #fff;
transform: translateY(1px);
box-shadow: inset 0 0 5px 2px rgba(0, 0, 0, 0.2);
}
第五步:添加波浪动画
为按钮添加一些动画效果。这里我们选择使用 SVG 实现波浪效果,需要在 HTML 文件中添加相应的 SVG 代码。
<div class="waveWrapper">
<svg
class="waves"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 24 150 28"
preserveAspectRatio="none"
shape-rendering="auto"
>
<defs>
<path
id="wavePath"
d="M-160 44c30 0
58-18 88-18s
58 18 88 18
58-18 88-18
58 18 88 18
v44h-352z"
/>
</defs>
<g class="parallax">
<use
xlink:href="#wavePath"
x="48"
y="0"
fill="rgba(255,255,255,0.7"
/>
<use
xlink:href="#wavePath"
x="48"
y="3"
fill="rgba(255,255,255,0.5)"
/>
<use
xlink:href="#wavePath"
x="48"
y="5"
fill="rgba(255,255,255,0.3)"
/>
<use xlink:href="#wavePath" x="48" y="7" fill="#fff" />
</g>
</svg>
</div>
SVG 代码的解释:
wavePath
: SVG 路径,表示波浪的形态;parallax
: 是一个 SVG 组(<g>
),用于将波浪中的三个图层分组。
然后在 CSS 文件中添加代码,设置按钮的背景为白色(或其他颜色),调整按钮与波浪的间距,使波浪的位置居于按钮背景的下方。
.btn {
font-size: 20px;
font-weight: 600;
color: #fff;
background-color: #ffffff; /* 背景为白色,与波浪配合使用 */
padding: 8px 20px;
border: none;
border-radius: 5px;
outline: none;
transition: all 0.3s;
position: relative; /* 设为 relative,为后续波浪设置绝对定位做准备 */
}
.waveWrapper {
overflow: hidden; /* 禁止波浪超出按钮区域 */
width: calc(100% + 2px); /* 加上2px的边框宽度 */
position: absolute; /* 设为绝对定位,覆盖在按钮上面 */
left: -1px; /* button 设置左边框为1px宽,为左边的波浪留出空间 */
bottom: -1px; /* button 设置下边框为1px宽,为下边的波浪留出空间 */
z-index: -1; /* 将图层置于下方 */
}
.waves {
position: absolute; /* 设为绝对定位,同样为后续波浪设置绝对定位做准备 */
width: 150%; /* 给波浪足够的宽度,能让波浪在按钮范围内滚动 */
height: auto; /* 图层高度自适应 */
bottom: -5px; /* 为了让波浪在按钮范围内滚动,需要它越界一些 */
left: -25%; /* 同理,需要先移出边框的一部分 */
opacity: 0.5; /* 设置图层不透明度,越往上就越透明 */
animation: wave 20s linear infinite; /* 添加波浪动画(后面会详细讲解) */
}
@keyframes wave {
0% {
transform: translateX(0) translateZ(0) scaleY(1);
}
50% {
transform: translateX(-25%) translateZ(0) scaleY(0.55);
}
100% {
transform: translateX(-50%) translateZ(0) scaleY(1);
}
}
至此,HTML5 按钮背景设计不同的动画的简单实例就已经完成了,按钮呈现出了一种波浪效果,同时根据不同的交互状态(悬浮、点击)也呈现出不同样式。
添加扩散动画:
接下来让我们来研究一个更加炫酷的交互效果——扩散动画。
- 首先引入 JS 文件(可以直接通过 CDN 引入):
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/v-tooltip@2.0.1/dist/v-tooltip.min.js"></script>
先通过引入 JaveScript 库(Vue.js 与 tooltip)使得我们可通过 JS 动态地修改 CSS3 属性。
- 通过调整按钮 CSS 使得动画效果更加明显:
.btn {
position: relative;
font-size: 18px;
font-weight: 400;
color: #fff;
padding: 12px 60px;
background-color: #c57fc5;
border: none;
border-radius: 30px;
outline: none;
overflow: hidden;
cursor: pointer;
/* 线性渐变背景 */
background-image: linear-gradient(45deg, #c57fc5 0%, #ff6ca2 100%);
/* 添加过渡动画 */
transition: background-position 250ms ease-in-out, transform 150ms ease;
/* 禁止选中 */
user-select: none;
}
/* 悬浮在按钮上的样式 */
.btn:hover {
/* 渐变移动点 */
background-position: 98%;
}
/* 点击过后的样式 */
.btn:focus {
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.4); /* 点击时添加外阴影 */
}
/* 添加让图标随动画而缩放效果的CSS */
.icon i {
font-size: 15px;
transition: transform 150ms ease;
}
.btn:active .icon i { /* 使图标与背景同时缩小 */
transform: scale(0.8);
}
如果要让扩散动画效果更好,需要为按钮添加三个元素,并设置三个不同的状态:
<!-- 响应扩散动画的三个元素 -->
<div class="ripple-background">
<div class="circle xxlarge shade1"></div>
<div class="circle xlarge shade2"></div>
<div class="circle large shade3"></div>
</div>
- 通过 Vue.js 与 tooltip 库给按钮添加 Google 风格的 tooltip:
<!-- 给按钮添加 tooltip -->
<button class="btn tooltip" v-tooltip="'Add'">
<i class="material-icons icon">add</i>
Add Friend
</button>
- 最终的 CSS 样式文件:
/* 引入 CSS3 特性库 */
@import url("https://fonts.googleapis.com/icon?family=Material+Icons");
@import url("https://cdn.jsdelivr.net/npm/v-tooltip@2.0.1/dist/v-tooltip.min.css");
html {
height: 100%;
}
body {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
background-color: #1c222b;
}
/* 添加动态的线条 */
.ripple-background {
display: none;
opacity: 0;
position: absolute; /* 设为绝对定位 */
z-index: -1; /* 将图层置于下方 */
border-radius: 50%; /* 因为圆心在右下方,所以需要使用一半的圆角 */
-webkit-transform: scale(0); /* 给按钮添加一个原始的 CSS3 动画效果 */
transform: scale(0);
}
@media (prefers-reduced-motion: reduce) {
.ripple-background,
.friend {
transform: none !important; /* 如果用户使用了减少动画 motion 的功能,则不使用动画 */
}
}
.shade1 {
background-color: rgba(255, 255, 255, 0.25);
}
.shade2 {
background-color: rgba(255, 255, 255, 0.15);
}
.shade3 {
background-color: rgba(255, 255, 255, 0.05);
}
/* 添加动态的阴影(动画效果会比之前的更流畅) */
.btn:focus {
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.2);
}
.friend {
padding: 14px;
margin-top: -60px;
box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.1);
border-radius: 3px;
background-color: #fcfcfc;
color: #555;
animation: pop 300ms ease forwards;
}
.material-icons {
margin-right: 5px;
}
@keyframes pop {
0% {
transform: scale(1.2);
opacity: 0;
}
80% {
transform: scale(1.1);
opacity: 1;
}
100% {
transform: scale(1);
}
}
/* 添加波浪效果 */
.btn {
position: relative;
font-size: 18px;
font-weight: 400;
color: #fff;
padding: 12px 60px;
background-color: #c57fc5;
border: none;
border-radius: 30px;
outline: none;
overflow: hidden;
cursor: pointer;
background-image: linear-gradient(45deg, #c57fc5 0%, #ff6ca2 100%);
transition: background-position 250ms ease-in-out, transform 150ms ease;
user-select: none;
}
.btn:hover {
background-position: 98%;
}
.btn:focus {
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.4);
}
.icon i {
font-size: 15px;
transition: transform 150ms ease;
}
.btn:active .icon i {
transform: scale(0.8);
}
.tooltip {
position: relative;
margin-top: -10px;
z-index: 2;
}
.tooltip:before {
content: "";
position: absolute;
left: 50%;
bottom: calc(100% + 5px); /* 在按钮正下方 的五像素处 */
display: block;
width: 0px;
height: 0px;
margin-left: -6px;
border-style: solid;
border-color: transparent;
border-bottom-color: #fff;
border-width: 6px;
}
.tooltip:after {
content: "";
position: absolute;
left: 50%;
bottom: calc(100% + 10px); /* 在按钮正下方 的10像素处 */
transform: translateX(-50%);
display: block;
padding: 5px 8px;
font-family: 'Segoe UI', sans-serif;
font-size: 14px;
font-weight: 400;
line-height: 1.4;
color: #fff;
text-align: center;
text-decoration: none;
white-space: nowrap;
background-color: rgba(51, 51, 51, 0.8);
border-radius: 4px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
pointer-events: none;
opacity: 0;
transition: opacity 150ms;
}
.tooltip:hover:after {
opacity: 1;
}
至此,使用 HTML5 巧妙设计的两个按钮动画就介绍完毕了,如果你想详细了解更多的 HTML5 动画技巧,建议多多学习相关教程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:巧用HTML5给按钮背景设计不同的动画简单实例 - Python技术站