uniapp 仿网易云黑胶会员等级页面顶部旋转

先看成品:

最近写项目碰到一个这样的需求,就是上面的等级需要跟着下面轮播旋转,轮播走到七级那么顶部等级也要旋转到七级的点上

刚一开始打算把所有的等级都手写一套然后挨个调旋转角度以及位置,写到五级就放弃了,太费劲而且兼容性太差了,就索性让ui且了一张大图,把整个圆都切进来了。然后只需要在轮播的时候用transform:rotate()更改图片的旋转角度就可以了

<template>
	<view class="content">
		<view class="Box">
			<view class="leftShadow Shadow"></view>
			<view class="rightShadow Shadow"></view>
			<image src="@/static/2223d0fbb335983dc1bd41dd75a3144.png" class="dotBox" :style="dynamicStyles"></image>
			<image src="@/static/yellow.png" class="dotBox" :style="dynamicStylesYellow"></image>
			<image src="@/static/whiteDot.png" class="dotBox" :style="dynamicStylesWhite" v-show="nowLV!=nowLinLV"></image>
		</view>
		<swiper class="swiper buttonTN" @transition='transition' @animationfinish="change" :current='nowLV' easing-function='linear' duration='200'>
			<swiper-item>
				<view class="swiper-item uni-bg-red">A</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-green">B</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-blue">C</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-red">D</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-green">E</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-blue">F</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-red">G</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-green">H</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-red">I</view>
			</swiper-item>
			<swiper-item>
				<view class="swiper-item uni-bg-green">J</view>
			</swiper-item>
		</swiper>
	</view>
</template>
<style lang="scss" scoped>
	page{
		background-color: #000;
	}
	
	.content{
		position: relative;
		.leftShadow{
			left: 0;
			transform:rotate(45deg)
		}
		.rightShadow{
			right: 0;
			transform:rotate(-45deg)
		}
		.Shadow{
			z-index: 1;
			height: 100vh;
			width: 1px;
			box-shadow: 0px 0px 80px 120px #000;
			position: absolute;
			top: -100vh;
		}
	}
	
	.dotBox{
		display: flex;
		justify-content: space-around;
		transition:0.2s;
		width: 300vw;
		height: 300vw;
		position: absolute;
		left: 50%;
		top: -330vw;
		margin-left: -150vw;
	}
	.buttonTN{
		margin-top: 50vh;
		.uni-bg-red{
			background-color: red;
		}
		.uni-bg-green{
			background-color: green;
		}
		.uni-bg-blue{
			background-color: blue;
		}
		.swiper-item {
			display: block;
			height: 300rpx;
			line-height: 300rpx;
			text-align: center;
		}
	}
</style>

但是有细心的人就发现了,当前等级的点和当前选中的点以及未选中的点样式都是不一样的,而且还得跟着大圆进行旋转,并且轮播走完之后与轮播对应的点还得回到中间

处理方法也很简单,让ui把两个点的图切成和大圆一样大,然后让这三张图重合,旋转角度跟着大图走就行

<script>
	export default {
		data() {
			return {
				rotateAB:0,    //大圆的旋转角度
				rotateABC:0,    //当前等级点的旋转角度
				rotateABCD:0,    //当前选中的旋转角度
				nowLV:5,    //当前等级
				nowLinLV:5,    //当前选中
			}
		},
		components: {
		},
		computed: {
		    dynamicStyles() {
		      return {
				transform:'rotate('+this.rotateAB+'deg)'
		      };
		    },
			dynamicStylesYellow() {
			  return {
				transform:'rotate('+this.rotateABC+'deg)'
			  };
			},
			dynamicStylesWhite() {
			  return {
				transform:'rotate('+this.rotateABCD+'deg)'
			  };
			},
		  },
		onShow() {
				this.rotateAB = (this.nowLV*10)    //使大圆的当前等级处于最中间
		},
		methods: {
			transition(e){    //当轮播被拖动的时候使三个点一起移动
				this.rotateAB+=e.detail.dx/3600
				this.rotateABC+=e.detail.dx/3600
				this.rotateABCD+=e.detail.dx/3600
			},
			change(e){    //当轮播更改的时候使三个点的位置发生变化
				this.nowLinLV=e.detail.current
				this.rotateAB=(e.detail.current)*10    //大圆旋转只需要加上当前轮播的索引*夹角
				this.rotateABC=(e.detail.current-this.nowLV)*10    //当前等级点需要当前轮播索引减去当前等级再乘以夹角才是需要旋转的角度
				this.rotateABCD=0    //选中点直接清除旋转角度
			},
		}
	}
</script>

总结:核心内容就是需要知道两等级点到圆心夹角,然后旋转的时候再用轮播索引乘夹角就得到要旋转的角度了

