uniapp 系统学习,从入门到实战(六)—— 样式与布局
全篇大概 4700 字(含代码),建议阅读时间 30min
📚 目录
- Flex 布局在 UniApp 中的应用
- 响应式设计与适配多端
- 使用 SCSS 提升样式开发效率
- 实战案例演示
- 总结
1. Flex 布局在 UniApp 中的应用
1.1 基础布局实现
通过 display: flex
快速构建弹性容器,支持横向/纵向排列和灵活对齐:
<template><view class="flex-container"><view class="item">商品图片</view><view class="item">价格信息</view><view class="item">操作按钮</view></view>
</template><style lang="scss">
.flex-container {display: flex;justify-content: space-between; /* 主轴两端对齐 */align-items: center; /* 交叉轴居中对齐 */padding: 20rpx;background: #f8f8f8;.item {flex: 1 0 200rpx; /* 最小宽度200rpx,自动扩展 */margin: 0 10rpx;background: #fff;border-radius: 10rpx;padding: 20rpx;box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1);&:first-child { background: #4CAF50; color: white; }&:last-child { background: #FF5722; color: white; }}
}
</style>
效果预览
2. 响应式设计与适配多端
2.1 全局适配方案
使用 rpx
单位和媒体查询构建跨平台界面:
<template><view class="responsive-layout"><view class="header">导航栏</view><view class="content"><view class="grid-item" v-for="i in 12" :key="i">内容{{i}}</view></view><view class="footer">底部信息</view></view>
</template><style lang="scss">
.responsive-layout {min-height: 100vh;display: flex;flex-direction: column;.header, .footer {height: 100rpx;background: #333;color: white;text-align: center;}.content {flex: 1;display: flex;flex-wrap: wrap;gap: 20rpx;.grid-item {flex: 1 1 200rpx;min-height: 200rpx;background: #f0f0f0;border-radius: 10rpx;@media (max-width: 768px) {flex: 1 1 100%;}}}
}
</style>
适配效果对比
设备类型 | 布局模式 | 列数 | 交互说明 |
---|---|---|---|
手机竖屏 | 单列布局 | 1列 | 下拉刷新内容 |
手机横屏 | 双列布局 | 2列 | 左右滑动切换 |
平板 | 三列布局 | 3列 | 滑动浏览 |
PC浏览器 | 四列布局 | 4列 | 键盘快捷操作 |
3. 使用 SCSS 提升样式开发效率
3.1 企业级样式管理
通过 SCSS
变量和混合宏构建可维护的样式系统:
// 全局变量定义(variables.scss)
$primary-color: #2b9939;
$font-family: '微软雅黑', sans-serif;
$breakpoints: ('mobile': 768px,'tablet': 1024px,'desktop': 1280px
);
// 混合宏定义(mixins.scss)
@mixin flex-center($direction: row) {display: flex;flex-direction: $direction;justify-content: center;align-items: center;
}@mixin responsive-grid($columns: 4) {display: flex;flex-wrap: wrap;gap: 20rpx;@each $bp, $val in $breakpoints {@media (min-width: $val) {.grid-item {flex: 1 1 calc(100% / $columns - 20rpx / $columns);}}}
}
3.2 组件样式复用
在 Vue 组件中使用 SCSS 实现模块化开发:
<template><view class="card"><image class="card-image" src="static/phone.jpg" mode="aspectFill"></image><view class="card-content"><text class="card-title">手机</text><text class="card-price">¥100.00</text></view></view>
</template><style lang="scss">
@import "@/scss/variables.scss";
@import "@/scss/mixins.scss";.card {@include flex-center(row);background: white;border-radius: 16rpx;box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1);overflow: hidden;.card-image {width: 30%;height: 200rpx;object-fit: cover;}.card-content {width: 70%;padding-left: 20rpx;.card-title {font-size: $font-family-bold;color: $primary-color;}.card-price {font-size: 24rpx;color: #ff9f00;}}
}
</style>
4. 实战案例演示
4.1 电商商品列表页
- 在根目录下创建
variables.scss
文件
// src/scss/variables.scss
$primary-color: #2b9939; // 主色调(绿色)
$secondary-color: #333; // 辅助色(深灰色)
$font-size-base: 28rpx; // 基础字体大小
$border-radius-base: 10rpx; // 基础圆角
-
在static文件夹中存放三张图片用于展示使用
-
创建
product-list.vue
文件
<template><view class="product-list"><scroll-view scroll-y style="height: 100vh;"><view v-for="product in products" :key="product.id"class="product-card"@click="handleCardClick(product)"><image class="product-image" :src="'/static/' + product.image"></image><view class="product-info"><text class="product-name">{{ product.name }}</text><text class="product-price">¥{{ product.price }}</text><button class="add-to-cart" @click="addToCart(product)"></button></view></view></scroll-view></view>
</template><script>
import { primaryColor } from '@/variables.scss';export default {name: 'ProductList',data() {return {// 模拟商品数据products: [{id: 1,image: 'phone.jpg',name: '智能手机 Pro Max',price: 4999},{id: 2,image: 'earphone.jpeg',name: '无线耳机 AirPods',price: 1299},{id: 3,image: 'computer.jpg',name: '笔记本电脑 MacBook Pro',price: 12999},]};},methods: {handleCardClick(product) {console.log('查看商品详情', product);// 可在此处跳转详情页this.$router.push({name: 'ProductDetail',params: { productId: product.id }});},// 加入购物车功能addToCart(product) {console.log('加入购物车', product);// 1. 本地存储方案(简单示例)uni.setStorageSync('cart', [...this.$store.state.cart, product]);// 2. Vuex 方案(推荐生产环境使用)this.$store.dispatch('cart/addProduct', product);// 显示提示uni.showToast({title: '已加入购物车',icon: 'success',duration: 2000});}},onLoad() {// 模拟数据加载console.log('页面加载完成');},fetchProducts() {}
};
</script><style lang="scss">
// 引入全局变量
@import "@/variables.scss";.product-list {.product-card {display: flex;flex-direction: column;background: white;border-radius: 10rpx;padding: 20rpx;margin-bottom: 20rpx;box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1);.product-image {width: 100%;height: 300rpx;object-fit: cover;}.product-info {margin-top: 20rpx;.product-name {font-size: 32rpx;color: #333;}.product-price {font-size: 28rpx;color: $primary-color; // 使用全局主题色margin-top: 10rpx;}.add-to-cart {background: $primary-color; // 主题色按钮color: white;padding: 10rpx 20rpx;border-radius: 5rpx;margin-top: 20rpx;// 按钮悬停效果&:hover {opacity: 0.9;}}}}
}
</style>
5. 总结
通过合理运用 Flex
布局 实现灵活界面设计,结合 rpx 单位
+ 媒体查询
完成跨端适配,再借助 SCSS 变量+混合宏 提升样式复用率,开发者可以显著提升 UniApp
项目的开发效率和代码质量。
建议在实际项目中:
- 建立统一的
SCSS
变量库 - 制作
响应式
断点配置表 - 开发 可复用的
Flex
布局组件 - 定期进行
样式性能检测
相关文章:

uniapp 系统学习,从入门到实战(六)—— 样式与布局
全篇大概 4700 字(含代码),建议阅读时间 30min 📚 目录 Flex 布局在 UniApp 中的应用响应式设计与适配多端使用 SCSS 提升样式开发效率实战案例演示总结 1. Flex 布局在 UniApp 中的应用 1.1 基础布局实现 通过 display: flex 快速构建弹性容器&#…...

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序
新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install...

mysql 全方位安装教程
下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包,小的安装包是一个安装器。 我们不用登录,直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…...
22-接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 方法一:双指针法 思路 使用两个指针 left 和 right 分别指向数组的两端,同时记录左边的最大高度 leftMax 和右边的最大高度 rig…...
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成 在现代企业级应用开发中,处理多个数据源是一个常见的需求。本文将详细介绍如何使用Spring Boot结合达梦数据库(DM),并通过MyBatis Plus来简化数据库操作&…...

leetcode28 找出字符串第一个匹配值的下标 KMP算法
KMP 算法——快速的从主串中找到模式串 当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。 KMP 算法 比较指针不回溯,仅仅是后移模式串。 每次不匹配的时候,找之前已匹配部分…...

【Bug】natten:安装报错(临近注意力机制的高效cuda内核实现)
正常安装natten报错 pip install natten 报错 可以尝试使用以下网站进行安装 https://shi-labs.com/natten/ 可以根据自己的cuda与pytorch版本进行安装 之间复制命令即可,不需要进行任何修改...
AI 实战2 - face -detect
人脸检测 环境安装源设置conda 环境安装依赖库 概述数据集wider_face转yolo环境依赖标注信息格式转换图片处理生成 train.txt 文件 数据集展示数据集加载和处理 参考文章 环境 安装源设置 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/f…...

Spring Boot 项目开发流程全解析
目录 引言 一、开发环境准备 二、创建项目 三、项目结构 四、开发业务逻辑 1.创建实体类: 2.创建数据访问层(DAO): 3.创建服务层(Service): 4.创建控制器层(Controller&…...

从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制
引言 在数据库开发中,PreparedStatement(预处理语句)是防止SQL注入、提升性能的重要工具。它通过分离SQL结构与参数值,不仅增强了安全性,还能利用预编译优化执行效率。本文将从Java JDBC驱动和MySQL 8源码的双重视角&…...

mysql的主从同步
1、异步复制:这是MySQL默认的复制模式。在这种模式下,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。这种模式的优点是实现简单,但缺点是如果主库崩溃,已经提交的事务可能…...
工程化与框架系列(10)--微前端架构
微前端架构 🏗️ 微前端是一种将前端应用分解成更小、更易管理的独立部分的架构模式。本文将详细介绍微前端的核心概念、实现方案和最佳实践。 微前端概述 🌟 💡 小知识:微前端的核心理念是将前端应用分解成一系列独立部署、松耦…...
【3天快速入门WPF】11-附加属性
目录 1. 步骤1:定义附加属性2. 示例代码3. 步骤2:在XAML中使用附加属性3.1. 示例代码4. 步骤3:扩展使用场景4.1. 示例代码5. 总结上一篇讲到了依赖属性,本篇主要想说一下附加属性。 在WPF中,附加属性(Attached Property)是一种特殊的依赖属性,允许你在不属于某个类的控…...
MySQL并发知识(面试高频)
mysql并发事务解决 不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。 1. mysql中的锁有哪些? 表级锁: 场景:表级锁适用于需要对整个表进行操作的情况,例如…...
现存脑容知识库
Redis import queue import threading import asyncio 异步:在一个线程内,等待的时候可以切换到其他任务。 多线程:每个线程独立运行,同时处理多个任务。 回调函数 网络请求(JavaScript)在浏览器中&a…...

Mysql-如何理解事务?
一、事务是什么东西 有些场景中,某个操作需要多个sql配合完成: 例如: 李四这个月剩下的前不够交房租了,找张三借1000元急用: (1)给张三的账户余额 减去1000元 updata 账户表 set money money -…...

dify绑定飞书多维表格
dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…...

QT播放视频保持视频宽高比消除黑边
QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比…...
1. IO的基础知识
1.1 流 Java程序通过流执行IO。流是一种抽象,它要么生成信息,要么使用信息。流通过java的IO系统链接到物理设备。所有流的行为方式都是相同的,尽管它们链接的物理设备是不同的。 1.2 字节流和字符流 Java定义了两种类型的流 : 字节流和字符流…...
科普:ROC AUC与PR AUC
在评价二分类模型性能时,有许多评价指标,其中,有一对是用面积AUC(Area Under the Curve)做评价的:ROC AUC与PR AUC 本文我们对ROC AUC与PR AUC进行多维度对比分析: 一、定义与核心原理 维度RO…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...