美文网首页
Vue开发一个视频轮播组件-slide组件

Vue开发一个视频轮播组件-slide组件

作者: 小鱼儿_逆流而上 | 来源:发表于2021-08-17 17:29 被阅读0次
小鱼儿心语:愿你成为自己的太阳,无须凭借谁的光^ w ^
直接给大家展示下最终效果:可以左右自动滑动,左右箭头可以根据自身需求放开注释的代码即可
AI视频监控.png
轮播图应用页面:
<template>
  <div id="home">
    <v-carousel
            :slideData="slideData"
            :height="140"
            :begin="0"
            :interval="3000"
            :dot="true"
            :arrow="true"
          ></v-carousel>
  </div>
</template>
<script>
 
import carousel from "@/components/carousel";


  export default {
    name: 'home',
    components: {
        "v-carousel": carousel
    },
    data() {
      return {
        slideData: [
        {
          title: "这是一个Vue轮播图组件",
          url: "#",
          videos: [
            { video: require("../assets/images/1.mp4") },
            { video: require("../assets/images/2.mp4") }
          ]
        },
        {
          title: "这是一个Vue轮播图组件",
          url: "#",
          videos: [
            { video: require("../assets/images/2.mp4") },
            { video: require("../assets/images/3.mp4") }
          ]
        },
        {
          title: "这是一个Vue轮播图组件",
          url: "#",
          videos: [
            { video: require("../assets/images/3.mp4") },
            { video: require("../assets/images/4.mp4") }
          ]
        },
        {
          title: "这是一个Vue轮播图组件",
          url: "#",
          videos: [
            { video: require("../assets/images/1.mp4") },
            { video: require("../assets/images/4.mp4") }
          ]
        },
        {
          title: "这是一个Vue轮播图组件",
          url: "#",
          videos: [
            { video: require("../assets/images/3.mp4") },
            { video: require("../assets/images/1.mp4") }
          ]
        }
      ],
      }
    },
    methods: {
     
    },
    mounted() {
    }
  }
</script>
<style scoped>
</style>
轮播图组件页面 src\components\carousel.vue
<template>
  <div id="carousel">
    <div
      class="carousel"
      ref="carousel"
      v-bind:style="{ height: height + 'px' }"
    >
      <transition-group tag="ul" class="slide clearfix" :name="transitionName">
        <li
          v-for="(item, index) in slideData"
          :key="index"
          v-show="index == beginValue"
          v-bind:style="{ height: height + 'px' }"
          style="display:flex;"
        >
          <!-- 播放视频 -->
          <div v-for="(v, e) in item.videos" :key="e" class="videos">
            <video
              ref="videoPlay"
              muted=""
              :src="v.video"
              controls="controls"
              :autoplay="autoplay"
              loop="loop"
              style="width:100%;height:100%"
            ></video>
          </div>
        </li>
      </transition-group>
    </div>
  </div>
</template>

