UniApp 中制作一个横向滚动工具栏

前言

最近在用 UniApp 开发项目时,需要一个横向滑动的工具栏。常见的工具栏一般都是竖着的,但横向滑动的工具栏不仅能展示更多内容,还能让界面看起来更加丰富。不过很多朋友可能会发现,如何让内容“横着”展示又不变形、能流畅滚动、并且能自适应多种屏幕宽度,还是有点麻烦的。

这篇文章我会带大家一步步用 UniApp 实现一个横向滚动的工具栏,并讲解其中的一些关键点。话不多说,咱们直接上代码!

在这里插入图片描述

实现思路

横向工具栏的核心其实不复杂,大致可以分成以下几步:

  1. scroll-view 组件实现横向滚动。
  2. 使用 flex 布局,将每个工具项(如图标和文字)在 tool-item 中垂直排列。
  3. 优化 scroll-viewtool-item 的样式,让它们看起来整齐美观。

主要组件和样式

在 UniApp 中,scroll-view 是一个可以支持滚动的容器。在横向工具栏中,我们设置 scroll-viewscroll-xtrue,这样它就可以左右滑动了。此外,我们还会使用 flex 布局来控制工具栏中的每个图标和文字的排列方式。

页面布局

首先,让我们来写一个基本的页面布局,先不涉及复杂的样式。我们将横向工具栏放在一个 scroll-view 中,每个工具项都放在一个 view 里。这样,可以确保每个工具项是独立的,而且整个工具栏可以横向滚动。

代码实现

1. 初始化项目和页面

首先,创建一个新的 UniApp 项目(可以直接使用 HBuilderX,选择 uni-app 模板)。在项目中创建一个新页面,比如叫 toolbar。然后在页面的 .vue 文件中,编写 HTML 结构。

<template><scroll-view style="flex: 1"><view class="container"><!-- 轮播图部分 --><view> <swiper class="swiper" :indicator-dots="true"><swiper-item class="swiper-item"><image class="swiper-image" :src="swiperImage[0]" mode="aspectFill"></image></swiper-item><swiper-item class="swiper-item"><image class="swiper-image" :src="swiperImage[1]" mode="aspectFill"></image></swiper-item><swiper-item class="swiper-item"><image class="swiper-image" :src="swiperImage[2]" mode="aspectFill"></image></swiper-item></swiper></view><!-- 横向滑动工具栏 --><scroll-view scroll-x="true" class="tool-bar"><view class="tool-item" v-for="(tool, index) in tools" :key="index"><image :src="tool.icon" class="tool-icon"></image><text class="tool-text">{{ tool.name }}</text></view></scroll-view><!-- 工具分类卡片(两列布局) --><view class="card-container"><view class="card" style="background-color: #4fc3f7"><text class="card-title">日常工具\n</text><text class="card-description">聚合一些最热门,最常用的工具</text></view><view class="card" style="background-color: #f48fb1"><text class="card-title">计算工具\n</text><text class="card-description">计算器、温度、压力、单位换算工具…</text></view><view class="card" style="background-color: #f06292"><text class="card-title">查询工具\n</text><text class="card-description">各种文字、专用信息、资源查询…</text></view><view class="card" style="background-color: #4db6ac"><text class="card-title">图片工具\n</text><text class="card-description">图片水印、压缩、取色、壁纸大全…</text></view><view class="card" style="background-color: #81c784"><text class="card-title">文字工具\n</text><text class="card-description">暗语翻译器、特殊文本、编码工具…</text></view><view class="card" style="background-color: #42a5f5"><text class="card-title">开发工具\n</text><text class="card-description">各种代码工具、网页转应用…</text></view><view class="card" style="background-color: #64b5f6"><text class="card-title">提取工具\n</text><text class="card-description">视频提取、图片提取、网页提取…</text></view><view class="card" style="background-color: #26a69a"><text class="card-title">系统工具\n</text><text class="card-description">应用管理、WiFi密码查看、壁纸工具…</text></view></view></view></scroll-view>
</template>

2. 数据初始化

