!83 轮播图组件新增过渡动画效果,修复autoplay为false时仍然自动播放的问题
Merge pull request !83 from 0o张不歪o0/next
This commit is contained in:
		
						commit
						a3866fc972
					
				| @ -38,6 +38,7 @@ | |||||||
|   background-color: #f8f8f8; |   background-color: #f8f8f8; | ||||||
|   transition-duration: 0.3s; |   transition-duration: 0.3s; | ||||||
|   -webkit-transition-duration: 0.3s; |   -webkit-transition-duration: 0.3s; | ||||||
|  |   overflow: hidden; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .layui-carousel-updown > * { | .layui-carousel-updown > * { | ||||||
| @ -205,6 +206,7 @@ | |||||||
|   right: 20px; |   right: 20px; | ||||||
|   width: auto; |   width: auto; | ||||||
|   height: auto; |   height: auto; | ||||||
|  |   transform: translateY(-50%); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .layui-carousel[lay-anim="updown"] .layui-carousel-ind ul { | .layui-carousel[lay-anim="updown"] .layui-carousel-ind ul { | ||||||
|  | |||||||
| @ -53,6 +53,15 @@ const active = computed({ | |||||||
|   }, |   }, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
|  | const anim = computed({ | ||||||
|  |   get() { | ||||||
|  |     return props.anim; | ||||||
|  |   }, | ||||||
|  |   set() { | ||||||
|  |      | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| const emit = defineEmits(["update:modelValue", "change"]); | const emit = defineEmits(["update:modelValue", "change"]); | ||||||
| 
 | 
 | ||||||
| const change = function (id: any) { | const change = function (id: any) { | ||||||
| @ -85,6 +94,7 @@ watch( | |||||||
| 
 | 
 | ||||||
| provide("active", active); | provide("active", active); | ||||||
| provide("slotsChange", slotsChange); | provide("slotsChange", slotsChange); | ||||||
|  | provide("anim", anim); | ||||||
| 
 | 
 | ||||||
| const sub = () => { | const sub = () => { | ||||||
|   for (var i = 0; i < childrens.value.length; i++) { |   for (var i = 0; i < childrens.value.length; i++) { | ||||||
| @ -128,6 +138,7 @@ const autoplay = () => { | |||||||
| watch( | watch( | ||||||
|   () => props.autoplay, |   () => props.autoplay, | ||||||
|   () => { |   () => { | ||||||
|  |     if(props.autoplay) | ||||||
|     setInterval(autoplay, props.interval); |     setInterval(autoplay, props.interval); | ||||||
|   }, |   }, | ||||||
|   { immediate: true } |   { immediate: true } | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ export default { | |||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||||
| import { inject, Ref } from "vue"; | import { inject, Ref, computed, ref, VNodeChild } from "vue"; | ||||||
| 
 | 
 | ||||||
| const props = defineProps<{ | const props = defineProps<{ | ||||||
|   id: string; |   id: string; | ||||||
| @ -14,10 +14,90 @@ const props = defineProps<{ | |||||||
| const active = inject("active"); | const active = inject("active"); | ||||||
| const slotsChange: Ref<boolean> = inject("slotsChange") as Ref<boolean>; | const slotsChange: Ref<boolean> = inject("slotsChange") as Ref<boolean>; | ||||||
| slotsChange.value = !slotsChange.value; | slotsChange.value = !slotsChange.value; | ||||||
|  | 
 | ||||||
|  | const anim = inject("anim"); | ||||||
|  | const item = ref(); | ||||||
|  | const getStyle = computed<any>(() => { | ||||||
|  |   if (item.value) { | ||||||
|  |     let allChild = item.value.parentNode.children; | ||||||
|  |     let allChildNum = allChild.length; | ||||||
|  | 
 | ||||||
|  |     //当前的activeIndex | ||||||
|  |     let activeIndex, | ||||||
|  |       currentIndex = 0; | ||||||
|  |     for (let index = 0; index < allChild.length; index++) { | ||||||
|  |       const element = allChild[index]; | ||||||
|  |       // @ts-ignore | ||||||
|  |       if (element.__vnode.props["data-id"] === active.value) { | ||||||
|  |         activeIndex = index; | ||||||
|  |       } | ||||||
|  |       if (element.__vnode.props["data-id"] === props.id) { | ||||||
|  |         currentIndex = index; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     // @ts-ignore | ||||||
|  |     let prevIndex = activeIndex > 0 ? activeIndex - 1 : allChildNum - 1; | ||||||
|  |     // @ts-ignore | ||||||
|  |     let nextIndex = activeIndex + 1 < allChildNum ? activeIndex + 1 : 0; | ||||||
|  |     // @ts-ignore | ||||||
|  |     let animation = anim.value; | ||||||
|  |     //状态 上一个 当前 下一个 | ||||||
|  |     if (activeIndex === currentIndex) { | ||||||
|  |       if (animation === "updown") { | ||||||
|  |         return { | ||||||
|  |           transform: "translateY(0)", | ||||||
|  |         }; | ||||||
|  |       } else if (animation.includes("fade")) { | ||||||
|  |         return { | ||||||
|  |           opacity: 1, | ||||||
|  |         }; | ||||||
|  |       } else { | ||||||
|  |         return { | ||||||
|  |           transform: "translateX(0)", | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (prevIndex === currentIndex) { | ||||||
|  |       if (animation === "updown") { | ||||||
|  |         return { | ||||||
|  |           transform: "translateY(-100%)", | ||||||
|  |         }; | ||||||
|  |       } else if (animation.includes("fade")) { | ||||||
|  |         return { | ||||||
|  |           opacity: 0, | ||||||
|  |         }; | ||||||
|  |       } else { | ||||||
|  |         return { | ||||||
|  |           transform: "translateX(-100%)", | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (nextIndex === currentIndex) { | ||||||
|  |       if (animation === "updown") { | ||||||
|  |         return { | ||||||
|  |           transform: "translateY(100%)", | ||||||
|  |         }; | ||||||
|  |       } else if (animation.includes("fade")) { | ||||||
|  |         return { | ||||||
|  |           opacity: 0, | ||||||
|  |         }; | ||||||
|  |       } else { | ||||||
|  |         return { | ||||||
|  |           transform: "translateX(100%)", | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return { | ||||||
|  |       display: "none", | ||||||
|  |     }; | ||||||
|  |   } | ||||||
|  | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <li v-if="active === id"> |   <li ref="item" :style="getStyle" :data-id="id"> | ||||||
|     <slot></slot> |     <slot></slot> | ||||||
|   </li> |   </li> | ||||||
| </template> | </template> | ||||||
|  | |||||||
| @ -9,16 +9,16 @@ | |||||||
| <template> | <template> | ||||||
|   <lay-carousel v-model="active1"> |   <lay-carousel v-model="active1"> | ||||||
|     <lay-carousel-item id="1"> |     <lay-carousel-item id="1"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目一</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#009688;">条目一</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="2"> |     <lay-carousel-item id="2"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目二</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#5FB878;">条目二</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="3"> |     <lay-carousel-item id="3"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目三</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FFB800;">条目三</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="4"> |     <lay-carousel-item id="4"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目四</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FF5722;">条目四</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|   </lay-carousel> |   </lay-carousel> | ||||||
| </template> | </template> | ||||||
| @ -40,26 +40,56 @@ export default { | |||||||
| 
 | 
 | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
| ::: title 不同方向 | ::: title 不同方向与不同切换动画 | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
| ::: demo | ::: demo 通过 `anim` 属性来控制切换的放向与动画,支持 `default`左右切换(默认)、`updown`上线切换、`fade`渐隐渐显切换 | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <lay-carousel v-model="active2" anim="updown"> |   <div style="display:flex;justify-content: space-around;flex-wrap:wrap"> | ||||||
|  |   <lay-carousel v-model="activeAnmi1" anim="updown" style="display:inline-block;width:32%" :autoplay="true"> | ||||||
|     <lay-carousel-item id="1"> |     <lay-carousel-item id="1"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目一</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#009688;">条目一</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="2"> |     <lay-carousel-item id="2"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目二</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#5FB878;">条目二</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="3"> |     <lay-carousel-item id="3"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目三</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FFB800;">条目三</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="4"> |     <lay-carousel-item id="4"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目四</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FF5722;">条目四</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|   </lay-carousel> |   </lay-carousel> | ||||||
|  |   <lay-carousel v-model="activeAnmi2" style="width:32%"> | ||||||
|  |     <lay-carousel-item id="1"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#009688;">条目一</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="2"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#5FB878;">条目二</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="3"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FFB800;">条目三</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="4"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FF5722;">条目四</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |   </lay-carousel> | ||||||
|  |   <lay-carousel v-model="activeAnmi3" anim="fade" style="width:32%;"> | ||||||
|  |     <lay-carousel-item id="1"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#009688;">条目一</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="2"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#5FB878;">条目二</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="3"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FFB800;">条目三</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |     <lay-carousel-item id="4"> | ||||||
|  |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FF5722;">条目四</div> | ||||||
|  |     </lay-carousel-item> | ||||||
|  |   </lay-carousel> | ||||||
|  |   </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
| @ -67,11 +97,11 @@ import { ref } from 'vue' | |||||||
| 
 | 
 | ||||||
| export default { | export default { | ||||||
|   setup() { |   setup() { | ||||||
| 
 |     const activeAnmi1 = ref("1") | ||||||
|     const active2 = ref("1") |     const activeAnmi2 = ref("1") | ||||||
| 
 |     const activeAnmi3 = ref("1") | ||||||
|     return { |     return { | ||||||
|       active2 |       activeAnmi1,activeAnmi2,activeAnmi3,activeAnmi4 | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -79,7 +109,7 @@ export default { | |||||||
| 
 | 
 | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
| ::: title 控制位置 | ::: title 控制器位置 | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
| ::: demo | ::: demo | ||||||
| @ -87,16 +117,16 @@ export default { | |||||||
| <template> | <template> | ||||||
|   <lay-carousel v-model="active3" indicator="outside"> |   <lay-carousel v-model="active3" indicator="outside"> | ||||||
|     <lay-carousel-item id="1"> |     <lay-carousel-item id="1"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目一</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#009688;">条目一</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="2"> |     <lay-carousel-item id="2"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目二</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#5FB878;">条目二</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="3"> |     <lay-carousel-item id="3"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目三</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FFB800;">条目三</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|     <lay-carousel-item id="4"> |     <lay-carousel-item id="4"> | ||||||
|       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">条目四</div> |       <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#FF5722;">条目四</div> | ||||||
|     </lay-carousel-item> |     </lay-carousel-item> | ||||||
|   </lay-carousel> |   </lay-carousel> | ||||||
| </template> | </template> | ||||||
| @ -140,10 +170,10 @@ export default { | |||||||
|     const active4 = ref("1") |     const active4 = ref("1") | ||||||
| 
 | 
 | ||||||
|     const arrays = ref([ |     const arrays = ref([ | ||||||
|       {id: "1", text: ""}, |       {id: "1", text: "1️⃣"}, | ||||||
|       {id: "2", text: ""}, |       {id: "2", text: "2️⃣"}, | ||||||
|       {id: "3", text: ""}, |       {id: "3", text: "3️⃣"}, | ||||||
|       {id: "4", text: ""} |       {id: "4", text: "4️⃣"} | ||||||
|     ]) |     ]) | ||||||
| 
 | 
 | ||||||
|     return { |     return { | ||||||
| @ -165,7 +195,7 @@ export default { | |||||||
| | 属性      | 描述         | 类型          |类型             |可选值                    | | | 属性      | 描述         | 类型          |类型             |可选值                    | | ||||||
| | --------- | ------------ |--------------| --------------- | -------------------------| | | --------- | ------------ |--------------| --------------- | -------------------------| | ||||||
| | v-model   | 当前激活项   | `number`      | --             | --                      | | | v-model   | 当前激活项   | `number`      | --             | --                      | | ||||||
| | anim      | 切换方向     | `string`      | `default`      | `default` `updown`       | | | anim      | 切换方向     | `string`      | `default`      | `default` `updown` `fade`      | | ||||||
| | indicator | 控制器位置   | `string`      | `inside`       |`inside` `outside` `none` | | | indicator | 控制器位置   | `string`      | `inside`       |`inside` `outside` `none` | | ||||||
| | arrow     | 切换按钮状态 | `string`      | `hover`        |`hover` `always` `none`   | | | arrow     | 切换按钮状态 | `string`      | `hover`        |`hover` `always` `none`   | | ||||||
| | autoplay  | 自动播放     | `boolean`     | `true`         | `true` `false`           | | | autoplay  | 自动播放     | `boolean`     | `true`         | `true` `false`           | | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user