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

申明:

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

网易的轮播特别的处所就在于,假如你滑动不相邻的两张图片,其过渡结果并非滑动过渡,而是一个跳出过渡,此方面道理与最最先设想轮播排版时刻有极大关联。

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

此轮播为纯react环境下的es6写法,经由过程对state中数组的重组分列,合营款式。到达轮播的结果

无任何依靠,终究结果为封装成react组件开放接口并宣布出去

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

一、搭建架构

此方面的文章应当许多,我就没必要过量引见,去github上找个react脚手架搭建一下基本项目框架即可。

我用的框架为改进过的一版本dva框架。react脚手架,github上许多,引荐本身挑选一款举行改进,我用的并不一定合适你。

二、预备材料

1.大于4张尺寸雷同图片。(本工资八张图片定名1-8)
2.react环境
3.网易云PC播放器

三、开辟

先把首张图片和摆布两侧能看见的图片位置摆好,
最最先的静态构造是这个模样的
新手注重:如发明代码扎眼,less、es6语法自行恶补

import React from 'react';

import styles from './Slide.less';

class Slide extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      dir: [
        { name: 'middle' },
        { name: 'start' },
        { name: 'normal' },
        { name: 'normal' },
        { name: 'normal' },
        { name: 'normal' },
        { name: 'normal' },
        { name: 'end' },
      ],
    };
  }
  render() {
    const { dir } = this.state;
    return (
      <div key={key} className={styles.root}>
        {/* 外部容器*/}
        <div className={styles.slideBox}>
          {/* 内部轮回*/}
          {
            dir.map((item, key) => {
              return (
                <div className={`${styles.slide} ${styles[item.name]}`}> // 此处偷懒
                  <img src={`./images/${key + 1}.png`} // 此处偷懒 alt="./images/404.png" />
                  <div // 蒙板
                    className={styles.masking}
                  >{''}</div>
                </div>
              );
            })
          }
        </div>
      </div>
    );
  }
}

export default Slide;

less以下

.root{
  width: 100%;
  background: #ccc;
  .slideBox{
    width: 50%;
    height: 15vw;
    margin: 0 auto;
    position: relative;
    background: #ccc;
    .slide{
      position: absolute;
      img{
        width: 100%;
      }
      .masking{ // 蒙板,有个灰度渐变的结果
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, .15);
      }
      &.middle{ // 此为中心展现的那张
        left: 10%;
        bottom: 0%;
        width: 80%;
        z-index: 33;
      }
      &.start{ // 第一张则为左边那张
        left: 0%;
        bottom: 0%;
        width: 75%;
        z-index: 22;
        }
      &.end{ // 末了一张及右边那张
        right: 0%;
        bottom: 0%;
        width: 75%;
        z-index: 22;
      }
      &.normal{ // 此为隐蔽图片的款式
        left: 13%;
        bottom: 0%;
        width: 74%;
        z-index: 11;
      }
    }
  }
}

如许最最先的位置就摆好了。
《网易音乐版轮播-react组件版本》
隐蔽图片的位置很主要,由于上面也说了,跨图片滑动时须要改成跳出结果。大概在以下位置,展现的那张图片圆满的将其盖住。

《网易音乐版轮播-react组件版本》
接下来,举行事宜增加。我们先不论轮播下方的一排导航点。先加上摆布点击操纵。

在蒙板层加上onClick操纵,(也能够加在slide层) 以下:

<div
    className={item.name === 'middle' ? '' : styles.masking}
    onClick={() => this.slide(item.name, key)}
>{''}</div>

点击图片时的要领

slide(name, key) {  // 图片点击逻辑
    // 纪录当前节点
    this.setState({ current: key });
    // 数组操纵要领
    this.imgArr(name);
  }

数组操纵要领

