打造一个有点好看的 uniapp 网络测速软件

大家好,我是一名前端小白。今天想和分享一个有点好看的网络测速 uniapp 组件的实现过程。这个组件不仅外观精美,而且具有完整的功能性,是一个非常适合学习和实践的案例。

设计理念

在开始coding之前,先聊聊设计理念。一个好的测速工具应该具备以下特点:

  1. 直观的速度显示
  2. 清晰的测试过程
  3. 完整的设备信息
  4. 优雅的交互体验

基于这些考虑,将整个界面分为四个主要部分。下面让一步步实现这个组件。

1. 速度显示面板 - 视觉核心

速度显示面板是整个组件最吸引眼球的部分。我选择了圆形设计,因为圆形给人一种仪表盘的感觉,非常符合测速工具的定位。

<template><view class="speed-panel"><view class="speed-circle" :class="{ 'testing': isTesting }"><view class="speed-content"><text class="speed-value">{{ isFirst ? "点击开始" : (downloadSpeed ? (downloadSpeed * 1024).toFixed(0) : '...') }}</text><text class="speed-unit">{{ isFirst ? "" : "kb/s" }}</text></view><view class="speed-wave"></view></view></view>
</template>

在样式设计上,使用了现在非常流行的新拟态(Neumorphism)设计风格:

