【技术实战】Vue功能样式实战【六】
需求实战一
样式展示

代码展示
<template>
<ARow>
<ACol style="background-color:#F1F4F5 ">
<div class="info-card">
<div class="info-title">
数据总和
</div>
<div class="info-value">
100
</div>
</div>
</ACol>
</ARow>
</template>
<script setup lang="ts">
</script>
<style scoped>
:deep(.info-card){
width: 318px;
height: 116px;
background-color: #FFFFFF;
box-shadow: 0px 2px 10px 1px rgba(23,179,163,0.07);
border-radius: 4px;
}
:deep(.info-title){
font-size: 18px;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
line-height: 21px;
padding:20px 0 20px 30px;
}
:deep(.info-value){
font-size: 36px;
font-family: Microsoft YaHei;
font-weight: bold;
color: #333333;
line-height: 21px;
padding:0 0 0 30px;
}
</style>
代码解读
这段代码是一个Vue组件的模板部分,用于展示一个信息卡片。具体解释如下:
- <template> 标签用于定义组件的模板部分。
- <ARow> 和 <ACol> 是自定义的组件,用于布局。<ARow> 表示一行,<ACol> 表示一列。
- <ACol> 标签内部有一个 style 属性,用于设置背景颜色为 #F1F4F5。
- <div class="info-card"> 是一个具有 info-card 类名的 div 元素,表示信息卡片的容器。
- <div class="info-title"> 是一个具有 info-title 类名的 div 元素,表示信息卡片的标题。
- <div class="info-value"> 是一个具有 info-value 类名的 div 元素,表示信息卡片的数值。
接下来是 <script setup lang="ts"> 标签,用于编写组件的逻辑部分,这里是空的,没有任何代码。
最后是 <style scoped> 标签,用于定义组件的样式。:deep() 是一个深度选择器,用于选择组件内部的元素。.info-card 表示选择具有 info-card 类名的元素,设置了宽度、高度、背景颜色、阴影和边框圆角等样式。.info-title 和 .info-value 分别表示选择具有对应类名的元素,设置了字体大小、字体样式、颜色、行高和内边距等样式。
这段代码的作用是创建一个信息卡片组件,显示一个标题为 "数据总和",数值为 "100" 的信息。信息卡片具有特定的样式,包括背景颜色、阴影和边框圆角等。
需求实战二
样式展示

代码展示
<template>
<div class="info-card">
<div class="info-title">
数据总和
</div>
<div class="info-value">
100
</div>
<div class="animation-container">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
</template>
<script setup lang="ts"></script>
<style scoped>
.info-card {
width: 318px;
height: 200px;
background-color: #17b3a3;
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
}
.info-title {
font-size: 24px;
font-weight: bold;
color: #FFFFFF;
}
.info-value {
font-size: 48px;
font-weight: bold;
color: #FFFFFF;
}
.animation-container {
display: flex;
position: absolute;
bottom: 25px;
}
.circle {
width: 10px;
height: 10px;
background-color: #FFFFFF;
border-radius: 50%;
margin: 0 4px;
transform: scale(0);
animation: pulse 1.5s infinite cubic-bezier(0.215, 0.61, 0.355, 1) alternate;
}
.circle:nth-child(1) {
animation-delay: 0.1s;
}
.circle:nth-child(2) {
animation-delay: 0.2s;
}
.circle:nth-child(3) {
animation-delay: 0.3s;
}
.circle:nth-child(4) {
animation-delay: 0.4s;
}
.circle:nth-child(5) {
animation-delay: 0.5s;
}
.circle:nth-child(6) {
animation-delay: 0.6s;
}
@keyframes pulse {
0% {
opacity: 0;
transform: scale(0);
}
50% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(0);
}
}
</style>
代码解读
这段代码是一个Vue组件的模板部分,用于展示一个带有动画效果的信息卡片。具体解释如下:
- <template> 标签用于定义组件的模板部分。
- <div class="info-card"> 是一个具有 info-card 类名的 div 元素,表示信息卡片的容器。
- <div class="info-title"> 是一个具有 info-title 类名的 div 元素,表示信息卡片的标题。
- <div class="info-value"> 是一个具有 info-value 类名的 div 元素,表示信息卡片的数值。
- <div class="animation-container"> 是一个具有 animation-container 类名的 div 元素,用于容纳动画效果的圆圈。
- <div class="circle"> 是一个具有 circle 类名的 div 元素,表示一个圆圈。
接下来是 <script setup lang="ts"> 标签,用于编写组件的逻辑部分,这里是空的,没有任何代码。
最后是 <style scoped> 标签,用于定义组件的样式。.info-card 表示选择具有 info-card 类名的元素,设置了宽度、高度、背景颜色、边框圆角等样式,并使用了 Flex 布局使内容垂直居中。.info-title 和 .info-value 分别表示选择具有对应类名的元素,设置了字体大小、字体样式、颜色等样式。.animation-container 表示选择具有 animation-container 类名的元素,设置了绝对定位和底部偏移量。.circle 表示选择具有 circle 类名的元素,设置了圆圈的样式,包括宽度、高度、背景颜色、边框圆角、外边距和动画效果。
动画效果使用了 @keyframes 关键字定义了一个名为 pulse 的关键帧动画,通过改变透明度和缩放来实现圆圈的闪烁效果。.circle:nth-child(n) 选择了第 n 个具有 circle 类名的元素,并设置了不同的动画延迟时间,以实现圆圈的依次闪烁效果。
这段代码的作用是创建一个带有动画效果的信息卡片组件,显示一个标题为 "数据总和",数值为 "100" 的信息。信息卡片具有特定的样式,包括背景颜色、边框圆角和居中对齐等。同时,信息卡片底部有一组圆圈,通过动画效果实现闪烁的效果。
需求实战三
样式展示

