气泡弹弹弹

气泡弹弹弹

  • 组件
xml 复制代码
<template>
	<view>
		<view :class="dataList?.length == 1 ? 'bubble_flex_only_one':'bubble_flex'">
			<view class="buble" v-for="(item, index) in dataList" :key="index" :data-speed="item.speed"
				:style="{'margin-top': dataList.length == 1 ? '-10px':index % 2 === 0 ? '40px' : '-10px'}"
				@click="bubleClick(index)" :class="{ 'hidden': !item.isShow }">
				<image class="star_left_top" :src="
            item.isTomorrow
              ? $dataUrl.imgUrl+'bubble/img/star_left_top_to.png'
              : $dataUrl.imgUrl+'bubble/img/star_left_top.png'
          " />
				<view class="flex-col" :class="
            item.isTomorrow ? 'text_wrapper_num_tomorrow' : 'text_wrapper_num'
          " :style="`background-image: url(${$dataUrl.imgUrl}bubble/img/${item.isTomorrow ? 'bubble_bg_blue' : 'bubble_bg_yellow'}.png);`">
					<text class="text_num">{{ item.num }}</text>
				</view>
				<view class="box_text flex-col">
					<view class="flex-col" :class="item.isTomorrow ? 'block_text_tomorrow' : 'block_text'">

						<view class="flex-col" :class="item.isTomorrow ? 'bubble_text_tomorrow' : 'bubble_text'"
							:style="`background-image: url(${$dataUrl.imgUrl}bubble/img/${item.isTomorrow ? 'bubble_txt_bg' : 'bubble_txt_bg_yellow'}.png);`">
							<text class="text_76">{{ item.name }}</text>
						</view>
						<image class="star_right_bottom" :src="
                item.isTomorrow
                  ? $dataUrl.imgUrl+'bubble/img/star_to.png'
                  : $dataUrl.imgUrl+'bubble/img/star.png'
              " />
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		name: "yqc-bubble",
		emits: ["getBubbleItem", "clickIndex"],
		props: {
			dataList: {
				type: Array,
				default: () => [{
						num: 50,
						name: "每日领取",
						speed: "fast",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 1000,
						name: "黄金VIP",
						speed: "slow",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 2000,
						name: "数据金卡",
						speed: "default",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 3000,
						name: "明日领取",
						speed: "slow",
						isTomorrow: true,
						isShow: true
					},
				],
			},
		},
		data() {
			return {
				clickIndex: -1,
				$dataUrl: this.$dataUrl,
			};
		},
		mounted() {},
		methods: {
			bubleClick(index) {
				this.clickIndex = index;
				this.$emit('clickIndex', index)
				this.$emit('getBubbleItem', this.dataList[index])
				if (this.dataList[index].isTomorrow) {
					//如果是明日 不需要处理
					return
				}
				// console.log("点击了",this.dataList[index].name);
				//点击哪个 就隐藏哪个
				this.dataList[index].isShow = false;

			}
		}
	};
</script>

