uniapp——组件多颜色模块展示、气泡框

一、自定义颜色:

样式

代码

html 复制代码
<template>
	<view class="content">
		<!-- 右上角 -->
		<view class="coverStatus" :class="[itemClass, positionClass,cornerClass,sanJiaoCss,sanJiaoCss2]"
			:style="dynamicStyle">
			{{title}}
		</view>
	</view>
</template>

<script>
	export default {
		name: "cardTypeCard",
		props: {
			title: {
				type: String,
				default: '进行中',
			},
			cardType: {
				type: String,
				default: 'progress',
			},
			position: {
				type: String,
				default: 'right', // 默认值为 'right'
			},
			cornerStyle: { // 新增的 prop 控制圆角
				type: String,
				default: 'rightTop', // 默认右上角元素的圆角
			},
			sanJiao: {
				type: Boolean,
				default: false, // 默认右上角元素的小三角
			},
			sanJiao2: {
				type: Boolean,
				default: false, // 默认右上角元素的小三角
			},
			width: { // 新增的 prop 控制宽度
				type: String,
				default: '48rpx',
			},
			height: { // 新增的 prop 控制高度
				type: String,
				default: '20rpx',
			},
			fontSize: { // 新增的 prop 控制字体大小
				type: String,
				default: '14rpx',
			},
		},
		computed: {
			//定位
			positionClass() {
				return this.position === 'left' ? 'leftPosition' : 'rightPosition';
			},
			sanJiaoCss() {
				return this.sanJiao == true ? 'sanJiaoAct' : '';
			},
			sanJiaoCss2() {
				return this.sanJiao2 == true ? 'sanJiaoAct2' : '';
			},
			// 圆角样式
			cornerClass() { // 根据 cornerStyle 返回相应的圆角样式类
				switch (this.cornerStyle) {
					case 'rightTop':
						return 'rightDemo';
					case 'leftTop':
						return 'leftDemo';
					default:
						return 'allDemo';
				}
			},
			// 背景颜色
			itemClass() {
				let className;
				switch (this.cardType) {
					case 'progress':
						className = 'blueBg'
						break;
					case 'finish':
						className = 'greyBg'
						break;
					case 'enroll':
						className = 'pinkBg'
						break;
					case 'wait_upload':
						className = 'pinkBg'
						break;
					case 'wait_examine':
						className = 'greyBg'
						break;
					case 'passed':
						className = 'greyBg'
						break;
					case 'fail':
						className = 'redBg'
						break;
				}
				return className;
			},
			// 动态样式对象
			dynamicStyle() {
				return {
					width: this.width,
					height: this.height,
					fontSize: this.fontSize,
				};
			},
		},
	}
</script>
<style lang="scss" scoped>
	// 卡片颜色
	.coverStatus {
		color: #FFFFFF;
		display: flex;
		justify-content: center;
		align-items: center;
		position: absolute;
		top: 0;
	}

	.sanJiaoAct {
	
	}

	.sanJiaoAct::after {
		content: '';
		position: absolute;
		left: 10rpx;
		bottom: -8rpx;
		width: 0;
		height: 0;
		border-top: 6rpx solid var(--triangle-color);
		border-right: 4rpx solid transparent;
		border-bottom: 4rpx solid transparent;
		border-left: 4rpx solid transparent;
	}

	.sanJiaoAct2 {
	}

	.sanJiaoAct2::after {
		content: '';
		position: absolute;
		right: 10rpx;
		bottom: -8rpx;
		width: 0;
		height: 0;
		border-top: 6rpx solid var(--triangle-color);
		border-right: 4rpx solid transparent;
		border-bottom: 4rpx solid transparent;
		border-left: 4rpx solid transparent;
	}

	// 左上角定位
	.leftPosition {
		left: 0;
	}

	// 右上角定位
	.rightPosition {
		right: 0;
	}

	// 右上角圆角
	.rightDemo {
		border-radius: 0rpx 10rpx 0rpx 10rpx;
	}

	// 左上角圆角
	.leftDemo {
		// border-radius: 8rpx 0rpx 8rpx 0rpx;
		border-radius: 15rpx;
	}

	// 全部圆角
	.allDemo {
		border-radius: 15rpx;
	}

	//已报名颜色 、待上传
	.pinkBg {
		background: #F364B3;
		--triangle-color: #F364B3;
	}

	//进行中颜色
	.blueBg {
		background: #A4CBE8;
		--triangle-color: #A4CBE8;
	}

	//已截止、待审核、已完成颜色
	.greyBg {
		background-color: #898989;
		--triangle-color: #898989;
	}

	//已驳回颜色
	.redBg {
		background-color: #ff0000;
		--triangle-color: #ff0000;
	}
