UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 22.4 kB
{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-carousel-loop/index.vue"],"sourcesContent":["<template>\r\n <div\r\n :class=\"prefixCls\"\r\n @mouseenter=\"handleMouseenter\"\r\n @mouseleave=\"handleMouseleave\"\r\n >\r\n <!-- 按钮 -->\r\n <template v-if=\"data.showCopyTrack\">\r\n <ivue-button\r\n :class=\"leftButtonClasses\"\r\n flat\r\n icon\r\n @click=\"handleArrowClick('left')\"\r\n v-if=\"!$slots.leftArrow\"\r\n >\r\n <ivue-icon>{{ leftArrow }}</ivue-icon>\r\n </ivue-button>\r\n <template v-if=\"$slots.leftArrow\">\r\n <div :class=\"leftButtonClasses\" @click=\"handleArrowClick('left')\">\r\n <slot name=\"leftArrow\"></slot>\r\n </div>\r\n </template>\r\n </template>\r\n\r\n <!-- scroll -->\r\n <div :class=\"`${prefixCls}-scroll`\" ref=\"scroll\">\r\n <!-- 内容 -->\r\n <div :class=\"`${prefixCls}-content`\" ref=\"content\">\r\n <div :class=\"`${prefixCls}-list`\" :style=\"listStyles\" ref=\"list\">\r\n <slot></slot>\r\n </div>\r\n <!-- 复制的内容 -->\r\n <div\r\n :class=\"`${prefixCls}-list copy-track`\"\r\n :style=\"listCopyStyles\"\r\n v-if=\"data.showCopyTrack\"\r\n >\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 按钮 -->\r\n <template v-if=\"data.showCopyTrack\">\r\n <ivue-button\r\n :class=\"rightButtonClasses\"\r\n flat\r\n icon\r\n @click=\"handleArrowClick('right')\"\r\n v-if=\"!$slots.rightArrow\"\r\n >\r\n <slot name=\"rightArrow\">\r\n <ivue-icon>{{ rightArrow }}</ivue-icon>\r\n </slot>\r\n </ivue-button>\r\n <template v-if=\"$slots.rightArrow\">\r\n <div :class=\"rightButtonClasses\" @click=\"handleArrowClick('right')\">\r\n <slot name=\"rightArrow\"></slot>\r\n </div>\r\n </template>\r\n </template>\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 ref,\r\n nextTick,\r\n onMounted,\r\n onUnmounted,\r\n watch,\r\n} from 'vue';\r\n\r\nimport { oneOf } from '../../utils/assist';\r\n\r\nimport IvueButton from '../ivue-button';\r\nimport IvueIcon from '../ivue-icon';\r\n\r\n// type\r\nimport type { Props, Data } from './types/carousel-loop';\r\n\r\nconst prefixCls = 'ivue-carousel-loop';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n emits: ['on-scroll-end'],\r\n props: {\r\n /**\r\n * 左箭头图标\r\n *\r\n * @type {String}\r\n */\r\n leftArrow: {\r\n type: String,\r\n default: 'keyboard_arrow_left',\r\n },\r\n /**\r\n * 右箭头图标\r\n *\r\n * @type {String}\r\n */\r\n rightArrow: {\r\n type: String,\r\n default: 'keyboard_arrow_right',\r\n },\r\n /**\r\n * 是否自动滚动\r\n *\r\n * @type {Boolean}\r\n */\r\n autoplay: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 自动滚动的时间间隔,单位为毫秒\r\n *\r\n * @type {Number}\r\n */\r\n interval: {\r\n type: Number,\r\n default: 16.7,\r\n },\r\n /**\r\n * 滚动方向\r\n *\r\n * @type {String}\r\n */\r\n direction: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['left', 'right']);\r\n },\r\n default: 'right',\r\n },\r\n /**\r\n * 鼠标悬浮时暂停自动滚动\r\n *\r\n * @type {Boolean}\r\n */\r\n pauseOnHover: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 每一次滚动偏移大小\r\n *\r\n * @type {Number}\r\n */\r\n offset: {\r\n type: Number,\r\n default: 200,\r\n },\r\n /**\r\n * 滑动速率(毫秒)\r\n *\r\n * @type {Number}\r\n */\r\n slidingSpeed: {\r\n type: Number,\r\n default: 5,\r\n },\r\n /**\r\n * 按钮点击是否等待动画完成后才可以下一步\r\n *\r\n * @type {Boolean}\r\n */\r\n slidingEndNext: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 滚动次数\r\n *\r\n * @type {Number}\r\n */\r\n scrollQuantity: {\r\n type: Number,\r\n },\r\n /**\r\n * 箭头显示时机\r\n *\r\n * @type {String}\r\n *\r\n * hover(悬停),always(一直显示),never(不显示), outside (外部)\r\n */\r\n arrow: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['hover', 'always', 'never', 'outside']);\r\n },\r\n default: 'always',\r\n },\r\n /**\r\n * 外部数据传入用于监听数据变化更新滚动动画\r\n *\r\n * @type {Array}\r\n */\r\n dataList: {\r\n type: Array,\r\n },\r\n },\r\n setup(props: Props, { emit, slots }) {\r\n // dom\r\n const scroll = ref<HTMLDivElement>();\r\n const content = ref<HTMLDivElement>();\r\n const list = ref<HTMLDivElement>();\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * setInterval\r\n *\r\n * @type {Function}\r\n */\r\n timer: null,\r\n /**\r\n * 是否循环显示\r\n *\r\n * @type {Boolean}\r\n */\r\n loop: true,\r\n /**\r\n * 显示复制的内容\r\n *\r\n * @type {Boolean}\r\n */\r\n showCopyTrack: false,\r\n /**\r\n * 列表宽度\r\n *\r\n * @type {Number}\r\n */\r\n listWidth: 0,\r\n /**\r\n * 内容宽度\r\n *\r\n * @type {Number}\r\n */\r\n contentWidth: 0,\r\n /**\r\n * 列表动画\r\n *\r\n * @type {Number}\r\n */\r\n listTranslate: 0,\r\n /**\r\n * 列表动画开始\r\n *\r\n * @type {Boolean}\r\n */\r\n listTranslateStart: true,\r\n /**\r\n * 复制列表动画\r\n *\r\n * @type {Number}\r\n */\r\n listCopyTranslate: 0,\r\n /**\r\n * 复制列表动画开始\r\n *\r\n * @type {Boolean}\r\n */\r\n listCopyTranslateStart: false,\r\n /**\r\n * 溢出宽度\r\n *\r\n * @type {Number}\r\n */\r\n overflowWidth: 0,\r\n /**\r\n * 列表滚动完成数量\r\n *\r\n * @type {Number}\r\n */\r\n scrollDoneQuantity: 0,\r\n /**\r\n * 方向\r\n *\r\n * @type {String}\r\n */\r\n direction: props.direction,\r\n /**\r\n * 箭头点击滚动\r\n *\r\n * @type {Function}\r\n */\r\n arrowInterval: null,\r\n /**\r\n * 箭头点击滚动\r\n *\r\n * @type {Function}\r\n */\r\n arrowSetTimeout: null,\r\n /**\r\n * 跨度\r\n *\r\n * @type {Number}\r\n */\r\n span: -1,\r\n /**\r\n * 滑动开始\r\n *\r\n * @type {Boolean}\r\n */\r\n slidingStart: false,\r\n });\r\n\r\n // computed\r\n\r\n // 列表样式\r\n const listStyles = computed(() => {\r\n return {\r\n transform: `translateX(${data.listTranslate}px)`,\r\n };\r\n });\r\n\r\n // 复制列表样式\r\n const listCopyStyles = computed(() => {\r\n return {\r\n transform: `translateX(${data.listCopyTranslate}px)`,\r\n };\r\n });\r\n\r\n // 左按钮\r\n const leftButtonClasses = computed(() => {\r\n return [\r\n `${prefixCls}-arrow left`,\r\n `${prefixCls}-arrow--${props.arrow}`,\r\n {\r\n [`${prefixCls}-arrow--slot`]: slots.leftArrow,\r\n },\r\n ];\r\n });\r\n\r\n // 右按钮\r\n const rightButtonClasses = computed(() => {\r\n return [\r\n `${prefixCls}-arrow right`,\r\n `${prefixCls}-arrow--${props.arrow}`,\r\n {\r\n [`${prefixCls}-arrow--slot`]: slots.leftArrow,\r\n },\r\n ];\r\n });\r\n\r\n // 总宽度\r\n const overallWidth = computed(() => {\r\n // 总宽度 = 已经滚动成功次数 > 0 ? 列表宽度 + 父级宽度 : 列表宽度\r\n let allWidth = 0;\r\n\r\n // 向左\r\n if (data.span < 0) {\r\n allWidth = data.listWidth;\r\n }\r\n\r\n // 向右\r\n if (data.span > 0) {\r\n allWidth = data.contentWidth;\r\n }\r\n\r\n return allWidth;\r\n });\r\n\r\n // methods\r\n\r\n // 初始化数据\r\n const initData = () => {\r\n // 可滚动滚动的宽度\r\n const scrollWidth = scroll.value.scrollWidth;\r\n // 滚动层宽度\r\n const offsetWidth = scroll.value.offsetWidth;\r\n\r\n // 内容宽度\r\n data.contentWidth = content.value.offsetWidth;\r\n\r\n // 列表宽度\r\n data.listWidth = list.value.offsetWidth;\r\n\r\n // 溢出宽度\r\n data.overflowWidth = data.listWidth - data.contentWidth;\r\n\r\n // 初始化列表动画\r\n data.listTranslate = 0;\r\n\r\n // 超过长度显示复制的内容\r\n if (scrollWidth - offsetWidth > 0) {\r\n data.showCopyTrack = true;\r\n }\r\n\r\n // 向左\r\n if (props.direction === 'left') {\r\n data.span = -1;\r\n\r\n data.listCopyTranslate = data.contentWidth;\r\n }\r\n\r\n // 向右\r\n if (props.direction === 'right') {\r\n data.span = 1;\r\n\r\n data.listCopyTranslate = -data.listWidth;\r\n }\r\n\r\n // 自动滚动\r\n startTime();\r\n };\r\n\r\n // 设置列表动画\r\n const setListTranslate = () => {\r\n // 列表动画开始\r\n if (data.listTranslateStart) {\r\n // 列表动画 < 总宽度\r\n data.listTranslate += data.span;\r\n\r\n // 向左\r\n if (data.span < 0) {\r\n // 列表最后一个已展示 -> 重制列表动画位置\r\n if (data.listTranslate === -data.overflowWidth) {\r\n // 复制列表动画开始\r\n data.listCopyTranslateStart = true;\r\n\r\n // 重制列表动画位置\r\n data.listCopyTranslate = data.contentWidth;\r\n }\r\n\r\n // 最后一个已隐藏 -> 重制列表动画位置\r\n if (data.listTranslate === -overallWidth.value) {\r\n // 列表动画结束\r\n data.listTranslateStart = false;\r\n\r\n // 重制列表动画位置\r\n data.listTranslate = data.contentWidth;\r\n\r\n // 记录滚动次数\r\n data.scrollDoneQuantity += 1;\r\n }\r\n }\r\n\r\n // 向右\r\n if (data.span > 0) {\r\n // 列表开始滚动 === 0 -> 复制列表紧跟 -> 重制复制列表动画位置\r\n if (data.listTranslate === 0) {\r\n // 重制复制列表动画位置\r\n data.listCopyTranslate = -data.listWidth;\r\n }\r\n\r\n // 复制列表开始滚动\r\n if (data.listTranslate > 0) {\r\n data.listCopyTranslateStart = true;\r\n }\r\n\r\n // 第一个已隐藏 -> 重制列表动画位置\r\n if (data.listTranslate === overallWidth.value) {\r\n // 列表动画结束\r\n data.listTranslateStart = false;\r\n\r\n // 重制列表动画位置\r\n data.listTranslate = -data.listWidth;\r\n\r\n // 记录滚动次数\r\n data.scrollDoneQuantity += 1;\r\n }\r\n }\r\n }\r\n\r\n // 复制列表动画开始\r\n if (data.listCopyTranslateStart) {\r\n // 复制列表动画 < 总宽度\r\n data.listCopyTranslate += data.span;\r\n\r\n // 向左\r\n if (data.span < 0) {\r\n // 列表最后一个已展示 -> 重制列表动画位置\r\n if (\r\n data.listCopyTranslate < 0 &&\r\n data.listCopyTranslate === -data.overflowWidth\r\n ) {\r\n // 列表动画开始\r\n data.listTranslateStart = true;\r\n\r\n // 重制列表动画位置\r\n data.listTranslate = data.contentWidth;\r\n }\r\n\r\n // 最后一个已隐藏 -> 重制复制列表动画位置\r\n if (data.listCopyTranslate === -overallWidth.value) {\r\n // 列表动画结束\r\n data.listCopyTranslateStart = false;\r\n\r\n // 重制复制列表动画位置\r\n data.listCopyTranslate = data.contentWidth;\r\n\r\n // 记录滚动次数\r\n data.scrollDoneQuantity += 1;\r\n }\r\n }\r\n\r\n // 向右\r\n if (data.span > 0) {\r\n // 第一个已显示 -> 重制列表动画位置\r\n if (data.listCopyTranslate === 0) {\r\n // 重制列表动画位置\r\n data.listTranslate = -data.listWidth;\r\n\r\n // 重制列表动画开始\r\n data.listTranslateStart = true;\r\n }\r\n\r\n // 第一个已隐藏 -> 重制复制列表动画位置\r\n if (data.listCopyTranslate === data.contentWidth) {\r\n // 列表动画开始\r\n data.listCopyTranslateStart = false;\r\n\r\n // 重制复制列表动画位置\r\n data.listCopyTranslate = -data.listWidth;\r\n\r\n // 记录滚动次数\r\n data.scrollDoneQuantity += 1;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 自动滚动\r\n const startTime = () => {\r\n // 没有显示复制的内容\r\n if (!data.showCopyTrack) {\r\n return;\r\n }\r\n\r\n // 达到滚动次数\r\n if (data.scrollDoneQuantity >= props.scrollQuantity) {\r\n clearTimer();\r\n\r\n return;\r\n }\r\n\r\n // 自动切换的时间间隔,单位为毫秒 < 0 | 没有开启自动切换 | 已经存在倒计时\r\n if (props.interval <= 0 || !props.autoplay || data.timer) {\r\n return;\r\n }\r\n\r\n // 可以滚动\r\n nextTick(() => {\r\n data.timer = setInterval(() => {\r\n setListTranslate();\r\n }, props.interval);\r\n });\r\n };\r\n\r\n // 清除定时器\r\n const clearTimer = () => {\r\n if (data.timer) {\r\n clearInterval(data.timer);\r\n\r\n data.timer = null;\r\n }\r\n };\r\n\r\n // 清除箭头定时器\r\n const clearArrowInterval = () => {\r\n // 清除 setInterval\r\n if (data.arrowInterval) {\r\n clearInterval(data.arrowInterval);\r\n data.arrowInterval = null;\r\n }\r\n };\r\n\r\n // 箭头点击\r\n const handleArrowClick = (arrow: 'left' | 'right') => {\r\n // 设置方向\r\n\r\n // 向左\r\n if (arrow === 'left') {\r\n data.span = -1;\r\n\r\n // 没有进行过滑动 -> 初始化复制列表位置\r\n if (data.listTranslate === 0) {\r\n data.listCopyTranslate = data.contentWidth;\r\n }\r\n }\r\n\r\n // 向右\r\n if (arrow === 'right') {\r\n data.span = 1;\r\n\r\n // 没有进行过滑动 -> 初始化复制列表位置\r\n if (data.listTranslate === 0) {\r\n data.listCopyTranslate = -data.listWidth;\r\n }\r\n }\r\n\r\n // 是否等待动画完成后才可以下一步\r\n if (props.slidingEndNext) {\r\n if (data.slidingStart) {\r\n return;\r\n }\r\n\r\n // 滑动开始\r\n data.slidingStart = true;\r\n }\r\n\r\n // 清除原有计时器\r\n clearTimer();\r\n // 清除 setInterval\r\n clearArrowInterval();\r\n\r\n // 清除setTimeout\r\n if (data.arrowSetTimeout) {\r\n clearTimeout(data.arrowSetTimeout);\r\n data.arrowSetTimeout = null;\r\n }\r\n\r\n // 设置滚动\r\n data.arrowInterval = setInterval(() => {\r\n setListTranslate();\r\n }, props.slidingSpeed);\r\n\r\n // n秒后停止滚动\r\n data.arrowSetTimeout = setTimeout(\r\n () => {\r\n // 重置滑动开始\r\n data.slidingStart = false;\r\n\r\n // 清除 setInterval\r\n clearArrowInterval();\r\n\r\n // 没有鼠标悬浮时暂停自动切换\r\n if (!props.pauseOnHover) {\r\n // 重新开始自动滚动\r\n startTime();\r\n }\r\n },\r\n // 几秒后停止 滑动速率 * 每一次滚动偏移大小\r\n props.slidingSpeed * props.offset\r\n );\r\n };\r\n\r\n // 鼠标进入\r\n const handleMouseenter = () => {\r\n // 鼠标悬浮时暂停自动切换\r\n if (props.pauseOnHover) {\r\n clearTimer();\r\n }\r\n };\r\n\r\n // 鼠标移开\r\n const handleMouseleave = () => {\r\n startTime();\r\n };\r\n\r\n // watch\r\n\r\n // 监听滚动次数\r\n watch(\r\n () => data.scrollDoneQuantity,\r\n (value) => {\r\n // 达到滚动次数\r\n if (props.scrollQuantity && value >= props.scrollQuantity) {\r\n clearTimer();\r\n\r\n // 滚动完成\r\n emit('on-scroll-end', data.scrollDoneQuantity);\r\n }\r\n }\r\n );\r\n\r\n // 监听数据变化\r\n watch(\r\n () => props.dataList || slots.default(),\r\n () => {\r\n // 清除定时器\r\n clearTimer();\r\n\r\n nextTick(() => {\r\n // 初始化数据\r\n initData();\r\n });\r\n },\r\n {\r\n // 深度监听\r\n deep: true,\r\n }\r\n );\r\n\r\n // 监听是否自动滚动\r\n watch(\r\n () => props.autoplay,\r\n () => {\r\n // 清除定时器\r\n clearTimer();\r\n\r\n nextTick(() => {\r\n // 初始化数据\r\n initData();\r\n });\r\n }\r\n );\r\n\r\n // onMounted\r\n onMounted(() => {\r\n // 初始化数据\r\n initData();\r\n });\r\n\r\n // onUnmounted\r\n onUnmounted(() => {\r\n // 清除定时器\r\n clearTimer();\r\n });\r\n\r\n return {\r\n prefixCls,\r\n\r\n // dom\r\n scroll,\r\n content,\r\n list,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n listStyles,\r\n listCopyStyles,\r\n leftButtonClasses,\r\n rightButtonClasses,\r\n\r\n // methods\r\n startTime,\r\n clearTimer,\r\n handleArrowClick,\r\n handleMouseenter,\r\n handleMouseleave,\r\n };\r\n },\r\n components: {\r\n IvueButton,\r\n IvueIcon,\r\n },\r\n});\r\n</script>\r\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_withCtx","_createVNode","_createElementVNode","_normalizeStyle","_renderSlot"],"mappings":"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"}