fix: 修复 carousel-item 无法嵌套 v-for 渲染
This commit is contained in:
		
							parent
							
								
									5701edd631
								
							
						
					
					
						commit
						ae96c341f0
					
				@ -118,6 +118,45 @@ export default {
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
::: title 动态遍历
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
::: demo
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <lay-carousel v-model="active">
 | 
			
		||||
    <lay-carousel-item :id="item.id" v-for="item in arrays">
 | 
			
		||||
      <div style="color: white;text-align: center;width:100%;height:300px;line-height:300px;background-color:#79C48C;">{{ item.text }}</div>
 | 
			
		||||
    </lay-carousel-item>
 | 
			
		||||
  </lay-carousel>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { ref } from 'vue'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setup() {
 | 
			
		||||
 | 
			
		||||
    const active = ref("1")
 | 
			
		||||
 | 
			
		||||
    const arrays = ref([
 | 
			
		||||
      {id: "1", text: ""},
 | 
			
		||||
      {id: "2", text: ""},
 | 
			
		||||
      {id: "3", text: ""},
 | 
			
		||||
      {id: "4", text: ""}
 | 
			
		||||
    ])
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      active,
 | 
			
		||||
      arrays
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
::: title Carousel 属性
 | 
			
		||||
:::
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@
 | 
			
		||||
          <li>[新增] page 分页组件 v-model 属性, 支持默认页设置。</li>
 | 
			
		||||
          <li>[新增] date-picker 日期选择组件, 支持年月, 日期, 时间。</li>
 | 
			
		||||
          <li>[新增] transfer 穿梭框组件 showSearch 开启搜索属性。</li>
 | 
			
		||||
          <li>[修复] carousel-item 轮播项使用 v-for 无法渲染。</li>
 | 
			
		||||
          <li>[修复] checkbox 复选框组件, 选中颜色丢失。</li>
 | 
			
		||||
          <li>[修复] slider 滑块组件, 默认 step 值异常。</li>
 | 
			
		||||
          <li>[升级] layer-vue 1.3.10 版本。</li>
 | 
			
		||||
 | 
			
		||||
@ -1,278 +1,276 @@
 | 
			
		||||
@import "../../theme/variable.less";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.layui-carousel {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    background-color: #f8f8f8;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item]:before {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    content: "\e63d";
 | 
			
		||||
    left: 50%;
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    width: 100px;
 | 
			
		||||
    line-height: 20px;
 | 
			
		||||
    margin: -10px 0 0 -50px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    color: @global-neutral-color-8;
 | 
			
		||||
    font-family: layui-icon !important;
 | 
			
		||||
    font-size: 30px;
 | 
			
		||||
    font-style: normal;
 | 
			
		||||
    -webkit-font-smoothing: antialiased;
 | 
			
		||||
    -moz-osx-font-smoothing: grayscale;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > * {
 | 
			
		||||
    display: none;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    background-color: #f8f8f8;
 | 
			
		||||
    transition-duration: 0.3s;
 | 
			
		||||
    -webkit-transition-duration: 0.3s;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-updown > * {
 | 
			
		||||
    -webkit-transition: 0.3s ease-in-out up;
 | 
			
		||||
    transition: 0.3s ease-in-out up;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-arrow {
 | 
			
		||||
    display: none\9;
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 10px;
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    margin-top: -18px;
 | 
			
		||||
    width: 36px;
 | 
			
		||||
    height: 36px;
 | 
			
		||||
    line-height: 36px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
    border: 0;
 | 
			
		||||
    border-radius: 50%;
 | 
			
		||||
    background-color: rgba(0, 0, 0, 0.2);
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    -webkit-transition-duration: 0.3s;
 | 
			
		||||
    transition-duration: 0.3s;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
    left: auto !important;
 | 
			
		||||
    right: 10px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel:hover .layui-carousel-arrow[lay-type="add"],
 | 
			
		||||
  .layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
    right: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-arrow="always"] .layui-carousel-arrow {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    left: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-arrow="none"] .layui-carousel-arrow {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-arrow:hover,
 | 
			
		||||
  .layui-carousel-ind ul:hover {
 | 
			
		||||
    background-color: rgba(0, 0, 0, 0.35);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel:hover .layui-carousel-arrow {
 | 
			
		||||
    display: block\9;
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
    left: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-ind {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: -35px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    line-height: 0 !important;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    font-size: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-indicator="outside"] {
 | 
			
		||||
    margin-bottom: 30px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-indicator="outside"] .layui-carousel-ind {
 | 
			
		||||
    top: 10px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul {
 | 
			
		||||
    background-color: rgba(0, 0, 0, 0.5);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-indicator="none"] .layui-carousel-ind {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-ind ul {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
    background-color: rgba(0, 0, 0, 0.2);
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    -webkit-transition-duration: 0.3s;
 | 
			
		||||
    transition-duration: 0.3s;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-ind li {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    width: 10px;
 | 
			
		||||
    height: 10px;
 | 
			
		||||
    margin: 0 3px;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    background-color: @global-neutral-color-3;
 | 
			
		||||
    background-color: rgba(255, 255, 255, 0.5);
 | 
			
		||||
    border-radius: 50%;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    -webkit-transition-duration: 0.3s;
 | 
			
		||||
    transition-duration: 0.3s;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-ind li:hover {
 | 
			
		||||
    background-color: rgba(255, 255, 255, 0.7);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel-ind li.layui-this {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-next,
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev,
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-this {
 | 
			
		||||
    display: block;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-this {
 | 
			
		||||
    left: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
    left: -100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-next {
 | 
			
		||||
    left: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
    left: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-this.layui-carousel-left {
 | 
			
		||||
    left: -100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel > [carousel-item] > .layui-this.layui-carousel-right {
 | 
			
		||||
    left: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-arrow {
 | 
			
		||||
    left: 50% !important;
 | 
			
		||||
    top: 20px;
 | 
			
		||||
    margin: 0 0 0 -18px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > *,
 | 
			
		||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > * {
 | 
			
		||||
    left: 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
    top: auto !important;
 | 
			
		||||
    bottom: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    right: 20px;
 | 
			
		||||
    width: auto;
 | 
			
		||||
    height: auto;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind ul {
 | 
			
		||||
    padding: 3px 5px;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] .layui-carousel-ind li {
 | 
			
		||||
    display: block;
 | 
			
		||||
    margin: 6px 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-this {
 | 
			
		||||
    top: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
    top: -100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-next {
 | 
			
		||||
    top: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
  .layui-carousel[lay-anim="updown"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
    top: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-this.layui-carousel-left {
 | 
			
		||||
    top: -100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="updown"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-this.layui-carousel-right {
 | 
			
		||||
    top: 100%;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-next,
 | 
			
		||||
  .layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="fade"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
  .layui-carousel[lay-anim="fade"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
    opacity: 1;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  .layui-carousel[lay-anim="fade"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-this.layui-carousel-left,
 | 
			
		||||
  .layui-carousel[lay-anim="fade"]
 | 
			
		||||
    > [carousel-item]
 | 
			
		||||
    > .layui-this.layui-carousel-right {
 | 
			
		||||
    opacity: 0;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  position: relative;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  background-color: #f8f8f8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item]:before {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  content: "\e63d";
 | 
			
		||||
  left: 50%;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  width: 100px;
 | 
			
		||||
  line-height: 20px;
 | 
			
		||||
  margin: -10px 0 0 -50px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  color: @global-neutral-color-8;
 | 
			
		||||
  font-family: layui-icon !important;
 | 
			
		||||
  font-size: 30px;
 | 
			
		||||
  font-style: normal;
 | 
			
		||||
  -webkit-font-smoothing: antialiased;
 | 
			
		||||
  -moz-osx-font-smoothing: grayscale;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > * {
 | 
			
		||||
  display: none;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  background-color: #f8f8f8;
 | 
			
		||||
  transition-duration: 0.3s;
 | 
			
		||||
  -webkit-transition-duration: 0.3s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-updown > * {
 | 
			
		||||
  -webkit-transition: 0.3s ease-in-out up;
 | 
			
		||||
  transition: 0.3s ease-in-out up;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-arrow {
 | 
			
		||||
  display: none\9;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  left: 10px;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  margin-top: -18px;
 | 
			
		||||
  width: 36px;
 | 
			
		||||
  height: 36px;
 | 
			
		||||
  line-height: 36px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  font-size: 20px;
 | 
			
		||||
  border: 0;
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.2);
 | 
			
		||||
  color: #fff;
 | 
			
		||||
  -webkit-transition-duration: 0.3s;
 | 
			
		||||
  transition-duration: 0.3s;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
  left: auto !important;
 | 
			
		||||
  right: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel:hover .layui-carousel-arrow[lay-type="add"],
 | 
			
		||||
.layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
  right: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-arrow="always"] .layui-carousel-arrow {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  left: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-arrow="none"] .layui-carousel-arrow {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-arrow:hover,
 | 
			
		||||
.layui-carousel-ind ul:hover {
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.35);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel:hover .layui-carousel-arrow {
 | 
			
		||||
  display: block\9;
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
  left: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-ind {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  top: -35px;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  line-height: 0 !important;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  font-size: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-indicator="outside"] {
 | 
			
		||||
  margin-bottom: 30px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-indicator="outside"] .layui-carousel-ind {
 | 
			
		||||
  top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul {
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-indicator="none"] .layui-carousel-ind {
 | 
			
		||||
  display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-ind ul {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  padding: 5px;
 | 
			
		||||
  background-color: rgba(0, 0, 0, 0.2);
 | 
			
		||||
  border-radius: 10px;
 | 
			
		||||
  -webkit-transition-duration: 0.3s;
 | 
			
		||||
  transition-duration: 0.3s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-ind li {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  width: 10px;
 | 
			
		||||
  height: 10px;
 | 
			
		||||
  margin: 0 3px;
 | 
			
		||||
  font-size: 14px;
 | 
			
		||||
  background-color: @global-neutral-color-3;
 | 
			
		||||
  background-color: rgba(255, 255, 255, 0.5);
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  -webkit-transition-duration: 0.3s;
 | 
			
		||||
  transition-duration: 0.3s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-ind li:hover {
 | 
			
		||||
  background-color: rgba(255, 255, 255, 0.7);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel-ind li.layui-this {
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-next,
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-prev,
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-this {
 | 
			
		||||
  display: block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-this {
 | 
			
		||||
  left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
  left: -100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-next {
 | 
			
		||||
  left: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
  left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-this.layui-carousel-left {
 | 
			
		||||
  left: -100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel > [carousel-item] > .layui-this.layui-carousel-right {
 | 
			
		||||
  left: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] .layui-carousel-arrow {
 | 
			
		||||
  left: 50% !important;
 | 
			
		||||
  top: 20px;
 | 
			
		||||
  margin: 0 0 0 -18px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] > [carousel-item] > *,
 | 
			
		||||
.layui-carousel[lay-anim="fade"] > [carousel-item] > * {
 | 
			
		||||
  left: 0 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"] {
 | 
			
		||||
  top: auto !important;
 | 
			
		||||
  bottom: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] .layui-carousel-ind {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 50%;
 | 
			
		||||
  right: 20px;
 | 
			
		||||
  width: auto;
 | 
			
		||||
  height: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] .layui-carousel-ind ul {
 | 
			
		||||
  padding: 3px 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] .layui-carousel-ind li {
 | 
			
		||||
  display: block;
 | 
			
		||||
  margin: 6px 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-this {
 | 
			
		||||
  top: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
  top: -100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"] > [carousel-item] > .layui-carousel-next {
 | 
			
		||||
  top: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
.layui-carousel[lay-anim="updown"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
  top: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-this.layui-carousel-left {
 | 
			
		||||
  top: -100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="updown"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-this.layui-carousel-right {
 | 
			
		||||
  top: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-next,
 | 
			
		||||
.layui-carousel[lay-anim="fade"] > [carousel-item] > .layui-carousel-prev {
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="fade"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-carousel-next.layui-carousel-left,
 | 
			
		||||
.layui-carousel[lay-anim="fade"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-carousel-prev.layui-carousel-right {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.layui-carousel[lay-anim="fade"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-this.layui-carousel-left,
 | 
			
		||||
.layui-carousel[lay-anim="fade"]
 | 
			
		||||
  > [carousel-item]
 | 
			
		||||
  > .layui-this.layui-carousel-right {
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,4 +5,4 @@ Component.install = (app: App) => {
 | 
			
		||||
  app.component(Component.name, Component);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default Component;
 | 
			
		||||
export default Component;
 | 
			
		||||
@ -6,7 +6,8 @@ export default {
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import "./index.less";
 | 
			
		||||
import { withDefaults, provide, useSlots, ref, computed } from "vue";
 | 
			
		||||
import { withDefaults, provide, useSlots, ref, computed, VNode, Ref, Component, watch, onMounted } from "vue";
 | 
			
		||||
import CarouselItem from "../carouselItem"
 | 
			
		||||
 | 
			
		||||
const slot = useSlots() as any;
 | 
			
		||||
const slots = slot.default && (slot.default() as any[]);
 | 
			
		||||
@ -17,14 +18,18 @@ const props = withDefaults(
 | 
			
		||||
    height?: string;
 | 
			
		||||
    modelValue: string;
 | 
			
		||||
    anim?: string;
 | 
			
		||||
    autoplay?: boolean;
 | 
			
		||||
    arrow?: string;
 | 
			
		||||
    interval?: number;
 | 
			
		||||
    indicator?: string;
 | 
			
		||||
  }>(),
 | 
			
		||||
  {
 | 
			
		||||
    width: "100%",
 | 
			
		||||
    height: "280px",
 | 
			
		||||
    anim: "default",
 | 
			
		||||
    autoplay: true,
 | 
			
		||||
    arrow: "hover",
 | 
			
		||||
    interval: 3000,
 | 
			
		||||
    indicator: "inside",
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
@ -45,27 +50,55 @@ const change = function (id: any) {
 | 
			
		||||
  active.value = id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
provide("active", active);
 | 
			
		||||
const childrens: Ref<VNode[]> = ref([]);
 | 
			
		||||
const slotsChange = ref(true);
 | 
			
		||||
 | 
			
		||||
const setItemInstanceBySlot = function (nodeList: VNode[]) {
 | 
			
		||||
  nodeList?.map((item) => {
 | 
			
		||||
    let component = item.type as Component;
 | 
			
		||||
    if (component.name != CarouselItem.name) {
 | 
			
		||||
      setItemInstanceBySlot(item.children as VNode[]);
 | 
			
		||||
    } else {
 | 
			
		||||
      childrens.value.push(item);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
watch(slotsChange, function () {
 | 
			
		||||
  childrens.value = [];
 | 
			
		||||
  setItemInstanceBySlot((slot.default && slot.default()) as VNode[]);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
provide("active", active);
 | 
			
		||||
provide("slotsChange", slotsChange);
 | 
			
		||||
 | 
			
		||||
// 上一页
 | 
			
		||||
const prev = function () {
 | 
			
		||||
  for (var i = 0; i < slots.length; i++) {
 | 
			
		||||
    if (slots[i].props.id === active.value) {
 | 
			
		||||
  for (var i = 0; i < childrens.value.length; i++) {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    if (childrens.value[i].props.id === active.value) {
 | 
			
		||||
      if (i === 0) {
 | 
			
		||||
        active.value = slots[slots.length - 1].props.id;
 | 
			
		||||
        // @ts-ignore
 | 
			
		||||
        active.value = childrens.value[slots.length - 1].props.id;
 | 
			
		||||
      }
 | 
			
		||||
      active.value = slots[i - 1].props.id;
 | 
			
		||||
      // @ts-ignore
 | 
			
		||||
      active.value = childrens.value[i - 1].props.id;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 下一页
 | 
			
		||||
const next = function () {
 | 
			
		||||
  for (var i = 0; i < slots.length; i++) {
 | 
			
		||||
    if (slots[i].props.id === active.value) {
 | 
			
		||||
      if (i === slots.length - 1) {
 | 
			
		||||
        active.value = slots[0].props.id;
 | 
			
		||||
  for (var i = 0; i < childrens.value.length; i++) {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    if (childrens.value[i].props.id === active.value) {
 | 
			
		||||
      if (i === childrens.value.length - 1) {
 | 
			
		||||
        // @ts-ignore
 | 
			
		||||
        active.value = childrens.value[0].props.id;
 | 
			
		||||
      }
 | 
			
		||||
      active.value = slots[i + 1].props.id;
 | 
			
		||||
      // @ts-ignore
 | 
			
		||||
      active.value = childrens.value[i + 1].props.id;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@ -86,7 +119,7 @@ const next = function () {
 | 
			
		||||
    <div class="layui-carousel-ind">
 | 
			
		||||
      <ul>
 | 
			
		||||
        <li
 | 
			
		||||
          v-for="ss in slots"
 | 
			
		||||
          v-for="ss in childrens"
 | 
			
		||||
          :key="ss"
 | 
			
		||||
          :class="[ss.props.id === active ? 'layui-this' : '']"
 | 
			
		||||
          @click.stop="change(ss.props.id)"
 | 
			
		||||
 | 
			
		||||
@ -5,13 +5,16 @@ export default {
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { inject } from "vue";
 | 
			
		||||
import { inject, Ref } from "vue";
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
  id: string;
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
const active = inject("active");
 | 
			
		||||
const slotsChange: Ref<boolean> = inject("slotsChange") as Ref<boolean>;
 | 
			
		||||
slotsChange.value = !slotsChange.value;
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,7 @@ export interface LayTabProps {
 | 
			
		||||
const slot = useSlots();
 | 
			
		||||
const slots = slot.default && slot.default();
 | 
			
		||||
const childrens: Ref<VNode[]> = ref([]);
 | 
			
		||||
const slotsChange = ref(true);
 | 
			
		||||
 | 
			
		||||
const setItemInstanceBySlot = function (nodeList: VNode[]) {
 | 
			
		||||
  nodeList?.map((item) => {
 | 
			
		||||
@ -53,7 +54,6 @@ const active = computed({
 | 
			
		||||
    emit("update:modelValue", val);
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
const slotsChange = ref(true);
 | 
			
		||||
 | 
			
		||||
const change = function (id: any) {
 | 
			
		||||
  // 回调切换标签之前的回调钩子函数,只要不是return false, 则进行切换该tab
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user