vue封装一个3D轮播图组件

简介: vue封装一个3D轮播图组件

说在前面

🎈常见的轮播图组件我们见得很多了,那么来封装个3D轮播图组件怎么样呢?

效果预览

体验地址

http://jyeontu.xyz/jvuewheel/#/J3DSwipe

组件实现

CSS3:transform-style & perspective

首先我们应该先了解一下transform-styleperspective这两个CSS3中的属性。

transform-style

transform--style属性指定嵌套元素是怎样在三维空间中呈现。

描述
flat 表示所有子元素在2D平面呈现。
preserve-3d 表示所有子元素在3D空间中呈现。
  • 浏览器支持

perspective

我们可以通过perspective来设置一个元素的景深,多少像素的3D元素是从视图的perspective属性定义。这个属性允许你改变3D元素是怎样查看透视图,这个值决定了 3D效果的强烈程度 越小感觉越强烈,也站的越近。

定义时的perspective属性,它是一个元素的子元素,透视图,而不是元素本身。

注意:perspective 属性只影响 3D 转换元素。

描述
number 元素距离视图的距离,以像素计。
none 默认值。与 0 相同。不设置透视。
  • 浏览器支持

组件参数定义及功能实现

props: {
    maxWidth: {
        type: String,
        default: "150px"
    },
    hoverPause: {
        type: Boolean,
        default: true
    },
    blurPause: {
        type: Boolean,
        default: true
    },
    speed: {
        type: String,
        default: "1500"
    },
    multiple: {
        type: String,
        default: "1.4"
    },
    autoPlay: {
        type: Boolean,
        default: true
    },
    imgList: {
        type: Array,
        default: () => {
            return [];
        }
    }
},

如上代码,我们在该组件中主要接收这7个参数,接下来我们结合功能实现来对这些参数进行说明。

1、maxWidth(设置轮播图片的最大宽度)

使用CSS变量来动态设置轮播图片的最大宽度,代码如下:

<div
    :id="uid + '-j-3d-swipe'"
    class="j-3d-swipe"
    :style="{
        '--maxWidth': maxWidth
    }"
>
……
</div>
<style lang="scss" vars="{ maxWidth }" scoped>
figure.spinner img {
    max-width: var(--maxWidth);
    position: absolute;
    left: 40%;
    transform-origin: 50% 50% -500px;
    outline: 1px solid transparent;
}
</style>

2、hoverPause(鼠标移动到图片上停止轮播)

该参数可以设置鼠标移动到图片上面时,图片是否停止轮播。这里我们可以通过mouseentermouseleave事件来模拟监听图片的hover事件(mouseover当然也可以,但是其触发事件次数会较多)

<img
    alt=""
    v-for="(item, index) in imgList"
    :key="'img-' + index"
    :src="item"
    :class="uid + '-img img'"
    @mouseenter="mouseenter"
    @mouseleave="mouseleave"
/>
<script>
mouseleave(e) {
    this.mouseHover = false;
},
mouseenter(e) {
    this.mouseHover = true;
},
//轮播切换函数
galleryspin(sign) {
    if (this.hoverPause && this.mouseHover) return;
    ……
}
</script>

3、blurPause(窗口失焦时停止自动轮播)

通过该参数我们可以设置当前window窗口失去焦点的时候,轮播图是否停止自动轮播。这里我们通过window.onfocuswindow.onblur来监听窗口的状态。

created() {
    window.onfocus = () => {
        this.isActive = true;
    };
    window.onblur = () => {
        this.isActive = false;
    };
},
methods:{
    //轮播切换函数
    galleryspin(sign) {
        if (this.blurPause && !this.isActive) return;
        ……
    }
}

4、speed(设置自动轮播速度)

通过该参数我们可以设置自动轮播切换速度,默认为1500ms。

setInterval(() => {
    this.galleryspin();
}, this.speed);

5、multiple(设置鼠标移动到图片上,图片放大效果)

通过该参数我们可以设置鼠标移动到轮播图片上时,图片的放大倍数,如下图:

这里我们可以通过mouseentermouseleave事件来模拟监听图片的hover事件

