|
|
@@ -0,0 +1,154 @@
|
|
|
+<!--幻灯片组件-->
|
|
|
+<template>
|
|
|
+ <div class="slide-show" @mouseover="clearInv" @mouseout="runInv">
|
|
|
+ <div class="slide-img">
|
|
|
+ <a href="javascript:;">
|
|
|
+ <transition name="slide-trans">
|
|
|
+ <!-- 轮播图 -->
|
|
|
+ <img v-if="isShow" :src="slides[nowIndex].src">
|
|
|
+ </transition>
|
|
|
+ <transition name="slide-trans-old">
|
|
|
+ <img v-if="!isShow" :src="slides[nowIndex].src">
|
|
|
+ </transition>
|
|
|
+ </a>
|
|
|
+ </div>
|
|
|
+ <h2>{{ slides[nowIndex].title }}</h2>
|
|
|
+ <ul class="slide-pages">
|
|
|
+ <li @click="goto(prevIndex)"><</li>
|
|
|
+ <!-- 遍历幻灯片数组 -->
|
|
|
+ <li v-for="(item, index) in slides" @click="goto(index)">
|
|
|
+ <a :class="{on: index === nowIndex}">
|
|
|
+ {{ index + 1 }}
|
|
|
+ </a>
|
|
|
+ </li>
|
|
|
+ <li @click="goto(nextIndex)">></li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+export default {
|
|
|
+ props: {
|
|
|
+ // 接收父级传递过来的幻灯片数据,并定义类型和默认值
|
|
|
+ slides: {
|
|
|
+ type: Array,
|
|
|
+ default: []
|
|
|
+ },
|
|
|
+ // 接收父级传递过来的幻灯片自动轮播的时间,并定义类型和默认值
|
|
|
+ inv: {
|
|
|
+ type: Number,
|
|
|
+ default: 1000
|
|
|
+ }
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ nowIndex: 0,
|
|
|
+ isShow: true
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ prevIndex() {
|
|
|
+ if (this.nowIndex === 0) {
|
|
|
+ return this.slides.length - 1
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return this.nowIndex - 1
|
|
|
+ }
|
|
|
+ },
|
|
|
+ nextIndex() {
|
|
|
+ if (this.nowIndex === this.slides.length - 1) {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return this.nowIndex + 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ goto(index) {
|
|
|
+ this.isShow = false
|
|
|
+ setTimeout(() => {
|
|
|
+ this.isShow = true
|
|
|
+ this.nowIndex = index
|
|
|
+ }, 10)
|
|
|
+ },
|
|
|
+ runInv() {
|
|
|
+ this.invId = setInterval(() => {
|
|
|
+ this.goto(this.nextIndex)
|
|
|
+ }, this.inv)
|
|
|
+ },
|
|
|
+ clearInv() {
|
|
|
+ clearInterval(this.invId)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.runInv();
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.slide-trans-enter-active {
|
|
|
+ transition: all .5s;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-trans-enter {
|
|
|
+ transform: translateX(900px);
|
|
|
+}
|
|
|
+
|
|
|
+.slide-trans-old-leave-active {
|
|
|
+ transition: all .5s;
|
|
|
+ transform: translateX(-900px);
|
|
|
+}
|
|
|
+
|
|
|
+.slide-show {
|
|
|
+ position: relative;
|
|
|
+ margin: 15px 15px 15px 0;
|
|
|
+ width: 900px;
|
|
|
+ height: 400px;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-show h2 {
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ color: #fff;
|
|
|
+ background: #000;
|
|
|
+ opacity: .5;
|
|
|
+ bottom: 0;
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+ text-align: left;
|
|
|
+ padding-left: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-img {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-img img {
|
|
|
+ width: 100%;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-pages {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 10px;
|
|
|
+ right: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-pages li {
|
|
|
+ display: inline-block;
|
|
|
+ padding: 0 10px;
|
|
|
+ cursor: pointer;
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.slide-pages li .on {
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #6f6265;
|
|
|
+ padding: 0 5px;
|
|
|
+}
|
|
|
+</style>
|