其次,ui不愿意切图的话自己手写也是一样的道理,但是写角度的话非常费劲

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要实现黑胶唱片播放机,我们需要先了解黑胶唱片播放机的外观和典型的元素,例如唱片盘、扬声器、音调控制、音量控制和播放暂停控制等。然后,我们需要用HTML创建一个类似的页面,包括所有必需的元素。 接下来,我们需要使用CSS对页面和元素进行布局和样式化。我们可以使用CSS的flexbox和grid属性来实现响应式的布局,使页面在不同大小的屏幕上都能呈现出好看的效果。我们还需要使用CSS的背景、边框、字体和颜色等属性来样式化每个元素。 除此之外,我们需要使用JavaScript来控制播放器的操作,例如点击播放暂停按钮时的相应事件,唱片旋转的动画效果。我们还可以使用CSS的动画属性来优化唱片旋转的效果。 总的来说,实现一个黑胶唱片播放器需要HTML、CSS和JavaScript的配合实现。我们需要注意页面布局的响应性和元素样式的细节,以及JS部分的事件处理和动画设计。 ### 回答2: HTML和CSS是网页设计中最常用的两个语言,其结合可以实现丰富的交互效果和美观的页面。在本文中,我们将介绍如何利用HTML和CSS实现一个黑胶唱片播放机。 首先,我们需要在HTML中定义整个页面的基本结构,包括页面头部信息、导航栏、主体内容和底部版权信息。可以使用HTML5的语义标签来创建这些基本结构,例如<header>、<nav>、<main>和<footer>等标签。 对于黑胶唱片播放机这个应用,我们需要一个播放器区域和一个控制面板。可以使用<div>标签来定义这两个区域,并设置它们的样式。播放器区域可以使用一个<img>标签来插入唱片封面图,并用CSS设置其大小、位置和旋转角度,以模拟唱片播放的效果。控制面板可以使用一组<button>按钮来实现控制功能,例如播放、停止、快进和倒带等。 其中,CSS样式是实现黑胶唱片播放机的关键。可以利用CSS3的伪元素和动画效果来模拟唱片转盘、唱针和指针的效果。例如,可以使用<before>和<after>伪元素来创建唱针和指针,并设置其位置和旋转角度,以实现唱针盘旋转和播放进度的显示。同时,使用@keyframes和animation属性来实现动画效果,例如唱片旋转、唱针移动和指针跳动等。 在CSS样式中,需要注意使用合适的选择器和属性,以确保样式的准确和可读性。同时,为了提高页面的响应速度和兼容性,需要合理使用CSS预处理器和前缀自动补全等开发工具,以优化页面的性能和可维护性。 总之,使用HTML和CSS可以实现一个简单而又有趣的黑胶唱片播放机,同时也可以提升我们的前端技能和创造力。 ### 回答3: 黑胶唱片播放机作为一种经典的音乐播放器,不仅具有功能性,还能为用户带来独特的视听体验。实现黑胶唱片播放机的关键在于设计出一个逼真的界面,而HTML和CSS正是用于此目的的两个重要工具。 首先,我们需要构建黑胶唱片播放机框架。可以在HTML中使用div元素创建播放机容器,然后在其中分别创建黑胶唱片和播放控制区域。黑胶唱片可以用一个圆形的div元素表示,给它添加一张黑色背景图片即可。播放控制区域可以用一些按钮元素表示,如播放、暂停、下一曲等。我们可以设置容器和元素的宽度、高度、边框、背景等样式属性,让它们看起来更加真实。 接下来,我们需要使用CSS来为黑胶唱片添加旋转效果。可以通过CSS3中的旋转动画实现这一效果。我们可以使用CSS的@keyframes规则来定义旋转动画,然后为黑胶唱片元素添加动画属性。在播放时,我们只需要通过JavaScript修改黑胶唱片元素的属性值,使其旋转起来即可。 除了旋转动画,我们还可以为黑胶唱片播放机添加更多的动画效果,比如光盘转动、唱针移动等。可以通过CSS的过渡属性来实现这些动画效果,并通过JavaScript来控制其开始和结束。 最后,我们需要添加音乐文件,并使用JavaScript来控制播放功能。可以在HTML中添加一个audio元素,并为其设置src属性以加载音乐。然后在JavaScript中通过调用audio元素的方法来控制播放、暂停、跳转等功能。可以为播放控制区域的按钮元素添加单击事件,当用户单击按钮时,调用相应的JavaScript方法即可实现对音乐的控制。 综上所述,HTML和CSS可以为黑胶唱片播放机提供精美的界面设计,而JavaScript则可以实现播放功能和控制动画效果。通过合理地组合这些元素,我们可以实现一个逼真的黑胶唱片播放机,为用户带来更加真实的音乐体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值