学习Uni-app开发小程序Day18

news2024/12/23 23:06:27

昨天学习了使用轮播显示图片和文字,轮播方式纵向和横向。今天使用扩展组件和scroll-view显示图片,使用scroll-view的grid方式、插槽slot、自定义组件、磨砂背景定位布局做专题组件
在这里插入图片描述
这就是需要做成的效果,下面将一步一步的完成。
首先,这里的每日推荐和专题精选都是相同的组件,这里使用自定义组件进行,
第一步:在项目根目录创建文件夹,components文件夹,创建组件,
看这个布局,是文字不同,后面的显示不同,这里使用slot

<template>
	<view class="common-title">
		<view class="name">
			<slot name="name"></slot>
		</view>
		<view class="custom">
			<slot name="custom"></slot>
		</view>
	</view>
</template>

<script setup>
	
</script>

<style lang="scss" scoped>
	.common-title{
		display: flex;
		justify-content: space-between;//这是让两端对齐
		align-items: center;
		padding: 0 30rpx;
		.name{
			font-size: 40rpx
		}
	}

</style>

这里就是用slot了,定义一个slot的名称,在父组件中直接传参就能显示不同的效果

<common-title>
	<template v-slot:name>每日推荐</template>
		<template #custom>
	 		<view class="date">
				<uni-icons type="calendar" size="18" color="#309877"></uni-icons>
			<view class="text">
				<uni-dateformat :date="Date.now()" format="dd日"></uni-dateformat>
			</view>
			</view>
	</template>
</common-title>
<view class="content">
	<scroll-view scroll-x>
		<view class="box" v-for="item in 8">
			<image src="../../common/images/preview_small.webp" mode="aspectFill"></image>
		</view>
	</scroll-view>
</view>

这就是拓展组件和插槽的使用,这里也使用了扩展组件,顺便复习下,扩展组件的使用:找到需要的组件,点击下载导入,使用的时候,只用引入需要的组件名称,就可以使用了,至于组件的属性,查看文档有详细说明。
以上是每日推荐模块,但是出来后显示的布局方式是纵向显示的,这里需要修改样式,让横向显示,

.select {
			margin-top: 50rpx;
			.content {
				width: 720rpx;
				margin-left: 30rpx;
				margin-top: 30rpx;

				scroll-view {
					white-space: nowrap;

					.box {
						width: 200rpx;
						height: 430rpx;
						display: inline-block;
						margin-right: 15rpx;

						image {
							width: 100%;
							height: 100%;
							border-radius: 10rpx;
						}
					}

					.box:last-child {
						margin-right: 30rpx;
					}
				}
			}

			.date {
				color: #309877;
				display: flex;
				align-items: center;

				.text {
					margin-left: 5rpx;
				}
			}
		}

这就把每日推荐这个模块的全部显示出来了。
下来是要做专题精选,这里文字模块,使用的和每日推荐使用的是相同的布局,直接使用同样的组件就好。下面的图片显示,使用的是scroll-view的grid方式,因为布局后面,还有个模糊的更多,点击图片进入的是图片详情,点击更多进入的是其他页面,两个显示的不同,点击后进入的方式也不同,这里就用到grid了,

<view class="theme">
			<common-title>
				<template v-slot:name>专题精选</template>
				<template #custom>
					<navigator url="" class="more">More+</navigator>
				</template>
			</common-title>
			<view class="content">
				<theme-item v-for="item in 5"></theme-item>
				<theme-item :isMore="true"></theme-item>
			</view>
		</view>