代码展示
<template>
<div class="info-card">
<div class="info-title">
数据总和
</div>
<div class="info-value">
100
</div>
<div class="animation-container">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
</template>
<script setup lang="ts"></script>
<style scoped>
.info-card {
width: 318px;
height: 200px;
background-color: rgba(23, 179, 163, 0.5);
backdrop-filter: blur(10px);
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0.1) 75%, transparent 75%, transparent);
background-size: 20px 20px;
}
.info-title {
font-size: 24px;
font-weight: bold;
color: #FFFFFF;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.info-value {
font-size: 48px;
font-weight: bold;
color: #FFFFFF;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.animation-container {
display: flex;
position: absolute;
bottom: 25px;
}
.circle {
width: 10px;
height: 10px;
background-color: #FFD700;
border-radius: 50%;
margin: 0 4px;
transform: scale(0);
animation: pulse 1.5s infinite cubic-bezier(0.215, 0.61, 0.355, 1) alternate;
}
.circle:nth-child(1) {
animation-delay: 0.1s;
}
.circle:nth-child(2) {
animation-delay: 0.2s;
}
.circle:nth-child(3) {
animation-delay: 0.3s;
}
.circle:nth-child(4) {
animation-delay: 0.4s;
}
.circle:nth-child(5) {
animation-delay: 0.5s;
}
.circle:nth-child(6) {
animation-delay: 0.6s;
}
@keyframes pulse {
0% {
opacity: 0;
transform: scale(0);
}
50% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(0);
}
}
</style>
代码解读
这段代码是一个Vue组件的模板部分,用于展示一个带有动画效果和背景模糊的信息卡片。具体解释如下:
- <template> 标签用于定义组件的模板部分。
- <div class="info-card"> 是一个具有 info-card 类名的 div 元素,表示信息卡片的容器。
- <div class="info-title"> 是一个具有 info-title 类名的 div 元素,表示信息卡片的标题。
- <div class="info-value"> 是一个具有 info-value 类名的 div 元素,表示信息卡片的数值。
- <div class="animation-container"> 是一个具有 animation-container 类名的 div 元素,用于容纳动画效果的圆圈。
- <div class="circle"> 是一个具有 circle 类名的 div 元素,表示一个圆圈。
接下来是 <script setup lang="ts"> 标签,用于编写组件的逻辑部分,这里是空的,没有任何代码。
最后是 <style scoped> 标签,用于定义组件的样式。.info-card 表示选择具有 info-card 类名的元素,设置了宽度、高度、背景颜色、背景模糊、边框圆角、阴影和背景图案等样式,并使用了 Flex 布局使内容垂直居中。.info-title 和 .info-value 分别表示选择具有对应类名的元素,设置了字体大小、字体样式、颜色和文字阴影等样式。.animation-container 表示选择具有 animation-container 类名的元素,设置了绝对定位和底部偏移量。.circle 表示选择具有 circle 类名的元素,设置了圆圈的样式,包括宽度、高度、背景颜色、边框圆角、外边距和动画效果。
动画效果使用了 @keyframes 关键字定义了一个名为 pulse 的关键帧动画,通过改变透明度和缩放来实现圆圈的闪烁效果。.circle:nth-child(n) 选择了第 n 个具有 circle 类名的元素,并设置了不同的动画延迟时间,以实现圆圈的依次闪烁效果。
这段代码的作用是创建一个带有动画效果和背景模糊的信息卡片组件,显示一个标题为 "数据总和",数值为 "100" 的信息。信息卡片具有特定的样式,包括背景颜色、背景模糊、边框圆角、阴影和背景图案等。同时,信息卡片底部有一组圆圈,通过动画效果实现闪烁的效果。
需求实战四
样式展示