<script>
import "videojs-contrib-hls";
export default {
  name: "carousel",
  data() {
    return {
      setInterval: "",
      beginValue: 0,
      transitionName: "slide",
      mytime_02: true
    };
  },
  beforeDestroy() {
    // 组件销毁前,清除监听器
    clearInterval(this.setInterval);
  },
  methods: {
    timeupdate(e) {
      if (!this.mytime_02) {
        return;
      } //首次进入能执行
      this.mytime_02 = false;
      setTimeout(() => {
        console.log(parseInt(e.target.currentTime), "event");
        this.mytime_02 = true; //上次执行成功,下一次才可执行。
      }, 3000);
    },
    change(key) {
      if (key > this.slideData.length - 1) {
        key = 0;
      }
      if (key < 0) {
        key = this.slideData.length - 1;
      }

      this.beginValue = key;
    },
    autoPlay() {
      console.log(this.$refs.carousel.getBoundingClientRect().width);
      this.transitionName = "slide";
      this.beginValue++;
      if (this.beginValue >= this.slideData.length) {
        this.beginValue = 0;
        return;
      }
    },
    play() {
      this.setInterval = setInterval(this.autoPlay, this.interval);
    },
    mouseOver() {
      //鼠标进入
      //console.log('over')
      clearInterval(this.setInterval);
    },
    mouseOut() {
      //鼠标离开
      //console.log('out')
      this.play();
    },
    up() {
      //上一页
      --this.beginValue;
      this.transitionName = "slideBack";
      this.change(this.beginValue);
    },
    next() {
      //下一页
      ++this.beginValue;
      this.transitionName = "slide";
      this.change(this.beginValue);
    }
  },
  mounted() {
    var box = this.$refs.carousel; //监听对象
    box.addEventListener("mouseover", () => {
      this.mouseOver();
    });
    box.addEventListener("mouseout", () => {
      this.mouseOut();
    });
    this.beginValue = this.begin;
    this.play();
  },
  props: {
    height: {
      type: Number,
      default: 600
    },
    dot: {
      type: Boolean,
      default: true
    },
    arrow: {
      type: Boolean,
      default: true
    },
    interval: {
      type: Number,
      default: 5000
    },
    begin: {
      type: Number,
      default: 0
    },
    slideData: {
      type: Array,
      default: function() {
        return [];
      }
    }
  }
};
</script>

<style scoped>
.slide {
  position: relative;
  margin: 0;
  padding: 0;
  overflow: hidden;
  width: 100%;
  height: 1.4rem;
}
.slide li {
  list-style: none;
  position: absolute;
  width: 100%;
  height: 1.4rem;
}
.slide li img {
  /* width: 100%; */
  height: 1.4rem;
  cursor: pointer;
}
.slide li .title {
  position: absolute;
  left: 0;
  bottom: 0;
  padding: 10px 20px;
  width: 100%;
  /* background: rgba(0, 0, 0, 0.35); */
  color: #fff;
  font-size: larger;
  text-align: center;
}
.videos {
  width: 1.8rem;
  height: 100%;
  /* margin-top: 0.2rem; */
}
.videos:nth-child(1) {
  margin-right: 0.2rem;
}

.slideDot {
  position: absolute;
  z-index: 999;
  bottom: 0.2rem;
  right: 1.85rem;
}
.slideDot span {
  display: inline-block;
  width: 0.07rem;
  height: 0.07rem;
  background: rgba(255, 255, 255, 0.65);
  margin-left: 0.05rem;
}
.slideDot span.active {
  background: rgba(255, 255, 255, 1);
}
.up,
.next {
  position: absolute;
  left: 0;
  top: 85%;
  margin-top: 0;
  cursor: pointer;
  width: 0.2rem;
  height: 0.2rem;
  background-repeat: no-repeat;
  background-position: 50% 50%;
}
.up {
  width: 0.2rem;
  left: 0.25rem;
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABSklEQVRoQ9Xa220CMRCF4XMqIB0kdJASSCfpIDWlAzqAElIC6SBUMNFIywsCtB7PjX336v/k3YexTBQ+IvIC4AvAN8mTJYWWRR5rROQdwAGAIk4kt5b3lgCu4rX7l+TbUwBuxJ8B7Ej+tAd4xys47ROKiE8DRMWnACLjwwHR8aGAjPgwQFZ8CCAz3h2QHe8KqIh3A1TFuwAq46cB1fFTgA7xZkCXeBOgU/wwoFv8EKBj/GpA1/gRgJ4e7JaZdWqGtcy9j9asGilFRM9sXpcX/QH4sA7hVQA9wzkC2HRDrNoBjV7+g3aI1YCuiCFAR8QwoBvCBOiEMAO6IKYAHRDTgGqEC6AS4QaoQrgCKhDugGxECCATEQbIQoQCMhDhgGhECiASkQaIQqQCIhDpgDuI57orcQNxJqmXPoafkh24VIqIXvD4BLC3HtP8A6pfGkB3vbyXAAAAAElFTkSuQmCC");
}
.next {
  left: auto;
  right: 0.25rem;
  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABOElEQVRoQ9Xa0W0CQQyEYU9JqShQAXSSEgIdUAIlQAd04milezgdOiHZ4/GGN5C8/N/u060Olvy4+8nMngDuyaVC4whNLUPufjazn+XrEcAls15klgkY/y9HpACj2N3Hrn+vdk+KSAO6ERRAJ4IG6EJQAR0IOkCNKAEoEWUAFaIUoECUA6oREkAlQgaoQkgBFQg5gI1oATARbQAWohXAQLQDsogpABnENIAoYirADuILwGPvxmJGwK+ZHVbB/wfg7tv4K4A15u0gpjmBSPzQTAGIxk8ByMS3A7LxrQBGfBuAFd8CYMbLAex4KaAiXgaoipcAKuPLAdXxpQBFfBlAFV8CUMbTAep4KqAjngboiqcAOuPTgM27EmO9j8+we7cL0d9Tj5QbgDw+fQLLPc54Y+UF4BbdxczcH9Le8DFn39OvAAAAAElFTkSuQmCC");
}
.up:hover {
  /* background-color: rgba(0, 0, 0, 0.3); */
}
.next:hover {
  /* background-color: rgba(0, 0, 0, 0.3); */
}

