来接私活吧?小程序接私活必备功能-婚恋交友【附完整代码】

📌个人主页个人主页
​🧀 推荐专栏小程序开发成神之路
📝作者简介:一个读研中创业、打工中学习的能搞全栈、也搞算法、目前在搞大数据的奋斗者。
⭐️您的小小关注是我持续输出的动力!⭐️



一、应用介绍

这次要分享的小程序功能为好友匹配动画界面,这是一款以交友相亲为背景的恋爱主题样式组件。

css样式JS原生语法打造,支持多端的开发,小程序、H5、APP均能丝滑享受。


二、效果展示

在这里插入图片描述


三、技术与难点

3.1 基本开发环境

  • 开发框架:uniapp
  • 代码语法:vue 2htmlcss3

3.2 开发要点

  • (1)头像图片的生成
    • 先引入<image>标签,配置好相应的图片路径
	 <image class="dot" src="randomImg"  style="width: 92px;height: 92px;border-radius: 50px;"></image>`
	- 	再通过CSS样式将其变成圆形
   -webkit-border-radius: 50%;
   -moz-border-radius: 50%;
   border-radius: 50%;
  • (2)CSS动画的引入
    对于网页元素的动画效果我们使用CSS 3 动画,不太熟悉的小伙伴可以直接查看文档进行学习:CSS动画教程

    • 先声明一个放缩动画变量
@keyframes 动画变量名(taoren) {
	0% {
		-webkit-transform:scale(0) translateX(0);
		transform:scale(0) translateX(0);
		opacity:.6
	}
	5% {
		-webkit-transform:scale(1) translateX(0) translateY(-80%);
		transform:scale(1) translateX(0) translateY(-80%);
		opacity:.8
	}
	20% {
		opacity:1
	}
	30% {
		opacity:.2
	}
	32% {
		opacity:0;
		visibility:hidden
	}
	50% {
		-webkit-transform:scale(1.9) translateX(-40px) translateY(-340%);
		transform:scale(1.9) translateX(-40px) translateY(-340%)
	}
	100% {
		-webkit-transform:translateX(-100px);
		transform:translateX(-100px)
	}
}
- 将动画变量绑定到相应的元素样式中
.相应原始的Class名称 {
	animation:taoren
}
  • (3)JS循环逻辑的控制
    在元素和动画都具备的基础之上,接下来进行更重要的操作:将元素所设置的动画按照特定的规则进行重复播放。
    • JS中要实现重复播放的逻辑,通常的做法是使用setInterval方法。
			this.interval = setInterval((function() {
				// 动画逻辑
				}
			), this.intervalTime)

四、完整源码

代码基于vue 2语法编写,拷贝出来需保存为.vue文件。该示例代码中,包括三大模块:<script>,<template>,<style>,三大模块的作用分别是:控制元素逻辑和数据绑定,编写组织页面元素的渲染,控制和渲染元素的样式

<template>
	<view class="center">
		<view class="container">
			<image class="dot" src="randomImg"  style="width: 92px;height: 92px;border-radius: 50px;"></image>
			<view class="pulse"></view>
			<view class="pulse1"></view>
			<view class="prize-flying" >
				<view v-for="(item,index) in flyLeftList" class="fly-prize fly-left" 
				:style="{ 'background': 'url('+ item.img +')', '-webkit-animation-duration': flySpeed + 's','animation-duration': flySpeed + 's' }"></view>
				<view v-for="(item,index) in flyCenterList" class="fly-prize fly-center"
				:style="{ 'background': 'url('+ item.img +')', '-webkit-animation-duration': flySpeed + 's','animation-duration': flySpeed + 's' }"></view>
				<view v-for="(item,index) in flyRightList" class="fly-prize fly-right"
				:style="{ 'background': 'url('+ item.img +')', '-webkit-animation-duration': flySpeed + 's','animation-duration': flySpeed + 's' }"></view>
			</view>
		</view>
		<view class="flex justify-center items-center match-button" @click="showMan">
			<view class="match-btn">
				心动匹配
			</view>
		</view>
    </view>
</template>

<script>
	import utils from '@/utils/utils'
	export default {
		components: {utils},
		data() {
			return {
				show:false,
				randomImg:'/static/imgs/mm1.jpg',
				flyLeftList: [],
				flyCenterList: [],
				flyRightList: [],
				userList:[{img:'/static/imgs/mm1.jpg'},{img:'/static/imgs/mm2.jpg'},{img:'/static/imgs/mm3.jpg'}],
				flySpeed: 25,
				indexRecord: 0,
				intervalTime: 2.5,
				interval: null,
			};
		},
		// 从后台进入前台显示
		onShow() {
			this.flyLeftList=[];
			this.flyCenterList=[];
			this.flyRightList=[];
			this.refreshUser();
		},
		// 从前台进入后台
		onHide() {
			this.flyLeftList=[];
			this.flyCenterList=[];
			this.flyRightList=[];
			clearInterval(this.interval);
		},
		methods:{
			showMan(){
				console.log('========')
				this.show =true
			},
			refreshUser(){
				this.flyInterval();
			},
			flyInterval() {
				if(this.interval != null){
					clearInterval(this.interval);
				}
				var t = this;
				this.pushFlyList(),
				this.interval = setInterval((function() {
					t.pushFlyList()
				}
				), 1e3 * this.intervalTime)
			},
			pushFlyList() {
				var t = 0;
				while (t < 3) {
					this.indexRecord == this.userList.length - 1 ? this.indexRecord = 0 : this.indexRecord++;
					var a = this.userList[this.indexRecord];
						switch (t) {
							case 0:
								this.flyLeftList.push(a);
								break;
							case 1:
								this.flyCenterList.push(a);
								break;
							case 2:
								this.flyRightList.push(a);
								break
						}
					t++	
				}
			},
		}
	}
</script>

<style lang="scss">
page{
	height: 100%;
	background: url('~@/static/imgs/home/bg.png');
}
.match-button{
	background-image: linear-gradient(to top, #c471f5 0%, #fa71cd 100%);
	color: #ffff;
	border-radius: 100rpx;
	padding: 20rpx;
}
.center {
	height: 100%;
	flex: auto;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	//background-color: red;
	
}
@keyframes warn {
	0% {
		transform: scale(0.3);
		-webkit-transform: scale(0.3);
		opacity: 0.0;
	}

	25% {
		transform: scale(0.3);
		-webkit-transform: scale(0.3);
		opacity: 0.1;
	}

	50% {
		transform: scale(0.5);
		-webkit-transform: scale(0.5);
		opacity: 0.3;
	}

	75% {
		transform: scale(0.8);
		-webkit-transform: scale(0.8);
		opacity: 0.5;
	}

	100% {
		transform: scale(1);
		-webkit-transform: scale(1);
		opacity: 0.0;
	}
}

@keyframes warn1 {
	0% {
		transform: scale(0.3);
		-webkit-transform: scale(0.3);
		opacity: 0.0;
	}

	25% {
		transform: scale(0.3);
		-webkit-transform: scale(0.3);
		opacity: 0.1;
	}

	50% {
		transform: scale(0.3);
		-webkit-transform: scale(0.3);
		opacity: 0.3;
	}

	75% {
		transform: scale(0.5);
		-webkit-transform: scale(0.5);
		opacity: 0.5;
	}

	100% {
		transform: scale(0.8);
		-webkit-transform: scale(0.8);
		opacity: 0.0;
	}
}
.container {
	position: relative;
	width: 96px;
	height: 96px;
	/*border: 1px solid #000; hovertree.com */
}
/* 保持大小不变的小圆圈 何问起 */
.dot {
	position: absolute;
	width: 92px;
	height: 92px;
	//left: -2.5px;
    //top: -2.5px;
	-webkit-border-radius: 50%;
	-moz-border-radius: 50%;
	//border: 2px solid red;
	border-radius: 50%;
	z-index: 2;
	animation: msClock 1.8s linear infinite; 
}
@keyframes msClock{ 
	0%,90%,100%{ transform: rotate(0) scale(1);}
	20%,40%{ transform: rotate(-15deg) scale(1.1);}
	30%,50%{ transform: rotate(15deg) scale(1.1);}
}
/* 产生动画(向外扩散变大)的圆圈  */
.pulse {
	position: absolute;
	width: 320px;
	height: 320px;
    left: -120px;
    top: -120px;
	border: 6px solid $dating-color-primary;
	-webkit-border-radius: 50%;
	-moz-border-radius: 50%;
	border-radius: 50%;
	z-index: 1;
	opacity: 0;
	-webkit-animation: warn 2s ease-out;
	-moz-animation: warn 2s ease-out;
	animation: warn 2s ease-out;
	-webkit-animation-iteration-count: infinite;
	-moz-animation-iteration-count: infinite;
	animation-iteration-count: infinite;
	box-shadow: 1px 1px 30px $dating-color-primary;
}

.pulse1 {
	position: absolute;
	width: 320px;
	height: 320px;
    left: -120px;
    top: -120px;
	border: 6px solid $dating-color-primary;
	-webkit-border-radius: 50%;
	-moz-border-radius: 50%;
	border-radius: 50%;
	z-index: 1;
	opacity: 0;
	-webkit-animation: warn1 2s ease-out;
	-moz-animation: warn1 2s ease-out;
	animation: warn1 2s ease-out;
	-webkit-animation-iteration-count: infinite;
	-moz-animation-iteration-count: infinite;
	animation-iteration-count: infinite;
	box-shadow: 1px 1px 30px $dating-color-primary;
}
a{color:blue;text-decoration:none;}
.match-button{
	position: fixed;
	bottom: calc(var(--status-bar-height) + 120rpx);
}
.prize-flying{
	z-index:99;
	width:100px;
	position:absolute;
	bottom:50%;
	left:50%;
	-webkit-transform:translateX(-50%);
	transform:translateX(-50%)
}
.prize-flying .fly-prize {
	text-align:center;
	position:absolute;
	top:100%;
	opacity:0;
	width:39px;
	height:39px;
	background-repeat:no-repeat!important;
	background-size:100% 100%!important;
	border-radius:50%;
	background:#fff;
	padding:7px
}
.showCard {
	z-index:10;
	animation:warn
}

.prize-flying .fly-left {
	left:0;
	z-index:5;
	animation:flyleft-data-v-1a236634
}
.prize-flying .fly-center {
	left:30px;
	z-index:3;
	animation:flycenter-data-v-1a236634
}
.prize-flying .fly-right {
	right:0;
	z-index:5;
	animation:flyright-data-v-1a236634
}

@keyframes flyleft-data-v-1a236634 {
	0% {
		-webkit-transform:scale(0) translateX(0);
		transform:scale(0) translateX(0);
		opacity:.6
	}
	5% {
		-webkit-transform:scale(1) translateX(0) translateY(-80%);
		transform:scale(1) translateX(0) translateY(-80%);
		opacity:.8
	}
	20% {
		opacity:1
	}
	30% {
		opacity:.2
	}
	32% {
		opacity:0;
		visibility:hidden
	}
	50% {
		-webkit-transform:scale(1.9) translateX(-40px) translateY(-340%);
		transform:scale(1.9) translateX(-40px) translateY(-340%)
	}
	100% {
		-webkit-transform:translateX(-100px);
		transform:translateX(-100px)
	}
}

@keyframes flycenter-data-v-1a236634 {
	0% {
		-webkit-transform:scale(0) translateX(0);
		transform:scale(0) translateX(0);
		opacity:.6
	}
	5% {
		-webkit-transform:scale(1) translateX(0) translateY(-80%);
		transform:scale(1) translateX(0) translateY(-80%);
		opacity:.8
	}
	20% {
		opacity:1
	}
	30% {
		opacity:.2
	}
	32% {
		opacity:0;
		visibility:hidden
	}
	34% {
		opacity:0
	}
	50% {
		-webkit-transform:scale(1.9) translateX(0) translateY(-340%);
		transform:scale(1.9) translateX(0) translateY(-340%)
	}
	100% {
		-webkit-transform:translateX(0);
		transform:translateX(0)
	}
}

@keyframes flyright-data-v-1a236634 {
	0% {
		-webkit-transform:scale(0) translateX(0);
		transform:scale(0) translateX(0);
		opacity:.6
	}
	5% {
		-webkit-transform:scale(1) translateX(0) translateY(-80%);
		transform:scale(1) translateX(0) translateY(-80%);
		opacity:.8
	}
	20% {
		opacity:1
	}
	30% {
		opacity:.2
	}
	32% {
		opacity:0;
		visibility:hidden
	}
	34% {
		opacity:0
	}
	50% {
		-webkit-transform:scale(1.9) translateX(40px) translateY(-340%);
		transform:scale(1.9) translateX(40px) translateY(-340%)
	}
	100% {
		-webkit-transform:translateX(100px);
		transform:translateX(100px)
	}
}
</style>

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 是的,我知道。 程序员可以通过多种方式。其中一种方法是,程序员可以自己寻找客户,并根据客户的需求完成相应的开发任务。这种方式通常是通过网络平台、社交媒体或者个人网站来寻找客户。 另一种方法是,程序员可以通过加入自由职业者网站或者加入自由职业者团队,为不同的客户提供开发服务。这种方式通常会提供一定的帮助和支持,帮助程序员寻找客户和完成任务。 无论选择哪种方式,都需要程序员具备良好的技术能力和良好的沟通能力,并且要充分考虑自己的能力和时间,避免承担过多的任务。 ### 回答2: 程序员如何这个问题确实是一个很重要的话题。首先,程序员可以通过以下途径来。 1.建立个人品牌和专业形象:程序员可以在专业社交平台上展示自己的技术能力和项目经验,如GitHub、LinkedIn等。定期发布自己的项目和代码,以建立自己的个人品牌。 2.参加技术社区和动:积极参与技术社区和动,如技术讨论会、行业研讨会等。这将提供机会结识潜在客户和合作伙伴。 3.建立良好的口碑和信誉:通过提供高质量的代码和解决方案,积极与客户沟通和合作,建立良好的口碑和信誉。满足客户需求,并提供优质的售后服务。 4.通过网络平台单:程序员可以注册在一些程序员的网站上,如猪八戒、码市等。这些平台提供了一个集中的市场,可以让程序员找到潜在的项目机会。 5.与设计师和产品经理合作:与设计师和产品经理建立良好的合作关系,跟随他们的项目,受他们的推荐和介绍。他们通常有更多的项目资源,并为程序员提供更多的机会。 6.维护好现有客户关系:通过给现有客户提供更多的增值服务,拓展他们的业务需求,并保持良好的沟通,维持好现有的客户关系。好的客户口碑和推荐,将帮助程序员到更多的。 在的过程中,程序员应当明确自己的技术范围和能力,并选择适合自己的项目。同时,合理安排时间和资源,设定合理的价格和工期,以保证完成高质量的工作。 总之,程序员需要建立个人品牌、参与社区和动、建立好口碑和信誉、通过网络平台单、与设计师和产品经理合作、并维护好现有客户关系,以获得更多机会。同时,要始终保持专业性和高质量的工作,以赢得客户的信任和口碑。 ### 回答3: 程序员是指在个人时间或业余时间,受他人或企业的个人编程项目或任务。下面是程序员的一般步骤和方法: 1. 个人技术准备:作为程序员,首先需要具备良好的编程技术和相关领域的知识,并不断学习和提升自己的技能水平,以应对不同的项目需求。 2. 建立个人品牌和口碑:在之前,可以通过开源项目、技术博客、社交媒体等方式展示个人的技术实力和专业素养,吸引潜在客户的关注,并积累良好的口碑。 3. 寻找项目机会:可以通过多种渠道找到项目,如在技术社区、论坛、招聘网站发布自己的技术能力和需求,并积极参与社区讨论和技术交流,结识潜在客户。 4. 确定需求和报价:与客户沟通明确项目需求,了解时间要求、功能要求和预算等因素,并根据项目的复杂度和工作量进行报价。 5. 签订合同和支付方式:在项目开始前与客户签订合同,明确双方的权责和项目交付标准,并商定付款方式和进度。 6. 开展项目工作:根据项目需求,合理规划工作进度,按时完成各个阶段的任务,并与客户保持沟通,及时解决问题和反馈进展情况。 7. 进行测试和修复:完成项目后进行测试和调试,确保软件的稳定性和可靠性,并根据客户的反馈进行必要的修复和改进。 8. 项目交付和售后支持:按照合同规定将项目交付给客户,并提供相应的文档和培训,确保客户能够顺利使用。在项目后期,提供必要的售后支持和维护服务。 尽管可以获得额外的收入和个人技术成长,但需要注意合理规划时间、合法合规操作,并与客户保持良好的沟通和合作关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶人超有料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值