imgArr(name) { // 数组处置惩罚
    let dirCopy = this.state.dir;
    if (name === 'start') {  // 点击左边那张
      const pop = dirCopy.pop(); // 从数组尾部弹出一个元素
      dirCopy.unshift(pop); // 尾部元素增加到数组头部
    } else if (name === 'end') { // 点击右边那张
      const shift = dirCopy.shift(); // 从数组头部弹出一个元素
      dirCopy.push(shift);  // 增加到数组尾部
    }
    this.setState({ dir: dirCopy }); // 保存从新分列的数组 并触发render
}

过渡款式增加

1.过渡款式主要有扭转时,蒙版层的渐变。

2.扭转时腻滑的定位过渡。

3.扭转时层级的变化放在优化环节零丁解说。

.slide{
    ... , // 此处为原款式保存的意义(下面都以此划定规矩显现)
    transition: all 0.3s ease-in-out;
    user-select: none; // 制止用户选中(防备图片被选中时变色);
    &:hover{ // 鼠标经由期显现小手款式
      cursor: pointer;
    }
}
.masking{
    ... ,
    transition: all 0.3s 0.2s linear;
}
&.middle{
    ... ,
    .masking{
      background: transparent;
    }
}

这个模样的话点击图片摆布两侧时就能够开端扭转起来了。

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

到此为止的步骤所完成的款式轮播为最基本的‘扭转木马es6版本’,有须要的朋侪已能够在以上代码中举行优化总结,放在本身的项目中去。

菜单按钮开辟

动态的依据图片的数目轮回出菜单按钮的数目,代码跟图片轮回相似。

<div className={styles.slideBox}>
  ... ,
  {/* 导航按钮*/}
  <div className={styles.point}>
    {
      this.state.dir.map((item, key) => { // 依据图片数目举行轮回
        return (
          <span
            key={key}
            className={item.name === 'start' ? styles.hover : ''} // 赋予当前显现的按钮款式变化
            onMouseEnter={() => this.pointFunc(key - 1)} // 鼠标进入动画
          >{}</span>
        );
      })
    }
  </div>
</div>

款式方面:

  .point{
    width: 100%;
    position: absolute;
    left: 0;
    bottom: -23px;
    z-index: 999;
    text-align: center;
    span{
      display: inline-block;
      width: 20px;
      height: 3px;
      background-color: #2E3033;
      margin-left: 9px;
      &.hover{
        background-color: #7F8082;
      }
      &:hover{
        cursor: pointer;
      }
    }
  }

鼠标进入要领pointFunc();

  pointFunc(index) { // 按钮点击
    const { current } = this.state;
    const dirCopy = this.state.dir;
    if (index < current) { // 鼠标经由左边的按钮
      for (let i = 0; i < (current - index); i += 1) { // 推断间隔
        const shift = dirCopy.shift(); // 举行数组操纵
        dirCopy.push(shift);
      }
    } else if (index > current) { // 鼠标经由右边的按钮
      for (let i = 0; i < (index - current); i += 1) {
        const pop = dirCopy.pop();
        dirCopy.unshift(pop);
      }
    }
    this.setState({ dir: dirCopy }); // 触发react-render从新衬着页面
    this.setState({ current: index }); // 纪录当前图片节点
  }

加完按钮图片后结果以下:

《网易音乐版轮播-react组件版本》
这个时刻,中心结果已出来了,经由严谨的规划和动画调治后,终究到达了预期的网易播放器的特别动画结果。(鼠标经由相邻的图片时为滑动,经由不相邻图片按钮的时刻改成跳动结果)。

代码结果

《网易音乐版轮播-react组件版本》
注:款式方面另有须要优化的处所请自行调治

总结

在这个组件情势开辟时期,假如你做的东西不能保存下来而且开放出去,我认为是一件可悲的事变。所以下一篇文章将把此react组件举行开放式处置惩罚,开放一些可调治接口、相应式处置惩罚,而且末了打包成npm包,以插件的情势开放出去。

    原文作者:也还不够黑丶
    原文地址: https://segmentfault.com/a/1190000013359078
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