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