<!-- 装修图文组件:广告魔方 --> <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>