<img
    alt=""
    v-for="(item, index) in imgList"
    :key="'img-' + index"
    :src="item"
    :class="uid + '-img img'"
    @mouseenter="mouseenter"
    @mouseleave="mouseleave"
/>
<script>
mouseleave(e) {
    const el = e.target;
    const newWidth = parseInt(el.offsetWidth) / this.multiple + "px";
    el.style.width = newWidth;
    el.style.maxWidth = newWidth;
    this.mouseHover = false;
},
mouseenter(e) {
    const el = e.target;
    const newWidth = parseInt(el.offsetWidth) * this.multiple + "px";
    el.style.width = newWidth;
    el.style.maxWidth = newWidth;
    this.mouseHover = true;
},
</script>

6、autoPlay(设置是否自动轮播)

通过该参数我们可以设置轮播图是否自动播放。

mounted() {
    if (this.autoPlay) {
        setInterval(() => {
            this.galleryspin();
        }, this.speed);
    }
},

7、imgList(轮播图片列表)

7.1 循环生成图片标签

我们可以通过遍历图片列表来生成图片标签。

<img
    alt=""
    v-for="(item, index) in imgList"
    :key="'img-' + index"
    :src="item"
    :class="uid + '-img img'"
    @mouseenter="mouseenter"
    @mouseleave="mouseleave"
/>
7.2 初始化图片角度

计算每张图片的初始角度,使其平均分布。

initView() {
    const imgs = document.getElementsByClassName(`${this.uid}-img`);
    for (let i = 0; i < imgs.length; i++) {
        const angle = (360 / imgs.length) * i;
        imgs[i].setAttribute(
            "style",
            `transform: rotateY(-${angle}deg)`
        );
    }
},
7.3 图片轮播事件

每次旋转的角度应该为:360 / this.imgList.length,通过sign来区分旋转方向,Boolean(sign)为false时顺时针转动,反之则逆时针转动。

galleryspin(sign) {
    if (this.blurPause && !this.isActive) return;
    if (this.hoverPause && this.mouseHover) return;
    const id = this.uid + "-spinner";
    const spinner = document.getElementById(id);
    if (!sign) {
        this.angle = this.angle + 360 / this.imgList.length;
    } else {
        this.angle = this.angle - 360 / this.imgList.length;
    }
    spinner.setAttribute(
        "style",
        "-webkit-transform: rotateY(" +
            this.angle +
            "deg); -moz-transform: rotateY(" +
            this.angle +
            "deg); transform: rotateY(" +
            this.angle +
            "deg);"
    );
}

组件库引用

这里我将这个组件打包进了自己的一个组件库,并将其发布到了npm上,有需要的同学也可以直接引入该组件进行使用。

引入教程可以看这里:http://jyeontu.xyz/jvuewheel/#/installView

引入后即可直接使用。

源码地址

组件库已开源,想要查看完整源码的可以到 gitee 查看,自己也整理了相关的文档对其进行了简单介绍,具体如下:

组件文档

jvuewheel: http://jyeontu.xyz/jvuewheel/#/JVideoCover

Gitee源码

Gitee源码:gitee.com/zheng_yongt…

觉得有帮助的同学可以帮忙给我点个star,感激不尽~~~

有什么想法或者改良可以给我提个pr,十分欢迎~~~

有什么问题都可以在评论告诉我~~~

往期精彩

vue实现一个鼠标滑动预览视频封面组件(精灵图版本)

node封装一个图片拼接插件

基于inquirer封装一个控制台文件选择器

node封装一个控制台进度条插件

密码太多不知道怎么记录?不如自己写个密码箱小程序

微信小程序实现一个手势图案锁组件

vue封装一个弹幕组件

为了学(mo)习(yu),我竟开发了这样一个插件

程序员的浪漫之——情侣日常小程序

vue简单实现词云图组件

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。

目录
相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
154 64
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
45 8
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1067 0
|
10天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
70 1
|
20天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
51 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
48 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
41 1
vue学习第四章

热门文章

最新文章

下一篇
开通oss服务