sadjv3_user/components/skeleton-ui/components/waterfall.vue

138 lines
2.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view :style="mixinVariableStr" class="waterfall h-flex-x h-flex-2 h-flex-top">
<view style="padding-right: 16rpx;">
<view class="item" v-for="(item,index) in leftList" :key="index">
<view class="img" :style="{
'height':item.height
}"></view>
<view class="name"></view>
<view class="desc"></view>
</view>
</view>
<view style="padding-left: 16rpx;">
<view class="item" v-for="(item,index) in rightList" :key="index">
<view class="img" :style="{
'height':item.height
}"></view>
<view class="name"></view>
<view class="desc"></view>
</view>
</view>
</view>
</template>
<script>
import cssVariable from "../mixin/css-variable.js";
export default {
mixins:[cssVariable],
props:{
imgHeight:{
type: String,
default:"300rpx"
},
waterfall:{
type: Boolean,
default:true
},
length:{
type: Number | String,
default:"10"
},
},
computed:{
},
data() {
return {
leftList:[],
rightList:[],
};
},
created() {
this.createList();
},
methods:{
createList(){
let length = Number(this.$props.length) || 10;
let height = parseInt(this.$props.imgHeight,10);
// 校验是否为 rpx 单位
let isRpx = /rpx/.test(this.$props.imgHeight);
let [leftArr,rightArr] = [[],[]];
let [leftHeight,rightHeight] = [0,0];
for(let i=0;i<length;i++){
let nowHeight = height;
// 开启了瀑布流则随机生成高度差
if(this.$props.waterfall){
// 运算符用于决定 增加 减小 图片的高度
let operator = Math.random();
// 生成一个 0 ~ 30 的随机整数rpx 单位则双倍
let tempHeight = Math.floor(Math.random()*(isRpx ? 100 : 50));
if(operator >= 0.5){
nowHeight+=tempHeight;
}else{
nowHeight-=tempHeight;
}
}
// nowHeight = isRpx ? `${nowHeight}rpx` : `${nowHeight}px`;
if(rightHeight < leftHeight){
rightArr.push({
height:isRpx ? `${nowHeight}rpx` : `${nowHeight}px`
});
rightHeight+=nowHeight;
}else{
leftArr.push({
height:isRpx ? `${nowHeight}rpx` : `${nowHeight}px`
});
leftHeight+=nowHeight;
}
}
this.leftList = leftArr;
this.rightList = rightArr;
}
}
}
</script>
<style lang="scss" scoped>
@import "../libs/global.scss";
.waterfall{
background-color: var(--background);
.item{
position: relative;
& + .item{
margin-top: 32rpx;
}
.img{
background-color: var(--general);
border-radius: 16rpx;
}
.name{
background-color: var(--general);
margin-top: 12rpx;
width: 60%;
height: 24rpx;
border-radius: 0;
margin-left: 12rpx;
}
.desc{
background-color: var(--general);
margin-top: 8rpx;
width: 40%;
height: 18rpx;
border-radius: 0;
margin-left: 12rpx;
}
}
}
</style>