<!-- style -->
.theme{
			margin: 50rpx 0;
			.more{
				font-size: 32rpx;
				color: #888;
			}
			.content{
				margin-top: 30rpx;
				padding: 0 30rpx;
				display: grid;
				gap: 15rpx;//属性是用来设置网格行与列之间的间隙,该属性是 row-gap 和 column-gap 的简写形式
				grid-template-columns: repeat(3,1fr);
				//display:grid 是转为网格布局,这个是必须的
				// grid-template-columns:1fr | px 这是将网格分为几列,1fr是自适配单位,可以当成栅格,这里也可以是用repeat(3,1fr),是平分成三列,然后自适应宽度,这里看自己需求需要分成几列
				//grid-template-columns: repeat(auto-fill, minmax(255px, 1fr)); 这种写法可以用来做响应式布局,auto-fill主轴上指定的宽度或者重复次数是最大可能的正整数,minmax最小值255px、最大值1fr代表剩余空间的比例。注意:实现这种响应式布局,一定要注意父容器不能使用固定宽度,可以将父容器改为如:80%,这样就能根据屏幕的宽度,自动展示一行展示几个了。
				// gap:30px 这是网格四周的间隔
				// 注意:这三个属性是给父容器添加的,子元素,可以不用设置宽度,也不用设置margin间距即可完成如下布局。
				// grid-row和grid-column可以控制某个元素占领几份
				// 以grid-row行为例,从第几列开始 / 第几列+想占几个;
				// grid-row: 1/3;
				// grid-column: 1/3;
			}
		}

上面是设置grid显示的不同的样式,是不是看的云里雾里的,没事,老师有专门的课程,grid网格布局,比flex方便太多了,介绍几种常用的grid布局属性,这里有详细的解释和案例,
磨砂背景定位布局,在列表中,图片上特定区域,有文字和磨砂背景的,这里也是使用自定义组件的方式

<template>
	<view class="theme-item">
		<navigator url="" class="box" v-if="!isMore">
			<image class="pic" src="../../common/images/classify1.jpg" mode="aspectFill"></image>
			<view class="mack">明星美女</view>
			<view class="tabMack">3天前更新</view>
		</navigator>

		<navigator url="" class="box more" v-else>
			<image class="pic" src="../../common/images/more.jpg" mode="aspectFill"></image>
			<view class="mack">
				<uni-icons type="more-filled" size="34" color="#fff"></uni-icons>
				<text class="text">更多</text>
			</view>
		</navigator>
	</view>
</template>

<script setup>
defineProps({
	isMore:{
		type:Boolean,
		default:false
	}
})
</script>

<style lang="scss" scoped>
	.theme-item {
		.box {
			height: 340rpx;
			border-radius: 10rpx;
			overflow: hidden;
			position: relative;

			.pic {
				width: 100%;
				height: 100%;
			}

			.mack {
				width: 100%;
				height: 70rpx;
				position: absolute;
				bottom: 0;
				left: 0;
				font-size: 30rpx;
				background: rgba(0, 0, 0, 0.2);
				color: #fff;
				display: flex;
				align-items: center;
				justify-content: center;
				backdrop-filter: blur(20rpx);
				font-weight: 600;
			}

			.tabMack {
				position: absolute; //指定一个元素在文档中的定位方式
				left: 0;
				top: 0;
				background: rgba(250, 190, 90, 0.7);
				backdrop-filter: blur(20rpx); //backdrop-filter CSS 属性可以让你为一个元素后面区域添加图形效果(如模糊或颜色偏移)
				font-size: 22rpx;
				color: #fff;
				padding: 6rpx 14rpx;
				border-radius: 0 0 20rpx 0;
				transform: scale(0.8); //属性允许你旋转,缩放,倾斜或平移给定元素。这是通过修改 CSS 视觉格式化模型的坐标空间来实现的。
				transform-origin: left top; //更改一个元素变形的原点
			}
		}

		.box.more{
			.mack{
				width: 100%;
				height: 100%;
				flex-direction: column;
			}
			.text{
				font-size: 28rpx;
			}
		}
	}
</style>

下面是整页的详细代码

