美文网首页
样式实现瀑布流布局

样式实现瀑布流布局

作者: 似朝朝我心 | 来源:发表于2021-05-11 16:26 被阅读0次

本来想实现瀑布流布局的,弄了一晚上,都没搞明白哪里出问题了,才发现uni-app提供的image是个组件而不是标签,被坑死了,这才导致了方案一和方案二这种垂直水平的布局效果,想要实现瀑布流布局,应将image组件替换为img标签,(方案三)。(方案四:是使用JS实现瀑布流,详解)

方案一:column 多行布局实现垂直水平布局

只能实现同一高度对其,不能实现一高一矮的那种偏差对其效果。

<template>
    <view class="container">
        <view class="image-box" v-for="(item,index) in imageList" :key="index">
            <image class="image" :src="item.imgUrl" mode="aspectFill"></image>
        </view> 
    </view>
</template>

<script>
    export default {
        data () {
            return {
                imageList:[
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl:require('../../static/images/img7.jpg')
                    }
                ]
            }
        }
    }
</script>

<style lang="scss" scoped>
     .container {
                margin: 10upx;
                column-count: 3; /*分多少列*/
                column-gap: 10upx; /*列于列之间的距离*/
                .image-box {
                    margin-bottom: 10upx;
                    height: 300upx; /*图片盒子固定高度*/
                    .image{
                        width: 100%;
                        height:100%; /* 我的图片是220x300px */
                    }
                }   
            }   
</style>

方案二:万能的flex 弹性布局实现垂直水平布局

不过也只能实现同一高度对齐的效果。

每一列的宽度可用 calc 函数来设置,即 width: calc(100%/3 - 10upx)。分成等宽的 3 列减掉左右两遍的 margin 距离。

HTML代码无更改,修改样式即可。

<style lang="scss" scoped>
    .container {
        display: flex;
        flex-wrap: wrap;
        // height: 100vh;
        height: 100%;

        .image-box {
            margin: 10upx;
            height: 320upx;
            width: calc(100%/3 - 20upx);/*分成等宽的3列减掉左右两遍的margin距离。*/

            .image {
                width: 100%;
                height: 100%;
            }
        }

    }
</style>

效果图:



方案三:column多行布局实现瀑布流布局

首先采用统一宽度的图片,高度不限制。

以iphone6为标准,整个屏幕是750upx,我们要分成三列,也就是每列250upx,又因为多出3个列间距,所以还要减去三个列间距(我这里列间距是10upx),所以每张图片的宽度应该为240upx。

<template>
    <view class="container">
        <view class="image-box" v-for="(item,index) in imageList" :key="index">
            <img class="image" :src="item.imgUrl" alt="">
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                imageList: [{
                        imgUrl: require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img8.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img9.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img10.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img11.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img12.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img2.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img8.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img8.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img9.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img10.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img11.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img12.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img10.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img12.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img10.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img6.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img7.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img12.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img11.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img5.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img11.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img7.jpg')
                    }
                ]
            }
        }
    }
</script>

<style lang="scss" scoped>
    .container {
        margin: 5upx;
        column-count: 3;/*分多少列*/
        column-gap: 10upx;/*列于列之间的距离*/
        .image-box {
            margin-bottom: 5upx;
            width: 240upx; /* 750/3 - 3*10  */
            .image {
                width: 100%;
                height: 100%;
            }
        }
    }
</style>

方案四:使用js逻辑实现瀑布流布局

瀑布流布局的最大特点就是每个板块都等宽不等高。

HTML框架部分:

<template>
    <view id="container">
        <view class="float-box" v-for="(item,index) in imageList" :key="index">
            <view class="image-box">
                <img class="image" :src="item.imgUrl" alt="">
            </view>
        </view>
    </view>
</template>

container样式是我们的最外围的大容器,也叫大盒子,这个不用解释。
float-box样式,是我们的浮动盒子,他是用来控制调整我们的边距空白距离。



image-box样式用来修饰图片的边框、阴影。


图片数据导入:

data() {
            return {
                imageList: [{
                        imgUrl: require('../../static/images/img1.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img3.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img13.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img4.jpg')
                    },
                    {
                        imgUrl: require('../../static/images/img5.jpg')
                    },
                    //........图片过多,不一一在这里展示了,大家按照这个模板加图片就好
                ]
            }
        }

scss样式布局部分:

首先需要给大盒子container一个相对定位,因为其他板块都是相对于他来进行布局的,而其他板块(照片)采用绝对定位(这一部分在JS逻辑立马实现)。

给float-box盒子设定边距,让板块(照片)之间都相互拉开一些距离。
有因为view标签相当于div标签,是独占一行展示,需要使用float浮动让他们在一行上显示。

image-box盒子进行图片描绘、填充、边框、阴影、圆角。

<style lang="scss" scoped>
    #container {
        position: relative; 
        .float-box {
            float: left;
            padding: 15upx 0 0 15upx;
            
            .image-box {
                padding: 10upx;
                border: 1upx solid #ccc;
                box-shadow: 0 0 5upx #ccc;
                border-radius: 5upx;

                .image {
                    width: 165upx;
                    height: auto;
                }
            }
        }
    }
</style>

现在我们来看一下基本的呈现效果。



我们会看到板块参差不等的排布,接下来我们就需要JS去操作了。


相关文章

  • 瀑布流布局 的学习

    1- 实现瀑布流布局效果 瀑布流效果瀑布流代码木桶布局效果木桶布局代码瀑布流布局 2- 实现一个新闻瀑布流新闻...

  • 瀑布流布局_木桶布局

    题目1: 实现一个瀑布流布局效果 瀑布流 题目2:实现木桶布局效果 木桶布局 题目3:**实现一个新闻瀑布流新闻网...

  • 瀑布流

    什么是瀑布流: 欣赏 pinterest 样式分析 瀑布流,又被称作为瀑布流式布局,是一种比较流行的网站页面布局方...

  • 瀑布流布局

    题目1: 实现一个瀑布流布局效果瀑布流代码题目2:实现木桶布局效果木桶布局代码题目3:实现一个新闻瀑布流新闻网站,...

  • iOS UICollectionView的各种用法(各种规则的瀑

    使用UICollectionView可以布局各种各样的瀑布流,下面我写了两种不同布局的瀑布流样式如下显示 此后还会...

  • 瀑布流和懒加载结合

    实现一个瀑布流布局效果 瀑布流

  • CHTCollectionViewWaterfallLayout

    瀑布流已经是现在很常用的布局样式,用collectionView就可以很方便的实现,现在github上star最多...

  • 「实战」蘑菇街 PC 端首页,瀑布流布局的实现原理与细节技巧

    零、介绍 这篇文章主要是介绍网站页面瀑布流布局的实现,主要包括: 瀑布流是什么 瀑布流的实现原理 瀑布流的使用场景...

  • 瀑布流布局

    瀑布流布局 实现一个瀑布流布局效果 预览 根据课程视频实现一个新闻瀑布流新闻网站,查看效果

  • 瀑布流布局

    题目1:实现一个瀑布流布局效果 jsbin-实现瀑布流布局 题目2:根据课程视频实现一个瀑布流新闻网站,查看效果 ...

网友评论

      本文标题:样式实现瀑布流布局

      本文链接:https://www.haomeiwen.com/subject/xhfolltx.html