UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 11.6 kB
{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-carousel-item/index.vue"],"sourcesContent":["<template>\r\n <div\r\n :class=\"wrapperClasses\"\r\n :style=\"wrapperStyles\"\r\n ref=\"carouselItem\"\r\n @click=\"handleItemClick\"\r\n v-show=\"data.ready\"\r\n >\r\n <!-- mask -->\r\n <template v-if=\"isCardType\">\r\n <div v-show=\"!data.active\" :class=\"`${prefixCls}--mask`\"></div>\r\n </template>\r\n <!-- slot -->\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n defineComponent,\r\n reactive,\r\n computed,\r\n inject,\r\n onMounted,\r\n getCurrentInstance,\r\n onUnmounted,\r\n ref,\r\n} from 'vue';\r\n\r\nimport { isUndefined } from '../../utils/helpers';\r\n\r\n// type\r\nimport {\r\n CarouselContextKey,\r\n Props,\r\n Data,\r\n WrapperStyles,\r\n} from './types/carousel-item';\r\n\r\nconst prefixCls = 'ivue-carousel-item';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n props: {\r\n /**\r\n * 幻灯片的名字,可用作 setActiveItem 的参数\r\n *\r\n * @type {String | Number}\r\n */\r\n name: {\r\n type: [String, Number],\r\n },\r\n /**\r\n * 该幻灯片所对应指示器的文本\r\n *\r\n * @type {String | Number}\r\n */\r\n label: {\r\n type: [String, Number],\r\n default: '',\r\n },\r\n },\r\n setup(props: Props) {\r\n // instance\r\n const vm = getCurrentInstance();\r\n\r\n // dom\r\n const carouselItem = ref<HTMLElement>();\r\n\r\n // inject\r\n const {\r\n // dom\r\n wrapper,\r\n\r\n // data\r\n items,\r\n loop,\r\n cardScale,\r\n\r\n // computed\r\n isVertical,\r\n isCardType,\r\n\r\n // methods\r\n addItem,\r\n removeItem,\r\n setContentHeight,\r\n setActiveItem,\r\n } = inject(CarouselContextKey);\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 是否激活\r\n *\r\n * @type {Boolean}\r\n */\r\n active: false,\r\n /**\r\n * 执行动画\r\n *\r\n * @type {Boolean}\r\n */\r\n animating: false,\r\n /**\r\n * translate\r\n *\r\n * @type {Number}\r\n */\r\n translate: 0,\r\n /**\r\n * 缩放\r\n *\r\n * @type {Number}\r\n */\r\n scale: 1,\r\n /**\r\n * 是否可以渲染\r\n *\r\n * @type {Boolean}\r\n */\r\n ready: false,\r\n /**\r\n * 是否可以点击下一个\r\n *\r\n * @type {Boolean}\r\n */\r\n inStage: false,\r\n /**\r\n * hover\r\n *\r\n * @type {Boolean}\r\n */\r\n hover: false,\r\n /**\r\n * 选项位置\r\n *\r\n * @type {Number}\r\n */\r\n zIndex: 0,\r\n });\r\n\r\n // computed\r\n\r\n // 外层样式\r\n const wrapperClasses = computed(() => {\r\n return [\r\n prefixCls,\r\n {\r\n // 激活\r\n [`${prefixCls}--active`]: data.active,\r\n // 切换动画\r\n [`${prefixCls}--animating`]: data.animating,\r\n // 卡片类型\r\n [`${prefixCls}--card`]: isCardType.value,\r\n // 卡片竖向\r\n [`${prefixCls}--card__vertical`]:\r\n isCardType.value && isVertical.value,\r\n // 是否可以点击下一个\r\n [`${prefixCls}--in-stage`]: data.inStage,\r\n // hover\r\n [`${prefixCls}--hover`]: data.hover,\r\n },\r\n ];\r\n });\r\n\r\n // 外层样式\r\n const wrapperStyles = computed(() => {\r\n const translateType = `translate${isVertical.value ? 'Y' : 'X'}`;\r\n const _translate = `${translateType}(${data.translate}px)`;\r\n const _scale = `scale(${data.scale})`;\r\n\r\n const transform = [_translate, _scale].join(' ');\r\n\r\n const style: WrapperStyles = {\r\n transform,\r\n };\r\n\r\n // 是卡片 有zIndex\r\n if (isCardType.value && data.zIndex) {\r\n style.zIndex = data.zIndex;\r\n }\r\n\r\n return style;\r\n });\r\n\r\n // methods\r\n\r\n // 移动选项\r\n const translateItem = (\r\n index: number,\r\n activeIndex: number,\r\n oldIndex?: number\r\n ) => {\r\n const _isCardType = isCardType.value;\r\n const _isVertical = isVertical.value;\r\n\r\n const itemsLength = items.value.length ?? Number.NaN;\r\n\r\n // 是否激活\r\n const isActive = index === activeIndex;\r\n\r\n // 不是卡片 & 有旧的index\r\n if (!_isCardType && !isUndefined(oldIndex)) {\r\n data.animating = isActive || index === oldIndex;\r\n }\r\n\r\n // 没有激活 & 选项长度 > 2 & 开启循环\r\n if (!isActive && itemsLength > 2 && loop) {\r\n index = processIndex(index, activeIndex, itemsLength);\r\n }\r\n\r\n // 设置激活的选项\r\n data.active = isActive;\r\n\r\n // 是卡片\r\n if (_isCardType) {\r\n // 是否可以点击下一个\r\n data.inStage = Math.round(Math.abs(index - activeIndex)) <= 1;\r\n\r\n // 偏移位置\r\n data.translate = calcCardTranslate(index, activeIndex);\r\n\r\n // 不是当前激活的选项\r\n if (index !== activeIndex) {\r\n // 当前是否有 zIndex\r\n if (data.zIndex) {\r\n data.zIndex -= 1;\r\n }\r\n\r\n // 右选项\r\n if (data.translate > 0) {\r\n data.zIndex = data.zIndex || 2;\r\n }\r\n\r\n // 左选项\r\n if (data.translate < 0) {\r\n data.zIndex = data.zIndex || 3;\r\n }\r\n }\r\n // 当前激活的选项清除 zIndex\r\n else {\r\n data.zIndex = 0;\r\n }\r\n\r\n // 是否可以点击下一个 清除zIndex\r\n if (!data.inStage) {\r\n data.zIndex = 0;\r\n }\r\n\r\n // 缩放大小\r\n data.scale = isActive ? 1 : cardScale;\r\n }\r\n // 不是卡片\r\n else {\r\n // 偏移位置\r\n data.translate = calcTranslate(index, activeIndex, _isVertical);\r\n }\r\n\r\n // 是否可以渲染\r\n data.ready = true;\r\n\r\n // 获取元素的高度\r\n if (isActive && carouselItem.value) {\r\n // 竖向 | 横向\r\n const height = isVertical.value\r\n ? carouselItem.value.offsetWidth\r\n : carouselItem.value.offsetHeight;\r\n\r\n setContentHeight(height);\r\n }\r\n };\r\n\r\n // 选项进度索引\r\n const processIndex = (\r\n index: number,\r\n activeIndex: number,\r\n length: number\r\n ) => {\r\n // 最后一个选项的索引\r\n const lastItemIndex = length - 1;\r\n // 上一个选项索引\r\n const prevItemIndex = activeIndex - 1;\r\n // 下一个选项索引\r\n const nextItemIndex = activeIndex + 1;\r\n // 中间的索引\r\n const halfItemIndex = length / 2;\r\n\r\n // 激活第一个索引 && 最后一个选项\r\n if (activeIndex === 0 && index === lastItemIndex) {\r\n return -1;\r\n }\r\n // 激活的索引 === 最后一个选项的索引 && 第一个选项\r\n else if (activeIndex === lastItemIndex && index === 0) {\r\n return length;\r\n }\r\n // 选项的索引小于 上一个选项索引 && 激活的选项 - 当前选项的索引 >= 中间索引 -> 向右选择数组\r\n // [0,1,2,0,1,2]\r\n else if (index < prevItemIndex && activeIndex - index >= halfItemIndex) {\r\n return length + 1;\r\n }\r\n // 当前选项索引 > 下一个选项索引 && 当前选项的索引 - 激活的索引 >= 中间值 -> 向左选择数组\r\n else if (index > nextItemIndex && index - activeIndex >= halfItemIndex) {\r\n return -2;\r\n }\r\n\r\n return index;\r\n };\r\n\r\n // 计算 translate 位置\r\n const calcTranslate = (\r\n index: number,\r\n activeIndex: number,\r\n isVertical: boolean\r\n ) => {\r\n const wrapperEl = wrapper.value;\r\n\r\n if (!wrapperEl) {\r\n return 0;\r\n }\r\n\r\n // 父级宽度\r\n let parentOffset = 0;\r\n\r\n // 垂直\r\n if (isVertical) {\r\n parentOffset = wrapperEl.offsetHeight;\r\n }\r\n // 横向\r\n else {\r\n parentOffset = wrapperEl.offsetWidth;\r\n }\r\n\r\n // 位置 * (当前索引 - 激活的索引)\r\n return parentOffset * (index - activeIndex);\r\n };\r\n\r\n // 计算 卡片类型 translate 位置\r\n const calcCardTranslate = (index: number, activeIndex: number) => {\r\n // 父级宽度\r\n let parentOffset = 0;\r\n\r\n // 垂直\r\n if (isVertical.value) {\r\n parentOffset = wrapper.value?.offsetHeight || 0;\r\n }\r\n // 横向\r\n else {\r\n parentOffset = wrapper.value?.offsetWidth || 0;\r\n }\r\n\r\n // 可以点击下一个\r\n if (data.inStage) {\r\n return (\r\n (parentOffset * ((2 - cardScale) * (index - activeIndex) + 1)) / 4\r\n );\r\n }\r\n // 当前选项下标 < 激活的索引 向右前进\r\n else if (index < activeIndex) {\r\n return (-(1 + cardScale) * parentOffset) / 4;\r\n }\r\n // 当前选项下标 > 激活的索引 向左前进\r\n else {\r\n return ((3 + cardScale) * parentOffset) / 4;\r\n }\r\n };\r\n\r\n // methods\r\n\r\n // 点击选项\r\n const handleItemClick = () => {\r\n if (wrapper.value && isCardType.value) {\r\n // 当前点击的index\r\n const index = items.value.findIndex(({ uid }) => {\r\n return uid === vm.uid;\r\n });\r\n\r\n // 激活选项\r\n setActiveItem(index);\r\n }\r\n };\r\n\r\n // onMounted\r\n onMounted(() => {\r\n addItem({\r\n props,\r\n states: data,\r\n uid: vm.uid,\r\n translateItem,\r\n });\r\n });\r\n\r\n // onUnmounted\r\n onUnmounted(() => {\r\n removeItem(vm.uid);\r\n });\r\n\r\n return {\r\n prefixCls,\r\n\r\n // dom\r\n carouselItem,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n wrapperClasses,\r\n wrapperStyles,\r\n isCardType,\r\n\r\n // methods\r\n handleItemClick,\r\n };\r\n },\r\n});\r\n</script>\r\n"],"names":["_withDirectives","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_createCommentVNode"],"mappings":";;;;AAEU,SAAA,YAAA,IAAE,EAAA,MAAA,EAAc,MAAA,EAAA,MAAA,EAAA,OAAA,QAAA,EAAA;AAChB,EAAA,OAAAA,cAAA,EAAAC,SAAA,EAAe,EAAAC,kBAAA,CAAA,KAAA,EAAA;AAAA,IACrB,KAAA,EAAIC,cAAc,CAAA,IAAA,CAAA,cAAA,CAAA;AAAA,IACjB,KAAA,EAAKC,cAAA,CAAA,IAAA,CAAA,aAAA,CAAA;AAAA,IAAA,GAAA,EAAA,cAAA;AAAA,IAGN,OAAa,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,KAAA,IAAA,CAAA,eAAA,IAAA,IAAA,CAAA,eAAA,CAAA,GAAA,IAAA,CAAA,CAAA;AAAA,GACG,EAAA;AAAA,IAAAC,mBAAA,QAAA,CAAA;AAAA,IACmB,KAAA,UAAA,GAAAL,cAAA,EAAAC,SAAK,EAAA,EAASC,mBAAA,KAAA,EAAA;AAAA,MAAA,GAAA,EAAA,CAAA;AAAA,4BAA5B,CAAM,EAAA,IAAA,CAAA,SAAA,CAAA,MAAA,CAAA,CAAA;AAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA,GAAA;AAAA;KAE3B,CAAA,GACAG,kBAAa,CAAA,MAAA,EAAA,IAAA,CAAA;AAAA,IAAAA,mBAAA,QAAA,CAAA;AAAA,eAPL,IAAU,CAAA,MAAA,EAAA,SAAA,CAAA;AAAA,GAAA,EAAA,CAAA,CAAA,GAAA;AAAA;;;;;;;"}