<template>
	<view class="homeLayout">
		<view class="banner">
			<swiper indicator-dots autoplay circular :interval="3000" :duration="1000"
				indicator-color="rgba(255,255,255,0.5)" indicator-active-color="#ffffff">
				<swiper-item v-for="(item,index) in picArr" :key="item.id">
					<image :src="item.src" mode="aspectFill"></image>
				</swiper-item>
			</swiper>
		</view>
		<view class="notice">
			<view class="letf">
				<uni-icons type="sound-filled" size="20" color="#309877"></uni-icons>
				<text class="text">公告</text>
			</view>
			<view class="center">
				<swiper vertical circular autoplay interval="1500" duration="300">
					<swiper-item v-for="item in 4">
						内容文字内容文字内容文字内容文字内容文字
					</swiper-item>
				</swiper>
			</view>
			<view class="rigth">
				<uni-icons type="right" size="16" color="#333"></uni-icons>
			</view>
		</view>
		<view class="select">
			<common-title>
				<template v-slot:name>每日推荐</template>
				<template #custom>
					<view class="date">
						<uni-icons type="calendar" size="18" color="#309877"></uni-icons>
						<view class="text">
							<uni-dateformat :date="Date.now()" format="dd日"></uni-dateformat>
						</view>
					</view>
				</template>
			</common-title>
			<view class="content">
				<scroll-view scroll-x>
					<view class="box" v-for="item in 8">
						<image src="../../common/images/preview_small.webp" mode="aspectFill"></image>
					</view>
				</scroll-view>
			</view>
		</view>
		<view class="theme">
			<common-title>
				<template v-slot:name>专题精选</template>
				<template #custom>
					<navigator url="" class="more">More+</navigator>
				</template>
			</common-title>
			<view class="content">
				<theme-item v-for="item in 5"></theme-item>
				<theme-item :isMore="true"></theme-item>
			</view>
		</view>
	</view>
</template>

<script setup>
	import {
		ref
	} from 'vue';
	const picArr = ref([{
			id: 1,
			src: "../common/images/banner1.jpg"
		},
		{
			id: 2,
			src: "../../common/images/banner2.jpg"
		},
		{
			id: 3,
			src: "../../common/images/banner3.jpg"
		}
	])
</script>

<style lang="scss" scoped>
	.homeLayout {
		.banner {
			width: 750rpx;
			padding: 30rpx 0; //padding:当是一个值的时候:是周围四边,两个值:第一个是:上下;第二个是左右;当三个值:第一是上。第二个是左右,第三个是下;当是四个值:第一个是上,第二个右,第三个下,第四个左
			swiper {
				width: 750rpx;
				height: 340rpx;
				&-item {
					width: 100%;
					height: 100%;
					padding: 0 30rpx;
					image {
						width: 100%;
						height: 100%;
						border-radius: 10rpx;
					}
				}
			}
		}

		.notice {
			width: 690rpx;
			height: 80rpx;
			line-height: 80rpx;
			background: #f9f9f9;
			margin: 0 auto;
			border-radius: 80rpx;
			display: flex;

			.letf {
				width: 140rpx;
				display: flex;
				justify-content: center;
				align-items: center;

				.text {
					font-weight: 600; //指定了字体的粗细程度, 详细查看:https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-weight
					font-size: 28rpx;
					color: #309877;
				}
			}

			.center {
				flex: 1;

				swiper {
					height: 100%;

					&-item {
						height: 100%;
						font-size: 30rpx;
						color: #666;
						overflow: hidden; //设置了元素溢出时所需的行为——即当元素的内容太大而无法适应它的区块格式化上下文时。
						white-space: nowrap; //用于设置如何处理元素内的空白字符,nowrap是不让换行显示
						text-overflow: ellipsis; // 用于确定如何提示用户存在隐藏的溢出内容 ellipsis:超出文本部分使用省略号
					}
				}
			}

			.rigth {
				width: 70rpx;
				display: flex;
				justify-content: center;
				align-items: center;
			}
		}

		.select {
			margin-top: 50rpx;
			.content {
				width: 720rpx;
				margin-left: 30rpx;
				margin-top: 30rpx;

				scroll-view {
					white-space: nowrap;

					.box {
						width: 200rpx;
						height: 430rpx;
						display: inline-block;
						margin-right: 15rpx;

						image {
							width: 100%;
							height: 100%;
							border-radius: 10rpx;
						}
					}

					.box:last-child {
						margin-right: 30rpx;
					}
				}
			}

			.date {
				color: #309877;
				display: flex;
				align-items: center;

				.text {
					margin-left: 5rpx;
				}
			}
		}
		.theme{
			margin: 50rpx 0;
			.more{
				font-size: 32rpx;
				color: #888;
			}
			.content{
				margin-top: 30rpx;
				padding: 0 30rpx;
				display: grid;
				gap: 15rpx;//属性是用来设置网格行与列之间的间隙,该属性是 row-gap 和 column-gap 的简写形式
				grid-template-columns: repeat(3,1fr);
				//display:grid 是转为网格布局,这个是必须的
				// grid-template-columns:1fr | px 这是将网格分为几列,1fr是自适配单位,可以当成栅格,这里也可以是用repeat(3,1fr),是平分成三列,然后自适应宽度,这里看自己需求需要分成几列
				//grid-template-columns: repeat(auto-fill, minmax(255px, 1fr)); 这种写法可以用来做响应式布局,auto-fill主轴上指定的宽度或者重复次数是最大可能的正整数,minmax最小值255px、最大值1fr代表剩余空间的比例。注意:实现这种响应式布局,一定要注意父容器不能使用固定宽度,可以将父容器改为如:80%,这样就能根据屏幕的宽度,自动展示一行展示几个了。
				// gap:30px 这是网格四周的间隔
				// 注意:这三个属性是给父容器添加的,子元素,可以不用设置宽度,也不用设置margin间距即可完成如下布局。
				// grid-row和grid-column可以控制某个元素占领几份
				// 以grid-row行为例,从第几列开始 / 第几列+想占几个;
				// grid-row: 1/3;
				// grid-column: 1/3;
			}
		}
	}
