ball-swiper
ball-swiper
Vue3 球面 3D 轮播组件:卡片沿球面排布、鼠标拖拽旋转、箭头翻页,也可退化为平面排布(ball3D=false)——适合首页头图、产品展廊、作品集等「视觉焦点」轮播展示。
English: Vue3 spherical 3D carousel — cards are laid out along a sphere with perspective scaling, rotated by mouse drag or arrow clicks (flat mode optional). Ideal for hero banners, product galleries and portfolio showcases.
快速开始
npm i ball-swiper -S
注:样式需手动引入 import 'ball-swiper/index.css'。
注:rem 布局前置要求——组件内部按 px→rem 换算尺寸,宿主页面必须设置 html 的 font-size(如 document.documentElement.style.fontSize = document.documentElement.clientWidth / 120 + 'px'),否则卡片尺寸失真。
快速应用
全局注入
import 'ball-swiper/index.css'; // ⚠️ 样式需手动引入
import BallSwiper from 'ball-swiper'
app.use(BallSwiper);
局部注入
import BallSwiperLib from 'ball-swiper';
import 'ball-swiper/index.css';
// 注:产物为 default 导出,具名导入依赖 CJS 互操作、部分构建工具(如 Vite)下不可靠,请 default 导入后解构
const { BallSwiper } = BallSwiperLib;
TypeScript 与 AI 支持
- 自带
index.d.ts类型声明(package.jsontypes字段已配置),安装后编辑器/AI 直接获得完整类型提示。 - 配套
AI.md:面向 AI 助手的使用指南(API 速查、最小示例、典型错误对照),AI 编码工具可直接读取。
与同类的区别(选型参考)
| 对比对象 | 选择本包的理由 |
|---|---|
| swiper / 通用平面轮播 | 卡片沿球面排布带透视缩放,拖拽旋转、箭头翻页,「视觉焦点」仪式感强;平面轮播只是水平滑动 |
| swiper 3D 模式 / vue-carousel-3d | 它们是 coverflow / 卡片堆叠式 3D 轮播;本包专做球面布局(卡片沿球面弧线分布、按距中位缩放),展示页头图/展廊的差异化视觉 |
| vue-sphere(3D 图片球体) | 图片球是密集图片贴球面、鼠标跟随旋转;本包是卡片式球面轮播——内容由插槽自定义、可点选(itemClick)、箭头逐张翻页 |
适用:大屏 / 展示页的头像墙、商品墙、作品集、首页头图等「视觉焦点」轮播展示。 不适用:移动端触摸交互(只支持鼠标拖拽,无 touch 事件);需要自动播放(无 autoplay);数据频繁变动(每次全量重排);SSR 渲染(内部依赖 DOM 测量)。
主参数
| 参数 | 类型 | 必填项 | 默认值 | 参考值 | 说明 |
|---|---|---|---|---|---|
| data | Array | √ | 数据来源。必传,不传会直接报错。 | ||
| ball3D | Boolean | × | true | 是否3D球面。false 为平面排布(span 生效)。 | |
| height | String | × | 100% | 300px | 高度。 |
| showNum | Number | × | 7 | 展示数据量,请使用奇数值。偶数值不会自动进位成奇数(偶数时卡片呈半卡偏移效果)。 | |
| span | Number | × | 0 | 左右空隙,ball3D为false时有效。 | |
| itemBg | String | × | item背景。 | ||
| jtImg | String | × | 左右箭头图片。请传入左侧箭头图片,右侧箭头会自动水平反转使用。 |
事件与插槽
| 参数 | 类型 | 解释 |
|---|---|---|
| @itemClick | 点击回调 | (obj) => {}。拖动位移 >50px 时不触发。 |
| #default | 作用域插槽 | { row } 逐项传出数据。 |
示例
<template>
<!-- rem 前置:组件内部 px→rem 换算依赖 html font-size -->
<BallSwiper
:data="data"
:showNum="7"
height="300px"
@itemClick="itemClick">
<template #default="{ row }">
<div class="name">{{ row.name }}</div>
<div class="img">
</div>
</template>
</BallSwiper>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import 'ball-swiper/index.css'; // ⚠️ 样式需手动引入
import BallSwiperLib from 'ball-swiper';
// 注:产物为 default 导出,具名导入依赖 CJS 互操作、部分构建工具(如 Vite)下不可靠,请 default 导入后解构
const { BallSwiper } = BallSwiperLib;
const data = ref([
{ name: 'A', url: 'a.png' },
{ name: 'B', url: 'b.png' },
{ name: 'C', url: 'c.png' },
]);
const itemClick = (row) => console.log(row);
onMounted(() => {
// rem 前置:按视口宽度设置根字号
document.documentElement.style.fontSize = document.documentElement.clientWidth / 120 + 'px';
});
</script>
版本以 package.json 为准。
Related Packages
vue-concise-slider
vue-slider,A simple sliding component,has easy configuration,support self-adapti...
125,004
Version History
| Version | Released | License |
|---|---|---|
| 1.2.1 | MIT | |
| 1.2.0 | MIT | |
| 1.1.2 | MIT | |
| 1.1.1 | MIT | |
| 1.1.0 | MIT | |
| 1.0.0 | MIT | |
| 0.0.5 | MIT | |
| 0.0.4 | MIT | |
| 0.0.3 | MIT | |
| 0.0.2 | MIT | |
| 0.0.1 | MIT |