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…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
