Поддельная облачная музыкальная карусель NetEase

Vue.js

В эти дни я был занят выпускным оформлением.На одну из страниц нужно поместить изображение карусели.Потом я слушал музыку и искал(чао)чтобы найти(си)дух(ан)чувство(ли),и вдруг нашел оригинальный клиент NetEase Cloud Music. Картинка-карусель очень красивая, поэтому я попытался сымитировать ее. Хотя это очень просто, мне повезло, что я сделал первый шаг.

окончательный эффект:

(Почему гифка такая маленькая? 😭 )

Позвольте мне дать вам скриншот:

Я использовал фреймворк Vue+less, чтобы написать эту карусельную карту.Одна из сложностей здесь - угол между левой и правой картинками.Поскольку я новичок, я некоторое время возился с этим.Надеюсь, боги не не смейся над этим~

ладно, не много ерунды, давайте к делу: Каждый должен знать принцип изображения карусели, поэтому позвольте мне повторить его еще раз (23333).Предположим, есть 6 изображений, расположите 6 изображений слева и оберните контейнером списка, поэтому ширина списка будет очень большой , тогда список имеет родительский контейнер div, ширина div равна размеру изображения, а его переполнение установлено как скрытое, где положение div является относительным, положение списка является абсолютным, и, наконец, изображение реализуется путем регулировки левого значения переключателя отображения списка.

html (шаблон шаблона) код:

Предварительный меньше кода:

.slider {
    position: relative;
    margin: 0 auto;
    width: 468px;
    height: 200px;
    overflow: hidden;
    ul {
      position: absolute;
      padding: 0;
      width: 2808px;
      li {
        float: left;
        list-style: none;
        z-index: 3;
        img {
          width: 468px;
          border-radius: 3px;
        }
      }
    }
  }

После того, как стиль карусели в середине написан, начните писать картинки слева и справа.Здесь нам нужно использовать свойство перспективы и css-функцию rotate().

perspectiveВид, используемый для установки позиции просмотра элемента.Следует отметить, что когда элемент определяет атрибут перспективы, его дочерние элементы получат эффект перспективы, а не сам элемент, поэтому нам нужно определить атрибут перспективы для родительского элемента. контейнер левого и правого изображений. Кроме того, в настоящее время ни один из браузеров не поддерживает атрибут перспективы 😅 , но Chrome и Safari поддерживают альтернативный атрибут -webkit-perspective 😜 , затем установите transform: rotate() для левого и правого изображений, чтобы создать 2D-вращение, регулируя значения угла в перспективе и повороте, Вы можете добиться эффекта изображений на левой и правой сторонах музыкальной карусели NetEase Cloud.

Меньше кода для левого и правого изображений:

.around {
    perspective: 200;
    -webkit-perspective: 200;
    cursor: pointer;
    .pre {
      position: absolute;
      height: 136px;
      top: 31px;
      left: 300px;
      border-top-left-radius: 3px;
      border-bottom-left-radius: 3px;
      transform: rotateY(7deg);
    }
    .next {
      position: absolute;
      height: 136px;
      top: 31px;
      left: 766px;
      border-top-right-radius: 3px;
      border-bottom-right-radius: 3px;
      transform: rotateY(-7deg);
    }
  }

Наконец, поставьте маленькую точку под изображением карусели, чтобы пользователи могли щелкнуть, чтобы перейти к указанному изображению:

.pointer {
    display: flex;
    justify-content: center;
    font-size: 20px;
    line-height: 20px;
    color: gray;
    cursor: pointer;
    :first-child {
      color: orange;
    }
    li {
      margin-right: 2px;
    }
  }

Таким образом записывается стиль изображения карусели, а затем пришло время написать js для реализации автоматического воспроизведения, переключения влево и вправо и нажатия на точку для прыжка. Логика здесь довольно простая, поэтому я не буду описывать их по порядку, мы в основном обращаем внимание на два критических момента Текущая картинка — это отображение левой и правой картинок и логика нажатия и переключения в двух случаях первой картинки и последней картинки.

js-код:

created () {
    // 初始化小圆点的个数;
    this.pointer.length = 6
    // 设置定时器;
    setInterval(() => {
      this.replace(true)
    }, 3000)
  },
  methods: {
    replace (right, pointer) {
      // 每次调用 replace 方法时,将之前橙色的小圆点 color 改成灰色;
      this.$refs.pointer[this.index].style.color = 'gray'
      // 通过传进来的第一个参数判断是向左还是向右切换;
      this.index = right ? this.index += 1 : this.index -= 1
      /**  如果有传第二个参数,即点击了小圆点,更改当前 index
           因为点击第一个小圆点时传进来的 pointer 为 0,会被判为 false,
           所以在点击圆点传参数时增加了 1,之后在赋值给 index 时需减去; **/
      if (pointer) this.index = pointer - 1
      // 实现主轮播图的 “无限循环”;
      if (this.index > 5) {
        this.index = 0
      } else if (this.index < 0) {
        this.index = 5
      }
      // 实现左右两侧图片的循环;
      if (this.index === 0) {
        this.$refs.pre.src = this.slider[5].src
        this.$refs.next.src = this.slider[this.index + 1].src
      } else if (this.index === 5) {
        this.$refs.pre.src = this.slider[this.index - 1].src
        this.$refs.next.src = this.slider[0].src
      } else {
        this.$refs.pre.src = this.slider[this.index - 1].src
        this.$refs.next.src = this.slider[this.index + 1].src
      }
      // 给当前图片对应的小圆点 “上色”;
      this.$refs.pointer[this.index].style.color = 'orange'
      // 移动 list 的位置,即更换当前显示图片;
      this.$refs.list.style.left = -(this.index * 468) + 'px'
    }
  }

Эпилог

На данный момент завершена упрощенная версия карусельной карты NetEase. Есть некоторые недостатки. Автор также старается изо всех сил ее улучшить. После того, как мы войдем в интерфейс, нам еще предстоит пройти долгий путь. надеюсь подбодрить вас вместе с вами ~ Конечно, если эта статья немного вдохновила вас, вы можете поставить лайк или добавить ее в закладки, это будет моей большей мотивацией 😊 .