代码展示
<template>
<div class="home-component">
<ARow style="padding:0 0 30px 0">
<div class="info-card">
<div class="info-title">
数据总和
</div>
<transition name="number-transition">
<div class="info-value" :class="{ init:init,changed: isNumberIncreased, decreased: isNumberDecreased }">
{{ animatedValue }}
</div>
</transition>
<div class="animation-container">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
</ARow>
<ARow>
<ACol span="10">
<div class="button-container">
<a-button class="increase-button" type="primary" @click="addNumber">增加数值</a-button>
</div>
</ACol>
<ACol span="4">
</ACol>
<ACol span="10">
<div class="button-container">
<a-button class="decrease-button" type="primary" @click="minNumber">减少数值</a-button>
</div>
</ACol>
</ARow>
</div>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue';
const value = ref(100);
const isNumberIncreased = ref(false);
const isNumberDecreased = ref(false);
const animatedValue = ref(value.value);
const init=ref(true)
const addNumber = () => {
const startValue = value.value;
const endValue = startValue + 10;
animateNumber(startValue, endValue);
value.value = endValue;
init.value=false;
isNumberDecreased.value = false;
isNumberIncreased.value = true;
};
const minNumber = () => {
const startValue = value.value;
const endValue = startValue - 10;
animateNumber(startValue, endValue);
value.value = endValue;
init.value=false;
isNumberIncreased.value = false;
isNumberDecreased.value = true;
};
const animateNumber = (startValue:any, endValue:any) => {
const duration = 1000; // 动画持续时间,单位为毫秒
const frameRate = 10; // 每秒帧数
const totalFrames = duration / (1000 / frameRate);
const frameIncrement = (endValue - startValue) / totalFrames;
let currentFrame = 0;
const timer = setInterval(() => {
currentFrame++;
animatedValue.value = Math.round(startValue + frameIncrement * currentFrame);
if (currentFrame === totalFrames) {
clearInterval(timer);
}
}, 1000 / frameRate);
};
watch(value, () => {
animatedValue.value = value.value;
});
</script>
<style scoped>
.home-component {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.info-card {
width: 318px;
height: 200px;
background-color: rgba(23, 179, 163, 0.5);
backdrop-filter: blur(10px);
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
background-image: linear-gradient(
45deg,
rgba(255, 255, 255, 0.1) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.1) 50%,
rgba(255, 255, 255, 0.1) 75%,
transparent 75%,
transparent
);
background-size: 20px 20px;
}
.info-title {
font-size: 24px;
font-weight: bold;
color: #ffffff;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.info-value {
font-size: 48px;
font-weight: bold;
color: #ffffff;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.info-value.init {
color: #ffffff;
transform: scale(1.2);
}
.info-value.changed {
color: #13c40d;
transform: scale(1.2);
}
.info-value.decreased {
color: #eb5766;
transform: scale(1.2);
}
.animation-container {
display: flex;
position: absolute;
bottom: 25px;
}
.circle {
width: 10px;
height: 10px;
background-color: #ffd700;
border-radius: 50%;
margin: 0 4px;
transform: scale(0);
animation: pulse 1.5s infinite cubic-bezier(0.215, 0.61, 0.355, 1) alternate;
}
.circle:nth-child(1) {
animation-delay: 0.1s;
}
.circle:nth-child(2) {
animation-delay: 0.2s;
}
.circle:nth-child(3) {
animation-delay: 0.3s;
}
.circle:nth-child(4) {
animation-delay: 0.4s;
}
.circle:nth-child(5) {
animation-delay: 0.5s;
}
.circle:nth-child(6) {
animation-delay: 0.6s;
}
@keyframes pulse {
0% {
opacity: 0;
transform: scale(0);
}
50% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(0);
}
}
.button-container {
display: flex;
justify-content: center;
padding: 30px 0;
animation: bounce 2s infinite;
animation-delay: 1s;
}
.increase-button,
.decrease-button {
font-size: 16px;
font-weight: bold;
text-transform: uppercase;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
border: none;
transform: scale(1.05) rotate(360deg);
transition: transform 1s;
border-radius: 5px;
}
.increase-button {
background-color: #38b2ac;
margin-right: 10px;
}
.decrease-button {
background-color: #eb5766;
margin-left: 10px;
}
.increase-button:hover,
.decrease-button:hover {
transform: scale(1.05);
box-shadow: 0 2px 15px rgba(0, 0, 0, 0.4);
}
</style>
代码解读
这段代码是一个Vue组件的模板部分,用于展示一个带有动画效果和交互功能的信息卡片。具体解释如下:
- <template> 标签用于定义组件的模板部分。
- <div class="home-component"> 是一个具有 home-component 类名的 div 元素,表示整个组件的容器。
- <ARow> 和 <ACol> 是自定义的组件,用于布局。<ARow> 表示一行,<ACol> 表示一列。
- <div class="info-card"> 是一个具有 info-card 类名的 div 元素,表示信息卡片的容器。
- <div class="info-title"> 是一个具有 info-title 类名的 div 元素,表示信息卡片的标题。
- <transition> 标签用于添加过渡效果,name 属性指定过渡效果的名称。
- <div class="info-value"> 是一个具有 info-value 类名的 div 元素,表示信息卡片的数值。使用了动态绑定 :class 来根据条件添加不同的类名,实现数值变化时的样式变化。
- {{ animatedValue }} 是一个插值表达式,用于显示动态绑定的 animatedValue 变量的值。
- <div class="animation-container"> 是一个具有 animation-container 类名的 div 元素,用于容纳动画效果的圆圈。
- <div class="circle"> 是一个具有 circle 类名的 div 元素,表示一个圆圈。
接下来是 <script setup lang="ts"> 标签,用于编写组件的逻辑部分。通过 import 导入了 ref 和 watch 方法,用于创建响应式数据和监听数据变化。定义了一些变量和方法,包括 value、isNumberIncreased、isNumberDecreased、animatedValue、init、addNumber、minNumber 和 animateNumber。addNumber 方法用于增加数值,minNumber 方法用于减少数值,animateNumber 方法用于实现数值变化的动画效果。使用 watch 监听 value 的变化,并更新 animatedValue 的值。
最后是 <style scoped> 标签,用于定义组件的样式。.home-component 表示选择具有 home-component 类名的元素,设置了居中对齐等样式。.info-card 表示选择具有 info-card 类名的元素,设置了宽度、高度、背景颜色、背景模糊、边框圆角、阴影和背景图案等样式。.info-title 和 .info-value 分别表示选择具有对应类名的元素,设置了字体大小、字体样式、颜色和文字阴影等样式。.info-value.init、.info-value.changed 和 .info-value.decreased 分别表示根据条件添加的类名,用于实现数值变化时的样式变化。.animation-container 表示选择具有 animation-container 类名的元素,设置了绝对定位和底部偏移量。.circle 表示选择具有 circle 类名的元素,设置了圆圈的样式,包括宽度、高度、背景颜色、边框圆角、外边距和动画效果。
动画效果使用了 @keyframes 关键字定义了一个名为 pulse 的关键帧动画,通过改变透明度和缩放来实现圆圈的闪烁效果。.circle:nth-child(n) 选择了第 n 个具有 circle 类名的元素,并设置了不同的动画延迟时间,以实现圆圈的依次闪烁效果。
这段代码的作用是创建一个带有动画效果和交互功能的信息卡片组件。信息卡片显示一个标题为 "数据总和",数值初始值为 "100",并根据用户点击增加或减少数值,同时显示数值的变化动画效果。信息卡片具有特定的样式,包括背景颜色、背景模糊、边框圆角、阴影和背景图案等。同时,信息卡片底部有一组圆圈,通过动画效果实现闪烁的效果。
【技术实战】Vue功能样式实战【六】的更多相关文章
- 学习Vue 入门到实战——学习笔记
闲聊: 自从进了现在的公司,小颖就再没怎么接触vue了,最近不太忙,所以想再学习下vue,就看了看vue相关视频,顺便做个笔记嘻嘻. 视频地址:Vue 入门到实战1.Vue 入门到实战2 学习内容: ...
- 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚
新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...
- vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录
一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...
- ThinkPHP5+Apicloud+vue商城APP实战
ThinkPHP5+Apicoud+vue商城APP实战 目录 章节1:项目概述 课时1apicloud平台介绍.04:38 课时2知识体系架构介绍.16:10 章节2:apicloud50分钟快速入 ...
- Vue公司项目实战步骤
一.无权限,无验证的Vue项目 1.打好HTML+CSS+JS基础,及<Vue 2.0 实战> 2.编写用mock设计的案例: 3.将以上案例的后台用C#改写: 二.带安全验证的Vue项目 ...
- vue+vue-router+vuex实战
shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...
- 阿里云云主机swap功能设置实战案例
阿里云云主机swap功能设置实战案例 阿里云提供的云服务器(Elastic Compute Service,简称 ECS),是云主机的一种,当前采用的虚拟化驱动是Xen(这一点可以通过bios ven ...
- Spring Cloud实战之初级入门(六)— 服务网关zuul
目录 1.环境介绍 2.api网关服务 2.1 创建工程 2.3 api网关中使用token机制 2.4 测试 2.5 小结 3.一点点重要的事情 1.环境介绍 好了,不知不觉中我们已经来到了最后一篇 ...
- vue.js2.0实战(1):搭建开发环境及构建项目
Vue.js学习系列: vue.js2.0实战(1):搭建开发环境及构建项目 https://my.oschina.net/brillantzhao/blog/1541638 vue.js2.0实战( ...
- 微信小程序实战 购物车功能
代码地址如下:http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...
随机推荐
- 2020-12-25:MQ中,如何保证消息的顺序性?
福哥答案2020-12-25:[稍微详细的答案:](http://bbs.xiangxueketang.cn/question/875)生产者保证消息入队的顺序.MQ 本身是一种先进先出的数据接口,将 ...
- 2021-01-11:linux中,如何看内存的使用情况呢?
福哥答案2021-01-11: 1.free:查看内存占用情况,会直接返回,常用参数 -M.-G 是以MB或GB为单位返回结果.2.sar:定时检测系统资源占用情况,-r 参数是内存资源,一般用法 s ...
- 2022-03-06:金币路径。 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,……,AN 和一个整数 B。 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+
2022-03-06:金币路径. 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,--,AN 和一个整数 B. 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+ ...
- ET框架6.0分析一、ECS架构
概述 ET框架的ECS架构是从ECS原生设计思想变形而来的(关于ECS架构的分析可以参考跳转链接:<ECS架构分析>),其特点是: Entity:实体可以作为组件挂载到其他实体上,Enti ...
- Django4全栈进阶之路16 项目实战(用户管理):user_list.html用户列表画面设计
首先在template模板文件夹中新建account子文件夹,用于存放用户管理相关模块页面. 下面开始正式的设计: 1.模块代码设计 {% extends 'base.html' %} {% bloc ...
- Pycharm的Available Packages为空问题
问题描述:可用软件包为空,Pycharm的Available Packages为空问题 打开软件包仓库设置画面 新建软件包仓库 输入软件包仓库 完成,可用软件包 Available Packages正 ...
- Solon 用 throw 抛出数据
此文主要是想在观念上有所拓展.在日常的接口开发时,数据的输出可以有两种方式: 返回(常见) 抛出(可以理解为越级的.越类型的返回) 我们经常会看到类似这样的案例.为了同时支持正常的数据和错误状态,选择 ...
- 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》
在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢? 再次回顾考察,看下面的查询子句: Id>1 and Id<10 如上所示,有两个独立的条件分别为Id ...
- Atcoder-AGC033C
看到这道题,是个博弈论,没见过树上的,于是想到在数列里的博弈论,又联想到树的特殊形式----链. 于是我们来讨论一下链的情况(对于没有硬币的点,我们就视为它被删掉了): 讨论链的情况 发现若是选择两端 ...
- RDD练习:词频统计
一.词频统计: 1.读文本文件生成RDD lines lines=sc.textFile("file:///home/hadoop/word.txt") #读取本地文件 lines ...