Using vue to complete the click of mouse to produce the special effect of care

First source code
The background color is not good-looking. If you need to change it, please change the inside one

<template>
	<div>
		<div id="lovesBgc"></div>
		<!-- click biubiubiu Little heart  start-->
		<div v-for="(item,index) in loves" v-bind:key="index"  v-bind:ref="loves[index].count"  class="img"
		v-bind:style="item.top+item.left+item.scale+item.opacity" style="  float: left;">
			<div class="left"  v-bind:style="item.childBgc"></div>
			<div class="right" v-bind:style="item.childBgc"></div>
			<div class="under" v-bind:style="item.childBgc"></div>
			<div class="text"> {{text[loves[index].textIndex]}}</div>
		</div>
		<!-- click biubiubiu Little heart  stop-->
		
		<!-- Rising bubble   start-->
		<div class="bubbels">
			<div v-for="(item,index) in bubbles" v-bind:key="index" class="bubble"
				v-bind:style="item.color+item.width+item.height+item.left+
				item.delay+item.duration">
			</div>
		</div>
		<!-- Rising bubble   stop-->
	</div>
</template>

<script>
	export default {
	  data(){
			const text = ["She Xue Nan~", "I like you~", "I love you!~", "Ah!~", "mua~", "Beauty", "miss you", "Why~"];
			const loves = [];
			const bubbles = [];
			// count:1,top:'200px',left:'200px',translateY:'-40px',transform:0.5,opacity:0.5
			return {
				text : text,  //Text on top of your heart 
				textIndex : 0,  //Small heart array subscript
				loves : loves, //Small heart style
				count : 0,   //Number of created elements
				bubbles : bubbles
			}
		},
		methods: {
		   // Create a small mind
			createLoves(event) {
				let x = 0;
				let y = 0;
				let index = 0;//text Text subscript
				let color = "background-color:rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ");";
				index = Math.floor(Math.random()* this.text.length) ;
				console.log(this.text[index]);
				// alert(this.$el);
				x = event.clientX - 10;
				y = event.clientY  - 17;
				// alert(event.clientX);
				
				console.log('x:'+x+' y:'+y+' color:'+color);
				let style = {
					count : 'img' + ++this.count,//
					top : 'top:' + y + 'px;',
					left : 'left:' + x + 'px;',
					opacity : 'opacity:' + 0.5 + ';',
					childBgc : color,
					textIndex : index,
					scale : 'transform: scale(' + 1 + ');', 
					// scale : 'left:' + 1
				};
				this.loves.push(style);
				//Update the position of a bubble when clicking the mouse
				this.updateBubble();
			},
			removeSmallHert(){				
				this.loves[this.count-1].opacity = 'opacity:' + 0 + ';',
				this.loves[this.count-1].scale = 'transform:translateY(' + -80 + 'px) scale(' + 0.5 + ');'
			},
			createBubble(){
				let left = [10, 20, 35, 50, 55, 65, 75, 80, 70, 85,77];
				let wh = [40, 20, 50, 80, 35, 45, 25, 80, 15, 50, 77];
				let duration = [8, 5, 10, 7, 6, 8, 7, 6, 9, 5, 8];
				let	delay = [0, 1, 1, 0, 0, 0, 2, 1, 0, 3, 2];
				let color = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")";
				let bubble={}
				for (var i = 0; i < 11; i++) {
					console.log(wh[i]);
					bubble = {
						left   : 'left:' + Math.floor((Math.random() * 80) + 10) +'%;',
						width  : 'width:' + wh[i]+'px;',
						color  : 'background-color:' + color + ';',
						height : 'height:' + wh[i]+'px;',
						delay    : 'animation-delay:' + delay[i] + 's;',
						duration : 'animation-duration:' + duration[i] + 's;',
					}
					console.log('bubble'+bubble.color);
					this.bubbles.push(bubble);
					//Using randomly generated positions, but obviously uncontrollable 
					// wh = Math.floor((Math.random()) * 65 + 15);
					// left = Math.floor((Math.random()) * 75 + 15) ;
					// duration = Math.floor(Math.random() * 11) % 6 + 5;
					// delay = Math.floor((Math.random() * 6) % 3 + 1) * Math.floor(Math.random() * 2) % 2;
					color = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")";
					// this.sleep(1000);
					console.log(i+'size:'+this.bubbles.length)
				}
			},
			updateBubble(){
				//Update bubble position
				let a=Math.floor(Math.random() * 80) + 10;
				this.bubbles[Math.floor(Math.random() * 11)].left =  'left:' + a +'%';
			}
		},
		beforeMount() {
			this.createBubble()
		}
	}
