资讯专栏INFORMATION COLUMN

网易音乐版轮播-react组件版本

赵春朋 / 623人阅读

摘要:说明此版本轮播图为仿照网易云音乐播放器上首页的轮播。网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播排版时候有极大关联。

说明:

此版本轮播图为仿照网易云音乐PC播放器上首页的轮播。

网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播排版时候有极大关联。

此轮播为纯react环境下的es6写法,通过对state中数组的重组排列,配合样式。达到轮播的效果

无任何依赖,最终效果为封装成react组件开放接口并发布出去

注:此文章为正推,并在开发完成后进行总结优化。

一、搭建架构

此方面的文章应该很多,我就不必过多介绍,去github上找个react脚手架搭建一下基本项目框架即可。

我用的框架为改良过的一版本dva框架。react脚手架,github上很多,推荐自己选择一款进行改良,我用的并不一定适合你。

二、准备材料

1.大于4张尺寸相同图片。(本人为八张图片命名1-8)
2.react环境
3.网易云PC播放器

三、开发

先把首张图片和左右两侧能看见的图片位置摆好,
最开始的静态结构是这个样子的
新手注意:如发现代码刺眼,less、es6语法自行恶补

</>复制代码

  1. import React from "react";
  2. import styles from "./Slide.less";
  3. class Slide extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. dir: [
  8. { name: "middle" },
  9. { name: "start" },
  10. { name: "normal" },
  11. { name: "normal" },
  12. { name: "normal" },
  13. { name: "normal" },
  14. { name: "normal" },
  15. { name: "end" },
  16. ],
  17. };
  18. }
  19. render() {
  20. const { dir } = this.state;
  21. return (
  22. {/* 外部容器*/}
  23. {/* 内部循环*/}
  24. {
  25. dir.map((item, key) => {
  26. return (
  27. // 此处偷懒
  28. {""}
  29. );
  30. })
  31. }
  32. );
  33. }
  34. }
  35. export default Slide;

less如下

</>复制代码

  1. .root{
  2. width: 100%;
  3. background: #ccc;
  4. .slideBox{
  5. width: 50%;
  6. height: 15vw;
  7. margin: 0 auto;
  8. position: relative;
  9. background: #ccc;
  10. .slide{
  11. position: absolute;
  12. img{
  13. width: 100%;
  14. }
  15. .masking{ // 蒙板,有个灰度渐变的效果
  16. position: absolute;
  17. left: 0;
  18. top: 0;
  19. width: 100%;
  20. height: 100%;
  21. background: rgba(0, 0, 0, .15);
  22. }
  23. &.middle{ // 此为中间展示的那张
  24. left: 10%;
  25. bottom: 0%;
  26. width: 80%;
  27. z-index: 33;
  28. }
  29. &.start{ // 第一张则为左侧那张
  30. left: 0%;
  31. bottom: 0%;
  32. width: 75%;
  33. z-index: 22;
  34. }
  35. &.end{ // 最后一张及右侧那张
  36. right: 0%;
  37. bottom: 0%;
  38. width: 75%;
  39. z-index: 22;
  40. }
  41. &.normal{ // 此为隐藏图片的样式
  42. left: 13%;
  43. bottom: 0%;
  44. width: 74%;
  45. z-index: 11;
  46. }
  47. }
  48. }
  49. }

这样最开始的位置就摆好了。

隐藏图片的位置很重要,因为上面也说了,跨图片滑动时需要改成跳出效果。大概在如下位置,展示的那张图片完美的将其挡住。


接下来,进行事件添加。我们先不管轮播下方的一排导航点。先加上左右点击操作。

</>复制代码

  1. 在蒙板层加上onClick操作,(也可以加在slide层) 如下:

</>复制代码

  1. this.slide(item.name, key)}
  2. >{""}

点击图片时的方法

</>复制代码

  1. slide(name, key) { // 图片点击逻辑
  2. // 记录当前节点
  3. this.setState({ current: key });
  4. // 数组操作方法
  5. this.imgArr(name);
  6. }

数组操作方法

</>复制代码

  1. imgArr(name) { // 数组处理
  2. let dirCopy = this.state.dir;
  3. if (name === "start") { // 点击左侧那张
  4. const pop = dirCopy.pop(); // 从数组尾部弹出一个元素
  5. dirCopy.unshift(pop); // 尾部元素添加到数组头部
  6. } else if (name === "end") { // 点击右侧那张
  7. const shift = dirCopy.shift(); // 从数组头部弹出一个元素
  8. dirCopy.push(shift); // 添加到数组尾部
  9. }
  10. this.setState({ dir: dirCopy }); // 保存重新排列的数组 并触发render
  11. }

过渡样式添加

</>复制代码

  1. 1.过渡样式主要有旋转时,蒙版层的渐变。
    2.旋转时平滑的定位过渡。
    3.旋转时层级的变化放在优化环节多带带讲解。

</>复制代码

  1. .slide{
  2. ... , // 此处为原样式保留的意思(下面都以此规则显示)
  3. transition: all 0.3s ease-in-out;
  4. user-select: none; // 禁止用户选中(防止图片被选中时变色);
  5. &:hover{ // 鼠标经过时显示小手样式
  6. cursor: pointer;
  7. }
  8. }