接下来,给页面添加数据属性。这里包括 swiperImage 数组(轮播图图片的路径)和 tools 数组(工具栏的图标和名称)。在 <script> 部分中,我们将这些数据初始化:

<script>
export default {data() {return {swiperImage: ['/static/image/swiper/img1.jpeg','/static/image/swiper/img2.jpeg','/static/image/swiper/img3.jpeg'],tools: [{ name: '工具1', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具2', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具3', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具4', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具5', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具5', icon: '/static/image/swiper/img1.jpeg' },{ name: '工具5', icon: '/static/image/swiper/img1.jpeg' },]}}
}
</script>

3. 样式设置

接下来是样式的编写,这一步会影响整个工具栏的展示效果。我们为工具栏、轮播图和卡片分别设置样式,特别是 scroll-viewtool-item 这些关键元素。

<style>
.container {font-size: 14px;line-height: 24px;background-color: #f5f5f5;padding-bottom: 60px; /* 留出底部导航栏的位置 */
}/* 轮播图样式 */
.swiper {height: 150px;margin-bottom: 20px;border-radius: 10px;overflow: hidden;margin: 0 10px;
}
.swiper-item {height: 150px;width: 100%;background-color: #ff5e62;
}
.swiper-image {width: 100%;
}/* 横向滑动工具栏样式 */
.tool-bar {display: flex;flex-direction: row;padding: 10px;border-radius: 10px;margin: 15px 10px 0px 10px;background-color: #ffffff;overflow-x: auto; /* 允许水平滚动 */white-space: nowrap;width: 100%;
}
.tool-item {width: 80px;margin-right: 10px;text-align: center;display: flex;flex-direction: column; /* 垂直排列图标和文字 */align-items: center;
}
.tool-icon {width: 50px;height: 50px;border-radius: 10px;margin-bottom: 5px;
}
.tool-text {font-size: 12px;color: #333;
}
</style>
  1. tool-bar 是整个工具栏的容器,我们设置了 flex-directionrow,表示工具项在水平排列。
  2. tool-item 中,我们设置了 flex-directioncolumn,让图标和文字垂直排列。
  3. scroll-view 本身设置了 overflow-x: auto,使其可以横向滚动。

4. 工具栏的细节优化

现在我们已经有了一个基本的横向工具栏,但为了让它更具吸引力,我们可以进行一些样式优化,使其更美观,并且适配更多的场景。接下来会从样式细节、布局调整和一些动态效果出发,进一步美化这个工具栏。

4.1 增加圆角、阴影和过渡效果

圆角、阴影和过渡效果可以让工具栏看起来更加立体,给用户更好的视觉体验。我们可以在 .tool-item.tool-icon 上增加这些效果。

.tool-bar {display: flex;flex-direction: row;padding: 10px;border-radius: 10px;margin: 15px 10px 0px 10px;background-color: #ffffff;overflow-x: auto;white-space: nowrap;width: 100%;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* 添加阴影 */
}.tool-item {width: 80px;margin-right: 10px;text-align: center;display: flex;flex-direction: column;align-items: center;border-radius: 8px; /* 圆角 */transition: transform 0.2s ease; /* 添加过渡效果 */
}.tool-item:hover {transform: scale(1.1); /* 鼠标悬浮放大效果 */
}.tool-icon {width: 50px;height: 50px;border-radius: 50%; /* 图标改为圆形 */margin-bottom: 5px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* 图标阴影 */
}
4.2 动态效果

这里我们给 .tool-item 添加了 :hover 样式,在鼠标悬浮时稍微放大图标,形成一种“弹出”的效果。同时,tool-icon 的阴影让图标看起来不再是“贴”在页面上的,而是有了一些立体感。

4.3 文本颜色和字体

为了让工具栏的文字更具可读性,可以使用更亮眼的颜色和稍大的字体。也可以给文字加上一点渐变效果。

.tool-text {font-size: 14px;color: #333;font-weight: bold; /* 加粗字体 */background: linear-gradient(90deg, #ff7e5f, #feb47b); /* 渐变颜色 */-webkit-background-clip: text;color: transparent;
}

5. 响应式布局的实现

在开发移动应用时,响应式设计尤为重要,尤其是在横向滚动工具栏这种组件上。我们希望无论屏幕尺寸如何变化,工具栏的内容都能自适应调整,不会出现溢出或内容过小的问题。

5.1 使用 vwvh 单位

vw(视口宽度)和 vh(视口高度)是 CSS 中非常实用的单位,可以使组件根据屏幕尺寸自动缩放。我们可以用 vw 来控制工具栏宽度,使其适应不同屏幕。

.tool-item {width: 20vw; /* 每个工具项的宽度占屏幕宽度的20% */max-width: 100px; /* 最大宽度设置 */
}

这种设置让每个工具项的宽度根据屏幕的宽度动态调整,但不超过 100px,这样就能适配各种设备。

5.2 媒体查询

如果想让工具栏在不同屏幕尺寸下的显示效果更加精细,可以使用 CSS 的媒体查询功能,在不同的屏幕宽度下调整工具栏的布局。

@media screen and (max-width: 600px) {.tool-item {width: 30vw; /* 在小屏幕上,每个工具项占30%屏幕宽度 */}
}@media screen and (min-width: 600px) {.tool-item {width: 15vw; /* 在大屏幕上,每个工具项占15%屏幕宽度 */}
}

通过这种方式,我们可以确保在屏幕较小的手机上,工具项不会因为太小而难以阅读;在屏幕较大的设备上,工具栏也不会显得拥挤。


6. 交互功能的实现

光有好看的外观还不够,我们可以为工具栏添加一些交互功能,使用户体验更好。例如,当用户点击某个工具项时,可以触发相应的页面跳转或显示详细信息。

6.1 点击事件

在 UniApp 中,可以直接为工具项绑定点击事件。在模板中的 <view> 标签上使用 @click 事件,并在 methods 中定义点击处理逻辑。

<view class="tool-item" v-for="(tool, index) in tools" :key="index" @click="handleToolClick(tool)"><image :src="tool.icon" class="tool-icon"></image><text class="tool-text">{{ tool.name }}</text>
</view>
methods: {handleToolClick(tool) {// 根据工具名称执行相应的操作,可以跳转到不同页面或展示内容uni.showToast({title: `点击了${tool.name}`,icon: 'none'});}
}

这样,用户点击某个工具项时,会显示提示信息。当然,你也可以根据需求进行页面跳转或执行其他操作,比如跳转到工具的详情页面:

uni.navigateTo({url: `/pages/${tool.pageName}/${tool.pageName}`
});
6.2 让工具栏记住滚动位置

如果希望工具栏在页面切换后能记住用户滚动的位置,可以利用 scroll-left 属性记录和恢复滚动位置。

<scroll-view scroll-x="true" class="tool-bar" :scroll-left="scrollLeft"><!-- 工具项 -->
</scroll-view>
data() {return {scrollLeft: 0, // 滚动位置};
},
methods: {// 页面离开时记录滚动位置saveScrollPosition(event) {this.scrollLeft = event.detail.scrollLeft;}
}

7. 优化性能

在移动端,性能优化是一个大话题,特别是在像工具栏这种涉及滚动和图片渲染的地方。以下是一些常见的优化措施:

7.1 图片懒加载

如果工具栏里有很多图片,可以启用懒加载,减少初始加载时间。UniApp 提供了 lazy-load 属性,可以在 <image> 标签中设置。

<image :src="tool.icon" class="tool-icon" lazy-load="true"></image>

这样,只有当图片即将出现在视口中时才会加载,避免一次性加载所有图片,节省资源。

7.2 减少渲染次数

对于动态数据的渲染,可以在页面初次加载时将数据保存到本地存储中,避免每次打开页面都重新获取数据。例如,如果工具栏内容来自接口,可以将结果缓存起来:

methods: {async fetchTools() {const cachedTools = uni.getStorageSync('tools');if (cachedTools) {this.tools = cachedTools;} else {const res = await uni.request({ url: 'API_URL' });this.tools = res.data;uni.setStorageSync('tools', this.tools);}}
}

8. 最终效果展示与总结

经过上述步骤,我们的 UniApp 横向工具栏已经实现得差不多了。这个工具栏具有以下特点:

  1. 支持横向滚动,使用 scroll-view 实现。
  2. 使用 flex 布局,将图标和文字垂直排列,并添加了悬浮效果。
  3. 自适应布局,确保在各种屏幕尺寸上都能良好展示。
  4. 点击事件处理,可以轻松跳转或展示信息。
  5. 性能优化,通过图片懒加载和本地缓存提高了加载速度。

在这里插入图片描述


总结

本文介绍了如何在 UniApp 中制作一个横向滚动工具栏,从基础实现到样式优化,再到响应式设计和交互添加,最后进行了性能优化。希望这篇文章能帮助大家更好地理解和掌握 UniApp 中横向工具栏的实现方法,并能在自己的项目中自由运用。

通过这种方式实现的工具栏不仅美观,还具有实用性,可以轻松满足大多数项目需求。祝大家在开发 UniApp 的旅程中一帆风顺!

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

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

相关文章

java nio 原理 非阻塞IO Netty

一、为什么必须去了解NIO 首先你需要之后Netty的主要实现手段就是Nio,很多人一直学不明白Netty&#xff0c;根本原因是 除了日常开发中很难能够实践&#xff0c;很大一部分原因是不熟悉NIO&#xff0c;事实上真正熟悉了NIO和它背后的原理之后&#xff0c;去查看Netty的源码就有…

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…

el-select 添加icon

Element-ui-plus 新版本&#xff1a;Select 选择器 | Element Plus 要实现如上的效果 &#xff0c;要用到具名插槽 prefix&#xff0c;看代码&#xff1a; <template><el-dialog ref"dialogRef" v-model"dialogVisible" :title"title"…

【Linux】Ubuntu Linux 系统 ——PHP开发环境

ℹ️大家好&#xff0c;我是练小杰&#xff0c;元宵节到了&#xff0c;在此祝大家元宵节快乐&#x1f606; 新的一年里&#xff0c;愿你步步高升&#xff0c;事事如意&#xff0c;心想事成&#xff01;! 本文是关于Linux 操作系统中部署PHP开发环境这部分基础内容&#xff0c;后…

非谓语动词三驾马车

文章目录 1. 不定式基本结构不定式的由来1.不受主语的人称和数的限制2.没有限定时态3.可以在句子中充当不同的成分 常见句子成分1. 作主语2. 作表语3. 作宾语4. 作定语5. 作状语 不定式 vs 动名词 2. 动名词动名词做成分作主语作主语补语作定语作宾语介词宾语 3. 分词(现在、过…

【Apache Paimon】-- 16 -- 利用 paimon-flink-action 同步 kafka 数据到 hive paimon 表中

目录 引言CDC 技术概述 2.1 什么是 CDC2.2 CDC 的应用场景Kafka 作为 CDC 数据源的原理与优势 3.1 Kafka 的基本架构3.2 Kafka 在 CDC 中的角色

利用Python pandas 数据清洗详细教程

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装 Pandas 二、使用步骤1.读取数据2.处理缺失值3. 处理重复值4. 处理异常值5. 数据类型转换6. 处理不一致的数据 前言 pandas 是 Python 数据处理与分析的得力工具&#xff0c;功能强大&#xff0c;是数据…

qt的QMainWindow保存窗口和恢复窗口状态

保存窗口状态 QSettings settings("MyCompany", "MyApp"); // 指定存储的应用信息 settings.setValue("mainWindowState", saveState());saveState() 返回一个 QByteArray&#xff0c;包含 所有停靠窗口和工具栏的状态。QSettings 用于存储数据…

haproxy实现MySQL服务器负载均衡

1.环境准备 准备好下面四台台服务器&#xff1a; 主机名IP角色open-Euler1192.168.121.150mysql-server1openEuler-2192.168.121.151mysql-server2openEuler-3192.168.121.152clientRocky8-1192.168.121.160haproxy 2.mysql服务器配置 1.下载mariadb #下载mariadb [rootop…

Uniapp 原生组件层级过高问题及解决方案

文章目录 一、引言&#x1f3c5;二、问题描述&#x1f4cc;三、问题原因❓四、解决方案&#x1f4af;4.1 使用 cover-view 和 cover-image4.2 使用 subNVue 子窗体4.3 动态隐藏原生组件4.4 使用 v-if 或 v-show 控制组件显示4.5 使用 position: fixed 布局 五、总结&#x1f38…

Neo4j集群学习

文章目录 官方指导文档Neo4j因果集群核心服务器只读副本因果一致性 Neo4j集群搭建Neo4j企业版下载集群简介虚拟机准备jdk安装实施搭建访问neo4j Web服务 集群添加Core节点 官方指导文档 Neo4j 5 ClusterNeo4j 5 Basic Cluster Neo4j因果集群 集群是Neo4企业版中所提供的功能…

Ant-Design-Vue:Button按钮SVG图标垂直未居中问题

问题描述 如下图所示&#xff0c;在使用Ant-Design-Vue UI组件库提供的Button按钮Icon组件开发页面时&#xff0c;发现icon图标并没有垂直居中。 icon插槽-图标垂直不居中 再看一个官网的例子&#xff0c; 官网老子 问题排查 首先&#xff0c;考虑是否由于当前的页面布局&#…

OpenMetadata MySQL 数据库使用率提取管道实现解析

目录 架构概述核心组件源码分析使用率指标定义数据提取流程图源码类图配置与扩展指南架构概述 OpenMetadata 通过可插拔的元数据摄取框架实现对 MySQL 使用率数据的采集,核心流程包含三个阶段: 数据采集层:从 MySQL performance_schema 和 sys schema 获取原始指标指标处理…

慧星云+Chatbox :云上部署DeepSeek告别使用卡顿

DeepSeek 官网卡顿 DeepSeek 系列模型的现象级爆火&#xff0c;引发国内外广泛关注与讨论热潮&#xff0c;然而充满热情的使用者也让 DeepSeek 官网崩溃导致无法正常使用。 为了解决用户使用痛点&#xff0c;慧星云推出了云端蒸馏与满血版的 DeepSeek&#xff0c;搭配 Chatbox …

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…

LeetCode1706

LeetCode1706 目录 LeetCode1706题目描述示例题目理解问题描述 示例分析思路分析问题核心 代码段代码逐行讲解1. 获取网格的列数2. 初始化结果数组3. 遍历每个球4. 逐行模拟下落过程5. 检查是否卡住6. 记录结果7. 返回结果数组 复杂度分析时间复杂度空间复杂度 总结的知识点1. …

前后端的身份认证

现代Web应用程序中&#xff0c;身份认证是确保用户数据安全的关键环节。无论你是开发一个简单的博客系统还是复杂的企业级应用&#xff0c;正确实现身份验证机制都是至关重要的。本文将探讨如何在前后端分离的架构下&#xff0c;使用Node.js作为后端来实现安全有效的身份认证。…

如何调整 Nginx工作进程数以提升性能

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年2月15日14点20分 Nginx 的工作进程数&#xff0…

学习web数据埋点

什么是埋点&#xff0c;以及为什么需要埋点 通过代码主动收集用户行为数据&#xff08;如点击、浏览、停留时长等&#xff09;&#xff0c;用于数据分析驱动产品优化。 一、前端埋点 在客户端&#xff08;浏览器、移动端应用&#xff09;直接采集用户行为数据&#xff0c;通…

VMware Workstation Pro 下载(无需注册账号)

VMware Workstation Pro 目前对个人用户完全免费。有两种下载方式&#xff0c;分别为 1、Broadcom 官网下载 需要注册账号&#xff0c;我懒得注册 2、VMware 更新服务器下载 如果不想注册账号&#xff0c;可以通过 VMware 更新服务器直接下载。访问以下链接&#xff1a; ht…