/*进入过渡生效时的状态*/
.slide-enter-active {
  transform: translateX(0);
  transition: all 1s ease;
}

/*进入开始状态*/
.slide-enter {
  transform: translateX(-100%);
}

/*离开过渡生效时的状态*/
.slide-leave-active {
  transform: translateX(100%);
  transition: all 1s ease;
}

/*离开过渡的开始状态*/
.slide-leave {
  transform: translateX(0);
}

/*进入过渡生效时的状态*/
.slideBack-enter-active {
  transform: translateX(0);
  transition: all 1s ease;
}

/*进入开始状态*/
.slideBack-enter {
  transform: translateX(100%);
}

/*离开过渡生效时的状态*/
.slideBack-leave-active {
  transform: translateX(-100%);
  transition: all 1s ease;
}

/*离开过渡的开始状态*/
.slideBack-leave {
  transform: translateX(0);
}
</style>

相关文章

  • 【四】轮播图组件

    关于专题【vue开发音乐App】 轮播图属于基础组件,所以归纳到src/base/slide里面,新建slide....

  • Vue开发一个视频轮播组件-slide组件

    小鱼儿心语:愿你成为自己的太阳,无须凭借谁的光^ w ^ 直接给大家展示下最终效果:可以左右自动滑动,左右箭头可以...

  • MUI组件(4)

    slide(轮播组件) 轮播组件是MUI提供的核心组件之一,基于轮播组件衍生出了图片轮播、可拖动式图文表格、可拖动...

  • 2019-04-28

    vue 轮播图组件

  • vue-slide轮播笔记

    在做练习的时候,在vue开发中我们可以自己写一个轮播组件,里面用到了父子组件的传递,学习一下,并记录下来 父组件:...

  • 基于better-scroll的轮播图组件开发一

    轮播图组件是前端开发中,很重要的一个组件,下面我将讲述我的轮播图(下面将以slider称呼)组件开发(黄轶大神讲的...

  • Vue磨刀嚯嚯

    Vue开发风格——传统方法应用vue.js Vue开发风格——单个组件式 组件 基本操作 创建一个组件构造器 注册...

  • vue(2)

    Vue组件化开发 组件化开发的思想 组件的注册 组件间的数据交互 组件插槽的用法 Vue调试工具的用法 组件开发思...

  • 组件

    题目1: 封装一个轮播组件轮播组件轮播组件2,使用IIFE 题目2: 封装一个曝光加载组件曝光加载组件 题目3: ...

  • 如何开发vue、react、angular的组件库教程

    关键词:vue,react,angular,开发,封装,ui组件,组件库,常用组件 目标:开发相应的组件库vue-...

网友评论

      本文标题:Vue开发一个视频轮播组件-slide组件

      本文链接:https://www.haomeiwen.com/subject/lvndbltx.html