</style>

这里提下,如果图片放在common下,这个是在打包的时候,只有用到的才会打包,没有用到的是不打包的,我这里在弄轮播图的时候,就使用的是common下的图片了,把这些图片放在数组中,然后在页面上使用,在H5的时候,是没问题的,因此就没多看,今天在小程序中,轮播图片不显示,原因是没有在小程序中找到,试了各种办法,还是不行,但把图片地址直接引用common下的图片,又可以了,这不清楚原因,这里记录下,后期知道了在补充。
为什么要专门说下这个,从这里看出,各个平台存在差异化,目前是以微信小程序为主的,所以在做完一个小功能后,还是要在小程序中查看下是不是可以使用,不然到后期出现问题更改起来会很繁琐的。
加油,学无止境!

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

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

相关文章

005、API_数据结构

键的数据结构类型&#xff0c;它们分别是&#xff1a; string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集 合&#xff09;&#xff0c;这些只是Redis对外…

word 全文中 英文字体 和 样式的字体 莫名奇妙地 被改成 “等线”

word全文中英文字体和样式的字体莫名奇妙地被改成“等线” sm word又抽风了&#xff0c;改完论文保存后打开突然发现全文字体都不对劲&#xff0c;吓得冷汗直冒&#xff1a;虽然我用git管理了论文版本&#xff0c;但是只有比较大的修改我才上传了&#xff0c;刚刚修了几个小时…

Pycharm2024搭建QT6开发环境

创建pyqt6虚拟环境 首先&#xff0c;创建一个qt6的虚拟环境&#xff1a; conda create --name pyqt6 python3.11.7激活环境&#xff1a; conda activate pyqt6安装pyqt6 安装pyqt6&#xff1a; pip install pyqt6创建代码目录 创建目录&#xff1a; 使用pycharm打开这个…

unity开发Hololens 制作滑动框

一定要做到最后一步&#xff0c;才会有效果 1、创建空物体 ,并添加组件 创建空物体 命名ScrollingObjectCollection&#xff0c; 添加组件如下图 下面是各个组件展开的内容 2、在ScrollingObjectCollection 下面创建两个空物体&#xff0c;分别命名Container、Clipping…

【面试干货】猴子吃桃问题

【面试干货】猴子吃桃问题 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 猴子吃桃问题&#xff1a;猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不瘾&#xff0c;又多吃了一个 二天早上又将剩…

高职物联网专业嵌入式系统开发教学解决方案

前言 随着人工智能与物联网技术的深度融合&#xff0c;物联网&#xff08;AIoT&#xff09;已成为推动产业发展的重要力量。高职物联网专业作为培养技术人才的重要基地&#xff0c;面临着课程体系更新、教学内容优化的迫切需求。嵌入式系统开发作为物联网专业的核心课程之一&a…

服务器硬件全攻略:从入门到精通,全面解析服务器性能与稳定性!

服务器是计算机网络中提供特定服务的计算机系统&#xff0c;其硬件配置和性能直接影响到整个网络系统的运行效率和稳定性。作为一个资深的技术人员&#xff0c;本文将全面详细地介绍服务器硬件基础知识&#xff0c;包括介绍、命令或语法、主要作用以及使用方法等。 一、介绍 服…