<style lang="scss" scoped>
	.box_text {
		height: 20px;
		width: 84px;
	}

	.block_text {

		border-radius: 19px;
		width: 80px;
		position: relative;
		top: -10px;
		padding: 5px;
	}

	.block_text_tomorrow {
		border-radius: 19px;
		width: 80px;
		position: relative;
		top: -10px;
		padding: 5px;
	}

	.bubble_text {
		position: absolute;
		background-size: 100%;
		background-repeat: no-repeat;
		left: 0px;
		text-align: center;
		width: 80px;
		height: 23px;
		line-height: 23px;
		font-size: 11px;
	}

	.bubble_text_tomorrow {
		position: absolute;
		background-size: 100%;
		background-repeat: no-repeat;
		left: 0px;
		text-align: center;
		width: 80px;
		height: 23px;
		line-height: 23px;
		font-size: 11px;
	}

	.text_76 {
		color: rgba(64, 40, 22, 1);
		font-size: 11px;
		font-weight: normal;
		text-align: center;
		font-weight: bold;
		white-space: nowrap;
	}

	// 右边星星
	.star_right_bottom {
		position: absolute;
		left: 72px;
		top: 0px;
		width: 20rpx;
		height: 20rpx;
	}

	.star_left_top {
		position: absolute;
		left: 3px;
		top: -2px;
		width: 16px;
		height: 16px;
	}

	.text_wrapper_num {
		width: 55px;
		height: 39px;
		text-align: center;
		background-repeat: no-repeat;
		background-size: 100%;
		padding: 11px 6px 13px 8px;
	}

	.text_wrapper_num_tomorrow {
		width: 55px;
		height: 39px;
		text-align: center;
		background-size: 100%;
		padding: 11px 6px 13px 8px;
	}

	.text_num {
		overflow-wrap: break-word;
		color: rgba(64, 40, 22, 1);
		font-size: 15px;
		font-weight: bold;
		text-align: center;
		white-space: nowrap;
	}

	.bubble_flex {
		margin-top: -32px;
		display: flex;
		justify-content: space-around;
		height: 200rpx;
	}

	.bubble_flex_only_one {
		margin-top: -32px;
		display: flex;
		justify-content: flex-end;
		height: 200rpx;
	}

	.buble {
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		width: 84px;
		height: 60px;
		border-radius: 25px;
		animation: pulse var(--animation-duration, 1.5s) infinite;
		-webkit-animation: pulse var(--animation-duration, 1.5s) infinite;
	}

	.hidden {
		opacity: 0;
		pointer-events: none;
	}

	/* 通过data属性匹配不同时长 */
	.buble[data-speed="fast"] {
		--animation-duration: 1s;
	}

	.buble[data-speed="slow"] {
		--animation-duration: 2s;
	}

	.buble[data-speed="default"] {
		--animation-duration: 1.5s;
	}

	/* 默认值(可选) */
	.buble {
		--animation-duration: 1.5s;
	}

	@keyframes pulse {
		0% {
			transform: translate(0px, 0px);
		}

		50% {
			transform: translate(0px, -10px);
		}

		100% {
			transform: translate(0px, 0px);
		}
	}

	/*Safari 和 Chrome:*/
	@-webkit-keyframes mymove {
		0% {
			transform: translate(0px, 0px);
		}

		50% {
			transform: translate(0px, -10px);
		}

		100% {
			transform: translate(0px, 0px);
		}
	}
</style>
  • 使用
js 复制代码
<yqc-bubble style="margin-top: 0px;" :dataList="bubbleList" @getBubbleItem="clickBubbleItem"
							@clickIndex="bubbleClickIndex"></yqc-bubble>
js 复制代码
data() {
			return {
				bubbleList: [{
						num: 500,
						name: "每日领取",
						speed: "fast",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 1000,
						name: "签到",
						speed: "slow",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 2000,
						name: "看视频",
						speed: "default",
						isTomorrow: false,
						isShow: true
					},
					{
						num: 1000,
						name: "明日再来",
						speed: "slow",
						isTomorrow: true,
						isShow: true
					}
				],
				clickedIndex: 0,
			};
		},
kotlin 复制代码
methods: {
			enjoyPopClick() {
				this.enjoyPopShow = true;
			},
			clickBubbleItem(item) {
				// console.log("点击了==",item.name);
			},
			bubbleClickIndex(index) {
				this.bubbleTempList.splice(index, 1)
				// console.log("点击了索引==",index);
				if (this.bubbleTempList?.length == 1) {
					this.isOnekeyGet = this.bubbleTempList[0].isTomorrow
				}
			},
			onekeyGet() {
				//一键领取 清空数组 调用接口
				this.bubbleList = [{
					num: 1000,
					name: "明日再来",
					speed: "slow",
					isTomorrow: true,
					isShow: true
				}];
				this.onekeyGetText = "明日再来"
				this.isOnekeyGet = true;
			},
			 
			 
		},
	
相关推荐
king王一帅1 小时前
Incremark Solid 版本上线:Vue/React/Svelte/Solid 四大框架,统一体验
前端·javascript·人工智能
智航GIS6 小时前
10.4 Selenium:Web 自动化测试框架
前端·python·selenium·测试工具
前端工作日常6 小时前
我学习到的A2UI概念
前端
徐同保6 小时前
为什么修改 .gitignore 后还能提交
前端
一只小bit7 小时前
Qt 常用控件详解:按钮类 / 显示类 / 输入类属性、信号与实战示例
前端·c++·qt·gui
Mr -老鬼7 小时前
前端静态路由与动态路由:全维度总结与实践指南
前端
颜酱8 小时前
前端必备动态规划的10道经典题目
前端·后端·算法
wen__xvn8 小时前
代码随想录算法训练营DAY10第五章 栈与队列part01
java·前端·算法
大怪v9 小时前
前端佬们!!AI大势已来,未来的上限取决你的独特气质!恭请批阅!!
前端·程序员·ai编程
Mr -老鬼9 小时前
功能需求对前后端技术选型的横向建议
开发语言·前端·后端·前端框架