| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | <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>
 |