uniapp+php服务端实现苹果iap内购的消耗性项目和非续期订阅项目,前后端代码加逻辑分析

前言&#xff1a;公司的项目app在上架苹果商店时发现人家要求里面的部分购买项目必须使用iap购买的方式&#xff0c;使用原本的微信支付方式审核不给通过&#xff0c;无奈只能重新研究这个东西。做起来还是有点麻烦&#xff0c;主要是网上的文章很少&#xff0c;不能直接硬抄。…

Nature Communications | 柔性半导体器件的大规模集成(柔性半导体器件/柔性电子)

韩国中央大学Sung Kyu Park、 韩国成均馆大学Jong-Woong Kim和Yong-Hoon Kim团队,在《Nature Communications》上发布了一篇题为“Full integration of highly stretchable inorganic transistors and circuits within molecular-tailored elastic substrates on a large scal…

QGraphicsView实现简易地图16『爆炸效果』

前文链接&#xff1a;QGraphicsView实现简易地图15『测量面积』 一种简单的爆炸波扩散效果 动态演示效果&#xff1a; 静态展示图片&#xff1a; 核心代码&#xff1a; #pragma once #include "../AbstractGeoItem.h" #include "DataStruct/GeoData.h"…

C++ STL 函数对象:隐藏的陷阱,如何避免状态带来的麻烦?

STL 函数对象&#xff1a;无状态即无压力 一、简介二、函数对象三、避免在函数对象中保存状态3.1、函数对象3.2、lambda 表达式 四、选择合适的更高层次的结构五、总结 一、简介 在使用 C 标准模板库 (STL) 时&#xff0c;函数对象 (Function Object) 是一种强大的工具&#x…

我的文章分类合集目录

文章目录 Java相关基础常规问题类Docker类RabbitMQ类分库分表 网络工程相关路由交换、Cisco Packet TracerIP地址 前端相关数据库 Java相关 基础 Java开发规范、项目开发流程 SpringBoot整合MyBatis实现增删改查(简单,详细) SpringBoot整合MybatisPlus&#xff08;详细&#…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

基于移动多媒体信源与信道编码调研

前言 移动多媒体是指在移动通信环境下&#xff0c;通过无线网络传输的音频、视频、图像等多种媒体信息。移动多媒体的特点是数据量大、传输速率高、服务质量要求高&#xff0c;因此对信源编码和信道编码的性能提出了更高的要求。 本文对进3年的移动多媒体信源与信道编码的研究…

信息系统项目管理师0130:工具与技术(8项目整合管理—8.7监控项目工作—8.7.2工具与技术)

点击查看专栏目录 文章目录 8.7.2 工具与技术8.7.2 工具与技术 专家判断监控项目工作过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:挣值分析;数据的解释和情境化;持续时间和成本的估算技术;趋势分析;关于项目所在的行业以及…

爬虫案例-亚马逊反爬流程分析梳理(验证码突破)(x-amz-captcha)

总体概览&#xff1a;核心主要是需要突破该网站的验证码&#xff0c;成功后会返回我们需要的参数后再去请求一个中间页&#xff08;类似在后台注册一个session&#xff09;&#xff0c;最后需要注意一下 IP 是不能随意切换的 主要难点&#xff1a; 1、梳理整体反爬流程 2、验证…

家政预约小程序01用户注册

目录 1 创建数据源2 创建应用3 创建页面4 用户注册5 角色选择6 设置首页总结 学习低代码的时候&#xff0c;使用官方模板搭建无疑是一个很好的途径。但是低代码工具更新比较频繁&#xff0c;基本每两周就要迭代一个版本。随着官方版本的迭代&#xff0c;官方模板安装好之后会有…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

使用LoRA进行高效微调:基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) [2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) Parametrizations Tutorial — PyTorch Tutorials 2.3.0cu121 documentation 大型语言模型&#xf…

Boyer-Moore投票算法

摩尔投票法&#xff0c;又称为博耶-摩尔多数投票算法&#xff0c;是一种用于在一组数据中寻找多数元素(出现次数超过一半的元素)的算法。该算法的效率非常高&#xff0c;时间复杂度为O(n)&#xff0c;空间复杂度为O(1)&#xff0c;适合处理大数据量的情况。 步骤 首先定义两个…