mall-uniapp/sheep/components/s-image-cube/s-image-cube.vue

111 lines
2.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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