</script>

<style>
	#lovesBgc{
		position: absolute;
		/* background-color: bisque; */
		 background-image: radial-gradient(red, yellow 10%, green 15%);
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		overflow: hidden;
		position: absolute;
		width: 100%;
		height: 100%;
		z-index: 0;
		overflow: hidden;
		top:0;
		left: 0;
		z-index: -1;
	}
	/* biubiubiu Little heart start */
	.img {width: 20px;height: 20px;opacity: 1;position: absolute;z-index: 1000;transition: 2.5s;}
	.left,.right {width: 10px;height: 10px;border-radius: 100%;position: absolute;}
	.right {right: 0;}
	.under {width: 10px;height: 10px;position: absolute;top: 5px;left: 5px;transform: rotate(45deg)}
	.text {width: 50px;font-size: 10px;line-height: 1;position: absolute;top: -1em;left: -15px;text-align: center;}
	
	/* biubiubiu Little heart stop */
	
	/* Bubbles all over the bottom start */
	.bubble{
		position: absolute;
		bottom:0;
		border-radius:50%;
		/*
		opacity Property sets the opacity level of the element. 
		Default value: 1 Inheritance: no Edition: CSS3 
		JavaScript grammar: object.style.opacity=0.5
		*/
		opacity: 0.2;
		z-index: 999;
		animation: flying 10s infinite ease-in;
	}
	.bubble:nth-child(odd){
		animation: flyingOdd 10s infinite ease-in;
	}
	.bubble:nth-child(even){
		animation: flyingEven 10s infinite ease-in;
	}
	@keyframes flyingEven{
		0%{
			bottom: 0px;
			transform: translateX(0);
		}
		25%{
			transform: translateX(-200px);
		}
		50%{
			transform: translateX(0);
		}
		100%{
			bottom: 1080px;
			/* transform: rotateX(0); */
			transform: translateX(150px);
		}
	}
	@keyframes flyingOdd{
		0%{
			bottom: 0px;
			transform: translateX(0);
		}
		25%{
			transform: translateX(50px);
		}
		50%{
			transform: translateX(-50px);
		}
		75%{
			transform: translateX(-80px);
		}
		100%{
			bottom: 1080px;
			/* transform: rotateX(0); */
			transform: translateX(180px);
		}
	}
</style>

usage method:
Refer to this page in the page to be used, for example, the top name is background.vue

<script> 
 import background from './background.vue'
  export default {
	    components: {background},
		methods: {
			createLoves(){
				this.$refs.background.createLoves(event)
			},
			removeSmallHert(){
				this.$refs.background.removeSmallHert()
			}
		}
    }	
</script>

Use on page

<div id="login" v-on:mousedown.left="createLoves($event)" v-on:mouseup="removeSmallHert">
		<background ref="background"></background>	
</div>

css Style

#login{
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}

ok is a success. The author is also a beginner. If there is something wrong, we can discuss it together. If it doesn't work, we can leave a message. Generally speaking, we can complete the above steps

Published 7 original articles, praised 0, visited 84
Private letter follow

Keywords: Vue css3 Javascript

Added by Ramtree on Sun, 12 Jan 2020 16:27:42 +0200