Нативный JS реализует подключаемый модуль бесшовной карусели (поддерживает vue)

внешний интерфейс GitHub JavaScript Vue.js

Плагин карусели (Broadcast.js)

Предисловие: Причина написания этого плагина

  • Некоторое время назад я собирался использовать Vue плюс интерфейс nodejs NetEase Cloud для имитации мобильного терминала NetEase Cloud Music. Я не использовал компоненты пользовательского интерфейса, потому что хотел сам написать весь код и усилить свой гибкий макет. Что касается карусельной части, я изначально написал это в vue, но обнаружил, что всегда есть ошибки, поэтому я планировал инкапсулировать плагин для достижения этой цели.
  • Вторая причина заключается в том, что я думал, что использовал Vue для изучения Vue в этом семестре, и обнаружил, что нативный JS, который я изучал раньше, был немного забыт, поэтому я хотел воспользоваться этой возможностью, чтобы снова просмотреть JS.

Функции

  • Никаких ссылок на сторонние библиотеки плагинов, нативный js, инкапсуляция объекта Broadcast, расширение этого объекта, только более 190 строк кода.
  • В настоящее время основными реализациями являются: плавная карусель, автоматическое воспроизведение, левая и правая кнопки на стороне ПК для переключения и жесты мобильного терминала для переключения.
  • Я сам написал несколько базовых стилей css, и на их основе я могу модифицировать их под свои любимые стили.

Отображение интерфейса и использование

  • Отображение на ПК:

    PC端演示

  • Мобильный дисплей:

    移动端演示gif

Usage

нормальная ссылка на страницу

  1. Скопируйте репозиторий github ниже,src/jsпод файломbroadcast-me.jsпоместите его в файл проекта

  2. Скопируйте репозиторий github ниже,src/cssпод файломbroadcast-me.cssпоместите его в файл проекта

  3. Разместите на странице:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <!-- 引入插件的css文件 -->
      <link rel="stylesheet" href="./css/broadcast-me.css">
    </head>
    <body>
      <!-- 引入插件的js文件 -->
      <script src="./js/broadcast-me.js"></script>
    </body>
    </html>
    
  4. Позже, если вам понадобится карусель, реализуйте этот объект:

    var box = document.getElementById('box');
    var imagesAndUrl = [{
      imgSrc : './img/1.jpg',
      linkHref : "#"
    },{
      imgSrc : './img/2.jpg',
      linkHref : '1'
    },{
      imgSrc : './img/3.jpg',
      linkHref : '#'
    },{
      imgSrc : './img/4.jpg',
      linkHref : '#'
    },{
      imgSrc : './img/5.jpg',
      linkHref : '#'
    }];
    // box => 你需要创建轮播图的父级元素
    // imagesAndUrl => 数组,存放图片地址以及图片的连接地址
    var broadcast = new Broadcast(box,imagesAndUrl,{
          transitionTime : 800, // 动画过渡时间,默认为800ms
          intervalTime : 5000 // 图片切换时间,默认为5s
     });
    

Ссылки в Vue

  1. используется в vue, вbroadcast-me.jsВ конце файла добавьте:
// 向外界暴露Broadcas对象
module.exports = Broadcast;
  1. В компоненте, который должен использовать карусель, вводим наш файл

    vue中使用此框架

  2. В файле шаблона используйте пользовательские инструкции, чтобы вставить наше изображение карусели.

<template>
  <div class="broadcast" v-broadcast="broadcastImg">
     <!-- 自定义指令broadcast,,形参 => broadcastImg 为我们的轮播图数据 -->
  </div>
</template> imgSrc : './img/5.jpg',
  linkHref : '#'
}
  1. Добавить пользовательскую директиву:
directives:{
  broadcast:{
    inserted:function(el,binding) {
      // binding.value 为我们传入的形参,即图片的地址和图片点击链接
      var broadcast = new Broadcast(el,binding.value,{
        transitionTime : 800, // 动画过渡时间,默认为800ms
        intervalTime : 5000 // 图片切换时间,默认为5s
      });
    }
  }
}

API

// 构造的对象
new Broadcast (el,imagesAndUrl,JSON)
Атрибуты иллюстрировать замечания замечания
el Вам нужно создать обертку (родительский) элемент карусели Не пишите ошибку
imagesAndUrl Адрес изображения связан с адресом изображения. Объект массива linkHref => ссылка для клика по изображению; imgSrc => адрес изображения не пишите ошибку
JSON transitionTime => время перехода анимации, intervalTime => время переключения анимации По умолчанию: Время перехода => 800 мс. Время переключения => 5 с.

Идеи написания кода

Динамическая генерация узлов dom
  1. Через ширину эл сгенерировать динамический css и добавить на страницу
// 动态添加一些css样式
let cssStr = `.broadcastMe .broadcastMe-list {width: ${(this.imagesAndUrl.length+2)*this.el.clientWidth}px;}.broadcastMe .broadcastMe-list .broadcastMe-item {width:${this.el.clientWidth}px;}`;

let styleNode = document.createElement('style');
styleNode.innerText = cssStr;
document.head.appendChild(styleNode)
  1. В виде строкового шаблона генерируем нужную нам html строку и соответствуем бесшовной карусели, и загружаем ее в ноду el.
мобильный жест свайп

Завершите весь процесс скольжения: touchstart => touchmove => touchend, и в событии touchmove измените текущее значение left, а в событии touchend оцените расстояние между левой и правой сторонами, и страница останется неизменной.

// 移动端手指滑动
let stratPointX = 0;
let offsetX = 0;
this.el.addEventListener("touchstart", (e) => {
  stratPointX = e.changedTouches[0].pageX;
  offsetX = this.broadcastMeList.offsetLeft;
  this.animationMark = true;
})
this.el.addEventListener("touchmove", (e) => {
  let disX = e.changedTouches[0].pageX - stratPointX;
  let left = offsetX + disX;

  this.broadcastMeList.style.transitionProperty = 'none';
  this.broadcastMeList.style.left = left + 'px';
})
this.el.addEventListener("touchend", () => {
  let left = this.broadcastMeList.offsetLeft;
  // 判断正在滚动的图片距离左右图片的远近,
  this.index = Math.round(-left/this.el.clientWidth);
  this.animationMark = false;
  this.render();
})
функция визуализации (☆)
Broadcast.prototype.render = function () {
  // 防抖控制
  if(this.animationMark) return;

  this.animationMark = true;
  // 修改broadcastMeList 的left值
  this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + 'px';
  this.broadcastMeList.style.transition = 'left ' + this.timer/1000 + 's';

  setTimeout(() => {
    // 添加判断,防止出界
    if(this.index <= 0){
      // 无缝轮播,修改真实的left值,取消transition,造成视觉错误
      this.broadcastMeList.style.transitionProperty = 'none';
      this.index = this.imagesAndUrl.length;
      this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + 'px';
    }else if (this.index > this.imagesAndUrl.length){ 
      this.broadcastMeList.style.transitionProperty = 'none';
      this.index = 1;
      this.broadcastMeList.style.left = (-1)*this.el.clientWidth*this.index + 'px';
    }
    this.animationMark = false;
  },this.timer)

  this.renderSpot();
}

наконец

Из-за нехватки знаний код только что написан, тестов мало, а многие ошибки еще не найдены.Если обнаружите какие-либо проблемы, пожалуйста, оставьте сообщение, чтобы указать, пожалуйста, исправьте. Спасибо! !