.speed-circle {width: 200px;height: 200px;border-radius: 50%;background: linear-gradient(145deg, #ffffff, #f0f0f0);box-shadow: 20px 20px 60px #d1d9e6, -20px -20px 60px #ffffff;position: relative;overflow: hidden;
}

这里有个小技巧:通过设置两个方向的阴影,一个深色一个浅色,创造出了非常漂亮的立体效果。而当测速开始时,会显示一个波浪动画,这给用户一种动态的反馈:

@keyframes wave {0% { transform: translateY(100%); }100% { transform: translateY(-100%); }
}.speed-wave {position: absolute;bottom: 0;width: 100%;height: 100%;background: linear-gradient(0deg, rgba(66, 153, 225, 0.1) 0%, rgba(66, 153, 225, 0) 50%);animation: wave 2s infinite linear;
}

2. 信息卡片 - 设备信息一目了然

信息卡片区域采用了现代化的卡片设计。使用Flex布局来实现响应式的排列,这样在不同尺寸的屏幕上都能很好地展示:

<template><view class="info-cards"><view class="info-card"><view class="card-icon">📱</view><view class="card-content"><text class="card-title">设备信息</text><text class="card-detail">{{ phoneBrand }} {{ phoneModel }}</text></view></view></view>
</template>

样式上追求简洁但不失细节:

.info-cards {display: flex;flex-wrap: wrap;gap: 15px;margin: 20px 0;
}.info-card {flex: 1;min-width: 150px;background: white;padding: 15px;border-radius: 16px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}

在这里插入图片描述

这里的flex-wrap: wrap属性确保了在窄屏设备上卡片会自动换行,gap属性则提供了卡片之间优雅的间距。

3. 测速核心逻辑 - 性能与准确性的平衡

测速的核心是通过计算下载固定大小文件所需的时间来得出网速。这里选择了Cloudflare的测速API,它可以提供稳定的测试环境:

Cloudflare 测速 API 的基本格式如下:

https://speed.cloudflare.com/__down?bytes={size}

其中:

  • speed.cloudflare.com 是 Cloudflare 的测速服务器
  • __down 表示下载测试
  • bytes 参数指定要下载的文件大小(以字节为单位)
  1. bytes(必需)

    • 类型:整数
    • 范围:1 到 1073741824(1GB)
    • 示例:bytes=10485760(10MB)
  2. 其他可选参数

    https://speed.cloudflare.com/__down?bytes=10485760&duration=10
    
    • duration:测试持续时间(秒)
    • throughput:限制下载速度(字节/秒)

搞一个 10 M 的文件大小,并使用 uni.downloadFile 下载该文件

methods: {testDownloadSpeed() {const fileSize = 10 * 1024 * 1024; // 选择10MB作为测试文件大小const url = `https://speed.cloudflare.com/__down?bytes=${fileSize}`;const startTime = Date.now();// 开始下载测试uni.downloadFile({url,success: () => {const duration = (Date.now() - startTime) / 1000;const speedMB = (fileSize / (1024 * 1024)) / duration;this.downloadSpeed = speedMB.toFixed(2);// 转换为Mbps以计算带宽等级this.bandwidth = (speedMB * 8).toFixed(2);}});}
}

为了提供更好的用户体验,在测试过程中添加了进度提示:

// 模拟进度更新
const progressInterval = setInterval(() => {if (this.progress < 90) {this.progress += 5;} else {clearInterval(progressInterval);}
}, 200);

4. 进度条设计 - 动态反馈的艺术

进度条的设计看似简单,但要做好也需要注意很多细节:

<template><view class="progress-wrapper" v-if="isTesting"><view class="progress-bar"><view class="progress-fill" :style="{ width: progress + '%' }"></view></view><text class="progress-text">{{ progress }}%</text></view>
</template>

样式上使用渐变色来增加视觉效果:

.progress-bar {width: 100%;height: 8px;background: #e2e8f0;border-radius: 4px;overflow: hidden;
}.progress-fill {height: 100%;background: linear-gradient(90deg, #4299e1, #3182ce);transition: width 0.3s ease;
}

在这里插入图片描述

transition属性确保了进度条的平滑动画效果,给用户更好的视觉体验。

5. 带宽等级计算 - 数据的智能解读

为了让测试结果更有意义,简单添加了带宽等级的计算功能:

computed: {getBandwidthCategory() {if (this.downloadSpeed) {const speedMbps = this.downloadSpeed * 8;// 根据实际速度返回对应的带宽等级if (speedMbps <= 10) return "10M宽带";else if (speedMbps <= 20) return "20M宽带";else if (speedMbps <= 50) return "50M宽带";else if (speedMbps <= 100) return "100M宽带";else if (speedMbps <= 200) return "200M宽带";else if (speedMbps <= 500) return "500M宽带";else return "1000M宽带以上";}return '正在测试...';}
}

实现要点与技术总结

  1. UI设计

    • 采用新拟态设计风格
    • 使用CSS渐变和阴影创造立体感
    • 响应式布局适配各种屏幕
  2. 动画效果

    • 波浪动画提供视觉反馈
    • 进度条平滑过渡
    • 状态切换动画
  3. 性能优化

    • 使用computed属性处理复杂计算
    • 合理的防抖处理
    • 优化重绘性能
  4. 用户体验

    • 清晰的测试状态提示
    • 直观的数据展示
    • 平滑的动画过渡

结语

感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示

ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示 &#x1f33f;驱动参考来源&#xff1a;https://blog.csdn.net/weixin_59250390/article/details/142691848&#x1f4cd;个人相关驱动内容文章&#xff1a;《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使…

Redis的简单使用

1.Redis的安装Ubuntu安装Redis-CSDN博客 2.Redis在Spring Boot 3 下的使用 2.1 pom.xml <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac…

elabradio入门第四讲——位同步(符号同步)

位同步是数字通信系统中特有的一种同步技术&#xff0c;又称为码元同步。在数字通信系统中&#xff0c;任何消息都是一串信号码元序列&#xff0c;接收端为了恢复码元序列&#xff0c;则需要知道每个码元的起止时刻&#xff0c;以便对于解调后的信号进行抽样判决&#xff0c;这…

网络安全推荐的视频教程 网络安全系列

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 1.2.3 网络安全的种类P5 &#xff08;1…

工控网络安全介绍 工控网络安全知识题目

31.PDR模型与访问控制的主要区别(A) A、PDR把对象看作一个整体 B、PDR作为系统保护的第一道防线 C、PDR采用定性评估与定量评估相结合 D、PDR的关键因素是人 32.信息安全中PDR模型的关键因素是(A) A、人 B、技术 C、模型 D、客体 33.计算机网络最早出现在哪个年代(B) A、20世…

Golang学习笔记_33——桥接模式

Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 文章目录 桥接模式详解一、桥接模式核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、桥接模式的特点三、适用场景1. 多维度变化2. 跨平台开发3. 动态切换实现 四、与其他…

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…

AI性能极致体验:通过阿里云平台高效调用满血版DeepSeek-R1模型

前言 解决方案链接&#xff1a; https://www.aliyun.com/solution/tech-solution/deepseek-r1-for-platforms?utm_contentg_1000401616 DeepSeek是近期爆火的开源大语言模型&#xff08;LLM&#xff09;&#xff0c;凭借其强大的模型训练和推理能力&#xff0c;受到越来越多…

基于暗通道先验的图像去雾算法解析与实现

一、算法背景 何凯明团队于2009年提出的暗通道先验去雾算法《single image haze removal using dark channel prior》&#xff0c;通过统计发现&#xff1a;在无雾图像的局部区域中&#xff0c;至少存在一个颜色通道的像素值趋近于零。这一发现为图像去雾提供了重要的理论依据…

Visual Studio Code的下载安装与汉化

1.下载安装 Visual Studio Code的下载安装十分简单&#xff0c;在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了

遵循规则:利用大语言模型进行视频异常检测的推理

文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly &#xff08;正常与异常&#xff09;Abstract and Concrete &#xff08;抽象与具体&#xff09;Human and Environment &#xff08;人类与环境&#xff09; 3…

情书网源码 情书大全帝国cms7.5模板

源码介绍 帝国cms7.5仿《情书网》模板源码&#xff0c;同步生成带手机站带采集。适合改改做文学类的网站。 效果预览 源码获取 情书网源码 情书大全帝国cms7.5模板

【YOLOv8】

文章目录 1、yolov8 介绍2、创新点3、模型结构设计3.1、backbone3.2、head 4、正负样本匹配策略5、Loss6、Data Augmentation7、训练、推理8、分割 Demo附录——V1~V8附录——相关应用参考 1、yolov8 介绍 YOLOv8 是 ultralytics 公司在 2023 年 1 月 10 号开源的 YOLOv5 的下…

Softing线上研讨会 | 自研还是购买——用于自动化产品的工业以太网

| 线上研讨会时间&#xff1a;2025年1月27日 16:00~16:30 / 23:00~23:30 基于以太网的通信在工业自动化网络中的重要性日益增加。设备制造商正面临着一大挑战——如何快速、有效且经济地将工业以太网协议集成到其产品中。其中的关键问题包括&#xff1a;是否只需集成单一的工…

人工智能基础之数学基础:01高等数学基础

函数 极限 按照一定次数排列的一列数:“&#xff0c;“,…,"…&#xff0c;其中u 叫做通项。 对于数列{Un}如果当n无限增大时&#xff0c;其通项无限接近于一个常数A&#xff0c;则称该数列以A为极限或称数列收敛于A&#xff0c;否则称数列为发散&#xff0c; 极限值 左…

QT数据库(三):QSqlQuery使用

QSqlQuery 简介 QSqlQuery 是能运行任何 SQL 语句的类&#xff0c;如 SELECT、INSERT、UPDATE、DELETE 等 SQL 语句。所以使用 QSqlQuery 几乎能进行任何操作&#xff0c;例如创建数据表、修改数据表的字段定义、进行数据统计等。如果运行的是 SELECT 语句&#xff0c;它查询…

数据结构(考研)

线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…

Unity DeepSeek API 聊天接入教程(0基础教学)

Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日&#xff0c;DeepSeek-R1正式上线&#xff0c;和当前市面上的主流AI相比&#xff0c;它在仅有极少标注数据的情况下&am…

PAT乙级真题 — 1090 危险品装箱(java)

集装箱运输货物时&#xff0c;我们必须特别小心&#xff0c;不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱&#xff0c;否则很容易造成爆炸。 本题给定一张不相容物品的清单&#xff0c;需要你检查每一张集装箱货品清单&#xff0c;判断它们是否能装在…

Navicat16安装教程(附安装包)2025最新版详细图文安装教程

文章目录 前言一、Navicat16安装包下载&#xff1f;二、安装步骤1.运行安装程序2.安装程序3.阅读许可协议4.选择安装位置5.选择附加任务6.准备安装7.完成安装8.使用设置 前言 Navicat 16 是一款好用的数据库管理软件&#xff0c;能让你轻松操作各类数据库。本教程会一步一步教…