</>复制代码

  1. .masking{
  2. ... ,
  3. transition: all 0.3s 0.2s linear;
  4. }

</>复制代码

  1. &.middle{
  2. ... ,
  3. .masking{
  4. background: transparent;
  5. }
  6. }

这个样子的话点击图片左右两侧时就可以初步旋转起来了。

到此为止的步骤所完成的样式轮播为最基础的‘旋转木马es6版本’,有需要的朋友已经可以在以上代码中进行优化总结,放在自己的项目中去。

菜单按钮开发

动态的根据图片的数量循环出菜单按钮的数量,代码跟图片循环类似。

</>复制代码

  1. ... ,
  2. {/* 导航按钮*/}
  3. {
  4. this.state.dir.map((item, key) => { // 根据图片数量进行循环
  5. return (
  6. this.pointFunc(key - 1)} // 鼠标进入动画
  7. >{}
  8. );
  9. })
  10. }

样式方面:

</>复制代码

  1. .point{
  2. width: 100%;
  3. position: absolute;
  4. left: 0;
  5. bottom: -23px;
  6. z-index: 999;
  7. text-align: center;
  8. span{
  9. display: inline-block;
  10. width: 20px;
  11. height: 3px;
  12. background-color: #2E3033;
  13. margin-left: 9px;
  14. &.hover{
  15. background-color: #7F8082;
  16. }
  17. &:hover{
  18. cursor: pointer;
  19. }
  20. }
  21. }

鼠标进入方法pointFunc();

</>复制代码

  1. pointFunc(index) { // 按钮点击
  2. const { current } = this.state;
  3. const dirCopy = this.state.dir;
  4. if (index < current) { // 鼠标经过左侧的按钮
  5. for (let i = 0; i < (current - index); i += 1) { // 判断距离
  6. const shift = dirCopy.shift(); // 进行数组操作
  7. dirCopy.push(shift);
  8. }
  9. } else if (index > current) { // 鼠标经过右侧的按钮
  10. for (let i = 0; i < (index - current); i += 1) {
  11. const pop = dirCopy.pop();
  12. dirCopy.unshift(pop);
  13. }
  14. }
  15. this.setState({ dir: dirCopy }); // 触发react-render重新渲染页面
  16. this.setState({ current: index }); // 记录当前图片节点
  17. }

加完按钮图片后效果如下:


这个时候,核心效果已经出来了,经过严谨的布局和动画调节后,最终达到了预期的网易播放器的特殊动画效果。(鼠标经过相邻的图片时为滑动,经过不相邻图片按钮的时候改为跳动效果)。

代码效果


注:样式方面还有需要优化的地方请自行调节

总结

在这个组件模式开发时代,如果你做的东西不能保留下来并且开放出去,我认为是一件可悲的事情。所以下一篇文章将把此react组件进行开放式处理,开放一些可调节接口、响应式处理,并且最后打包成npm包,以插件的形式开放出去。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/115686.html

相关文章

  • 网易乐版轮播-react组件版本

    摘要:说明此版本轮播图为仿照网易云音乐播放器上首页的轮播。网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播排版时候有极大关联。 说明: 此版本轮播图为仿照网易云音乐PC播放器上首页的轮播。 网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播...

    whidy 评论0 收藏0
  • 网易乐版轮播-react组件版本

    摘要:说明此版本轮播图为仿照网易云音乐播放器上首页的轮播。网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播排版时候有极大关联。 说明: 此版本轮播图为仿照网易云音乐PC播放器上首页的轮播。 网易的轮播特殊的地方就在于,如果你滑动不相邻的两张图片,其过渡效果并不是滑动过渡,而是一个跳出过渡,此方面原理与最开始设计轮播...

    Tikitoo 评论0 收藏0
  • 用Vue高仿qq音乐官网-pc端

    摘要:目前只用到和音乐的轮播图不用说,音乐这个网站的页面我是真的挺喜欢,不光是他的设计,页面的布局也很美观,在控制台调试的时候可以看看它的结构,非常有层次而富有美感,即使加上一层也不会有违和感。由于安全原因,跨域访问是被各大浏览器所默认禁止的。 一直想做一个vue项目 然后呢 我就做了 效果预览 部分地方不全部根据原版,也有自由发挥的,目前功能模块比较简陋,如果加载太慢,可以下载下来再本地运...

    andot 评论0 收藏0
  • React Native 模仿网易音乐手机客户端,兼容安卓和IOS两个平台

    摘要:比如安卓平台在中不能触屏手动滚动。主要的功能界面模块大部分主要是展示的,网易云的页面和功能实在是太多了,由于时间关系,并没有把所有的功能都做完整,后续会陆续加上其他的功能。各部分模块首页展示音乐播放,包括动画,歌词同步等。 React Native 模仿网易云音乐手机客户端,兼容安卓和IOS两个平台。 GitHub 完整源码地址https://github.com/yezihaohao...

    妤锋シ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<