110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | |
|   <view class="ss-cube-wrap" :style="[parseAdWrap]">
 | |
|     <view v-for="(item, index) in data.list" :key="index">
 | |
|       <view
 | |
|         class="cube-img-wrap"
 | |
|         :style="[parseImgStyle(item), { margin: data.space + 'px' }]"
 | |
|         @tap="sheep.$router.go(item.url)"
 | |
|       >
 | |
|         <image class="cube-img" :src="sheep.$url.cdn(item.imgUrl)" mode="aspectFill"></image>
 | |
|       </view>
 | |
|     </view>
 | |
|   </view>
 | |
| </template>
 | |
| <script setup>
 | |
|   /**
 | |
| /**
 | |
|  * 广告魔方
 | |
|  *
 | |
|  * @property {Array<Object>} list 			- 魔方列表
 | |
|  * @property {Object} styles 				- 组件样式
 | |
|  * @property {String} background 			- 组件背景色
 | |
|  * @property {Number} topSpace 				- 组件顶部间距
 | |
|  * @property {Number} bottomSpace 			- 组件底部间距
 | |
|  * @property {Number} leftSpace 			- 容器左间距
 | |
|  * @property {Number} rightSpace 			- 容器右间距
 | |
|  * @property {Number} imgSpace 				- 图片间距
 | |
|  * @property {Number} imgTopRadius 			- 图片上圆角
 | |
|  * @property {Number} imgBottomRadius 		- 图片下圆角
 | |
|  *
 | |
|  */
 | |
| 
 | |
|   import { computed, inject, unref } from 'vue';
 | |
|   import sheep from '@/sheep';
 | |
| 
 | |
|   // 参数
 | |
|   const props = defineProps({
 | |
|     data: {
 | |
|       type: Object,
 | |
|       default() {},
 | |
|     },
 | |
|     styles: {
 | |
|       type: Object,
 | |
|       default() {},
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   // 单元格大小
 | |
|   const windowWidth = sheep.$platform.device.windowWidth;
 | |
|   const cell = computed(() => {
 | |
|     return (
 | |
|       (windowWidth -
 | |
|         ((props.styles.marginLeft || 0) + (props.styles.marginRight || 0) + (props.styles.padding || 0) * 2)) /
 | |
|       4
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   //包裹容器高度
 | |
|   const parseAdWrap = computed(() => {
 | |
|     let heightArr = props.data.list.reduce(
 | |
|       (prev, cur) => (prev.includes(cur.height + cur.top) ? prev : [...prev, cur.height + cur.top]),
 | |
|       [],
 | |
|     );
 | |
|     let heightMax = Math.max(...heightArr);
 | |
|     return {
 | |
|       height: heightMax * cell.value + 'px',
 | |
|       width:
 | |
|         windowWidth -
 | |
|         (props.data?.style?.marginLeft +
 | |
|           props.data?.style?.marginRight +
 | |
|           props.styles.padding * 2) *
 | |
|           2 +
 | |
|         'px',
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   // 解析图片大小位置
 | |
|   const parseImgStyle = (item) => {
 | |
|     let obj = {
 | |
|       width: item.width * cell.value - props.data.space + 'px',
 | |
|       height: item.height * cell.value - props.data.space + 'px',
 | |
|       left: item.left * cell.value + 'px',
 | |
|       top: item.top * cell.value + 'px',
 | |
|       'border-top-left-radius': props.data.borderRadiusTop + 'px',
 | |
|       'border-top-right-radius': props.data.borderRadiusTop + 'px',
 | |
|       'border-bottom-left-radius': props.data.borderRadiusBottom + 'px',
 | |
|       'border-bottom-right-radius': props.data.borderRadiusBottom + 'px',
 | |
|     };
 | |
|     return obj;
 | |
|   };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .ss-cube-wrap {
 | |
|     position: relative;
 | |
|     z-index: 2;
 | |
|     width: 750rpx;
 | |
|   }
 | |
| 
 | |
|   .cube-img-wrap {
 | |
|     position: absolute;
 | |
|     z-index: 3;
 | |
|     overflow: hidden;
 | |
|   }
 | |
| 
 | |
|   .cube-img {
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|   }
 | |
| </style>
 |