swiper3dCom.vue 4.22 KB
<template>
    <div class="swiper-3d-com" v-if="items && items.length">
        
        <!-- 背景图片 -->
        <div class="bg-box" v-if="setOptions.bg">
            <img :src="setOptions.bg + SIGN.BIG" class="bg-img" />
        </div>
        
        <!-- 3D轮播 -->
        <div class="carousel-3d-box">
            <carousel-3d :autoplay="setOptions.autoplay" :autoplayTimeout="setOptions.autoplayTimeout" :autoplayHoverPause="setOptions.autoplayHoverPause" :display="setOptions.display" :width="getWidth()" :height="getHeight()" :inverseScaling="1000" :onMainSlideClick="onMainSlideClick">
                <slide :index="index" v-for="(item, index) in items" :key="index">
                    <div class="item">
                        <div class="img-box">
                            <img :src="item.simg" class="img" />
                        </div>
                        <div class="base-box">
                            <img src="static/img/hot-sales-base.png" class="base-img" />
                        </div>
                        <div class="title-box" :style="{'backgroundImage': 'url(static/img/hot-sales-title.png)'}">
                            <div class="index">月销量第{{setOptions.sortArr[index]}}名</div>
                            <div class="title">
                                <div class="title-sub">
                                    {{item.title}}
                                </div>
                            </div>
                        </div>
                    </div>
                </slide>
            </carousel-3d>
        </div>
    </div>
</template>

<script>

    // 引入组件
    import { Carousel3d, Slide } from 'vue-carousel-3d';

    export default {
        data: function () {
            return {
                setOptions: {
                    bg: null,                       // 背景图片
                    sortArr: ['一', '二', '三'],    // 排名排序汉字字符串
                    display: 3,                     // 展示数量
                    autoplay: true,                 // 自动切换
                    autoplayTimeout: 5000,          // 自动切换时长
                    autoplayHoverPause: true,       // 悬停自动暂停
                    inverseScaling: 1000            // 反向缩放大小,数字越大缩放比例越大(暂时不使用这个参数,要配合width/height参数共同使用)
                }
            }
        },
        props: ["items", "options"],
        components: {
            Carousel3d,
            Slide
        },
        computed: {

            /**
             * 计算宽度
             */
            getWidth() {
                return () => {
                    return (document.documentElement.clientWidth || document.body.clientWidth) * (760 / 750);
                }
            },

            /**
             * 计算高度
             */
            getHeight() {
                return () => {
                    return (document.documentElement.clientWidth || document.body.clientWidth) * (290 / 750);
                }
            }
        },
        methods: {

            /**
             * 合并选项
             * @param {Object} options [配置选项]
             */
            mergeOptions(options) {

                if (typeof options === 'object' && options !== null) {

                    // 合并默认参数
                    Object.assign(this.setOptions, options);
                }
            },

            /**
             * 活动项目点击事件
             * @param {Object} item [数据对象]
             */
            onMainSlideClick(item) {
                this.$emit('onMainSlideClick', item);
            }
        },
        watch: {

            /**
             * 监听options参数变化
             */
            options(newVal, oldVal) {

                // 合并选项
                this.mergeOptions(newVal);
            }
        },
        mounted() {

            this.$nextTick(() => {

                // 合并选项
                this.mergeOptions(this.options);
            });
        }
    }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style rel="stylesheet/less" lang="less" scoped>
    @import './swiper3dCom';
</style>