</style>

使用

父页面:

html 复制代码
<cardTypeColor :cardType="data.task_status" :title="data.task_status_text" cornerStyle="allDemo" :sanJiao="true">
</cardTypeColor>
import cardTypeColor from '@/components/cardTypeColor/cardTypeColor.vue'

二、使用图片作为背景

样式

代码

html 复制代码
<template>
	<view>
		<view class="content" :class="[positionClass]">
			<!-- 右上角 -->
			<block v-if="positionClass == 'rightPosition'">
				<image src="/static/images/index/pinkImg.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'pinkBg'"></image>
				<image src="/static/images/index/blueImg.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'blueBg'"></image>
				<image src="/static/images/index/greyImg.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'greyBg'"></image>
			</block>
			<!-- 左上角 -->
			<block v-if="positionClass == 'leftPosition'">
				<image src="/static/images/index/pinkImg2.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'pinkBg'"></image>
				<image src="/static/images/index/blueImg2.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'blueBg'"></image>
				<image src="/static/images/index/greyImg2.png" mode="aspectFit" class="signImg"
					v-if="itemClass == 'greyBg'"></image>
			</block>
			<view class="coverStatus">
				{{title}}
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		name: "cardTypeCard",
		props: {
			title: {
				type: String,
				default: '进行中',
			},
			cardType: {
				type: String,
				default: 'progress',
			},
			position: {
				type: String,
				default: 'right', // 默认值为 'right'
			},
		},
		computed: {
			//定位
			positionClass() {
				return this.position === 'left' ? 'leftPosition' : 'rightPosition';
			},
			// 背景颜色
			itemClass() {
				let className;
				switch (this.cardType) {
					case 'progress':
						className = 'blueBg'
						break;
					case 'finish':
						className = 'greyBg'
						break;
					case 'enroll':
						className = 'pinkBg'
						break;
					case 'wait_upload':
						className = 'pinkBg'
						break;
					case 'wait_examine':
						className = 'greyBg'
						break;
					case 'passed':
						className = 'greyBg'
						break;
					case 'fail':
						className = 'redBg'
						break;
				}
				return className;
			},
		},
	}
</script>
<style lang="scss" scoped>
	.content {
		position: absolute;
		top: 0;
		width: 50rpx;
		height: 32rpx;

		.signImg {
			position: absolute;
			left: 0;
			top: 0;
			width: 100%;
			height: 100%;
		}

		.coverStatus {
			position: absolute;
			left: 1rpx;
			top: 2rpx;
			z-index: 4;
			width: 100%;
			height: 100%;
			color: #FFFFFF;
		}
	}
	// 左上角定位
	.leftPosition {
		left: 0;
	}

	// 右上角定位
	.rightPosition {
		right: 0;
	}
</style>

使用

父页面:

html 复制代码
<cardTypeColor :cardType="data.task_status" :title="data.task_status_text" position="left">
</cardTypeColor>
import cardTypeColor from '@/components/cardTypeColor/cardTypeColor.vue'
相关推荐
万物得其道者成7 小时前
UniApp 多端滑块验证码插件 zxj-slide-verify 实用指南
uni-app
蓝帆傲亦9 小时前
支付宝小程序性能暴增秘籍:UniApp项目极限优化全攻略
小程序·uni-app
Mr Xu_12 小时前
前端开发中CSS代码的优化与复用:从公共样式提取到CSS变量的最佳实践
前端·css
Lee川14 小时前
CSS盒模型实战:用代码透视 `border-box`与 `content-box`的天壤之别
css
2501_9160088919 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
哈里谢顿19 小时前
CSS 入门完全指南:从零构建你的第一个样式表
css
. . . . .20 小时前
CSS 编写与管理范式 - Tailwind和CSS-in-JS
css
QT.qtqtqtqtqt20 小时前
uni-app小程序前端开发笔记(更新中)
前端·笔记·小程序·uni-app
喵喵虫1 天前
uniapp修改封装组件失败 styleIsolation
uni-app
RFCEO2 天前
前端编程 课程十六、:CSS 盒子模型
css·前端基础课程·css盒子模型·css盒子模型的组成·精准控制元素的大小和位置·css布局的基石·内边距(padding)