element-plus + vue3实现卡片无缝滚动效果

第一步:在components文件夹下新建Carousel.vue的文件,代码如下
<template>
	<div class="w_100 h_100 carousel_box">
		<template v-if="data.length > 1">
			<div class="arrow left-a d-f ai-c jc-c" @click="arrowPrev">
				<el-icon :size="24"><ArrowLeft /></el-icon>
			</div>
			<div class="arrow right-a d-f ai-c jc-c" @click="arrowNext">
				<el-icon :size="24"><ArrowRight /></el-icon>
			</div>
		</template>

		<el-carousel ref="carouselRef" indicator-position="none" :autoplay="false" arrow="never">
			<el-carousel-item v-for="(item, index) in data" :key="index">
				<div class="apply_box d-f jc-sb fxw-w pb-10">
					<template v-for="card in item" :key="card">
						<!-- 卡片组件 -->
						<ApplyCard :data="card" />
					</template>
					<div class="apply_box_zhan"></div>
				</div>
			</el-carousel-item>
		</el-carousel>
	</div>
</template>

<script setup>
	import { reactive, ref } from 'vue'
	import { ArrowRight, ArrowLeft } from '@element-plus/icons-vue'

	import ApplyCard from './ApplyCard.vue'
	const props = defineProps({
		data: {
			type: Array,
			default: () => []
		}
	})
	const carouselRef = ref()
	const arrowPrev = () => {
		carouselRef.value.prev()
	}
	const arrowNext = () => {
		carouselRef.value.next()
	}
</script>

<style lang="scss" scoped>
	.carousel_box {
		position: relative;
		.arrow {
			width: 48px;
			height: 48px;
			border-radius: 24px;
			background: #fdfeff;
			border: 1px solid #e9f0ff;
			color: #647daf;
			position: absolute;
			top: 50%;
			margin-top: -24px;
			&:hover {
				background: #578fff;
				color: #fff;
				cursor: pointer;
			}
			&.left-a {
				left: -96px;
			}
			&.right-a {
				right: -96px;
			}
		}
	}
	.apply_box_zhan {
		width: 360px;
		height: 0;
	}
</style>

第二步:在components中新建ApplyCard.vue文件,代码如下
<template>
	<div>
		<div class="card c-p" @click="onUrl">
			<div class="main_img">
				<img class="w_100 h_100" :src="Config.base_url + data.app_icon" alt="" />
				<!-- <div class="tip">PC网页端</div> -->
			</div>

			<div class="content">
				<div class="title ellipsis_1 fs-20">{{ data.app_name }}</div>
				<div class="text mt-14 d-f jc-sb ai-c">
					<div class="fromtype d-f ai-c jc-c zw" v-if="data.url_type == 2">
						<img src="@/assets/images/home/zw-icon.png" alt="" />

						<span class="fs-12 ml-4">登陆类型1</span>
					</div>
					<div class="fromtype d-f ai-c jc-c hlw" v-if="data.url_type == 1">
						<img class="icon" src="@/assets/images/home/hlw-icon.png" alt="" />

						<span class="fs-12 ml-4">登陆类型2</span>
					</div>
					<div class="collection d-f jc-sb ai-c c-p" @click.stop="onCollection">
						<span class="star d-f ai-c jc-c mr-10" :class="{ select: data.fav_status == 1 }">
							<!-- select -->
							<el-icon :size="16"><StarFilled /></el-icon>
						</span>
						<span class="fs-18">{{ data.fav_status == 1 ? '取消收藏' : '收藏' }}</span>
					</div>
				</div>
			</div>
		</div>
	</div>
</template>

<script setup>
	import Config from '@/utils/config'
	import { StarFilled } from '@element-plus/icons-vue'
	import $http from '@/api/api'
	const props = defineProps({
		data: {
			type: Object,
			default: () => ({})
		}
	})
	const onUrl = () => {
		window.open(props.data.app_url, '_blank') // 在新窗口打开外链接
	}
	const onCollection = () => {
		$http
			.post('/Admin/GateIndex/favOrNot', {
				app_id: props.data.app_id
			})
			.then((res) => {
				props.data.fav_status == 0 ? (props.data.fav_status = 1) : (props.data.fav_status = 0)
			})
	}
</script>

<style lang="scss" scoped>
	.card {
		width: 360px;
		height: 294px;
		border-radius: 4px;
		border: 1px solid #d7e8f8;
		overflow: hidden;
		&:hover {
			border: 1px solid #71bbff;
		}
		.main_img {
			width: 100%;
			height: 204px;
			position: relative;
			img {
				object-fit: cover;
			}
			.tip {
				position: absolute;
				top: 8px;
				left: 8px;
				padding: 8px 12px;
				border-radius: 4px;
				border: 1px solid #d7e8f8;
				background-color: #132a4043;
				color: #fff;
				font-size: 14px;
			}
		}
		.content {
			padding: 16px 16px 0;
			.title {
				font-weight: 400;
			}
			.text {
				.fromtype {
					width: 94px;
					height: 26px;
					border-radius: 4px;
					.icon {
						width: 14px;
						height: 14px;
					}
					&.zw {
						color: #3175ff;
						background: #eef8ff;
					}
					&.hlw {
						color: #ff8a24;
						background: #fff1de;
					}
				}
				.collection {
					color: #7a7a7a;
					.star {
						// padding: 5px;
						width: 24px;
						height: 24px;
						border-radius: 12px;
						background: #e6f4ff;
						color: #b0c9ff;
						box-shadow: 0px 2px 4px 0px rgba(156, 172, 197, 0.2);
						&.select {
							background: #fdd4d4;
							color: #ff5967;
						}
					}
				}
			}
		}
	}
</style>

第三步:使用该组件,代码如下
<!-- 导入该组件 -->
<Carousel v-if="departmentsList.length" :data="departmentsList" />

// 导入组件
import Carousel from './components/Carousel.vue'

== 运行效果图如下 ==

在这里插入图片描述

好的,让我们开始吧! 首先,我们需要在项目中安装 `element-plus`,你可以使用 npm 或 yarn 进行安装,比如: ``` npm install element-plus --save ``` 或者 ``` yarn add element-plus ``` 安装完成后,我们需要在 `main.ts` 中引入并使用 `element-plus`,代码如下: ```typescript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 现在我们已经成功引入了 `element-plus`,接下来我们可以开始编写一些组件。 例如,在 `src/components` 目录下创建一个名为 `HelloWorld.vue` 的组件,代码如下: ```vue <template> <div class="hello"> <el-button type="primary" @click="handleClick">Click me!</el-button> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import { ElButton } from 'element-plus' export default defineComponent({ name: 'HelloWorld', components: { ElButton }, methods: { handleClick() { console.log('Hello, world!') } } }) </script> ``` 在这个组件中,我们使用了 `ElButton` 组件,并在它的点击事件中打印了一条消息。 接下来,我们可以在 `App.vue` 中使用这个组件,代码如下: ```vue <template> <div id="app"> <HelloWorld /> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import HelloWorld from './components/HelloWorld.vue' export default defineComponent({ name: 'App', components: { HelloWorld } }) </script> ``` 现在,我们已经成功使用 `element-plus` 来创建了一个简单的组件,并在 `App.vue` 中使用它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值