js实现流式布局

2 篇文章 0 订阅
1 篇文章 0 订阅

1. CSS样式

 			/*使用通配符将内外边距都设置为零, 这样看着好看*/
            * {
                margin: 0px;
                padding: 0px;
            }
            /*将主容器的布局方式设置为相对布局,一下方式可设置container为水平居中,详见:[https://blog.csdn.net/weixin_49074984/article/details/109128659] */
            #container {
                position: relative;
                left: 0;
                right: 0;
                top: 0;
                bottom: 0;
                margin: auto;
            }
            /*定制box尺寸*/
            .box {
                padding: 7px;
                float: left;
                box-sizing: border-box;
                width: 212px;  /* 图片尺寸+wrapper内边距+box内边距 */
            }
            /*将承载图片的容器定制颜色及边框大小和圆角*/
            .wrapper {
                padding: 5px;
                box-shadow: 0 0 5px #ccc;
                border-radius: 5px;
            }
            .pic {
                font-size: 0; /*消除行内元素的间隙*/
            }
            .pic img {
                width: 100%;
                height: auto;
            }
            .wrapper > p {
                color: #999;
                background: #FAFAFA;
                font-size: 14px;
                padding-top: 5px;
            }

2. html结构

			<div id="container">
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/1.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/2.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/3.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/4.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/5.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/6.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/7.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/8.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/9.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/10.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/11.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
                <div class="box">
                    <div class="wrapper">
                        <div class="pic">
                            <img src="imgs/12.jpg">
                        </div>
                        <p>此处为文字说明</p>
                    </div>
                </div>
            </div>

3. js代码

  window.onload = function() { // 一定要页面加载完成再调用
                waterFall.init('container', 'box');
            }
            
            window.onresize = function() {
                waterFall.init('container', 'box');
            }

            var waterFall = {
                init: function(container, box) {
                    var windowWidth = window.innerWidth;
                    var oContainer = document.getElementById(container);
                    oContainer.style.width = windowWidth > 1200 ? 1200 + 'px' : windowWidth + 'px';
                    var oBoxs = oContainer.getElementsByClassName(box);
                    var boxWidth = oBoxs[0].offsetWidth;
                    var containerWidth = oContainer.offsetWidth;
                    var col = containerWidth / boxWidth; // box列数
                    var arrHeight = []; // 用来记录每列已添加box的高度
                    for (var i = 0; i < oBoxs.length; i++) {
                        oBoxs[i].style.position = "absolute"; // 给每个box定义布局方式为绝对布局
                        var boxHeight = oBoxs[i].offsetHeight;
                        if (i < col - 1) { // 第一行
                            arrHeight.push(oBoxs[i].offsetHeight);
                            oBoxs[i].style.top = 0;
                            oBoxs[i].style.left = i * boxWidth + 'px';
                        } else {
                            var minBoxHeight = Math.min.apply(null, arrHeight); // 求出arrHeight中最小高度的那一列
                            var index = this.getIndex(minBoxHeight, arrHeight); // 获取以上最小高度那列的索引
                            oBoxs[i].style.top = minBoxHeight + 'px';
                            oBoxs[i].style.left = boxWidth * index + 'px';
                            arrHeight[index] += oBoxs[i].offsetHeight; // 由于已添加box,所以此处更新arrHeight中已添加box那一列的高度值
                        }
                    }
                },
                getIndex: function(val, arr) { // 得到索引
                    for (var i = 0 ; i < arr.length; i++) {
                        if (val == arr[i]) {
                            return i
                        }
                    }
                }
            }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp是一个基于Vue.js的跨平台开发框架,可以用于开发iOS、Android、H5等多个平台的应用程序。在UniApp中实现多行多列图片流式布局可以通过使用flex布局和动态计算图片宽度来实现。 以下是一种实现多行多列图片流式布局的方法: 1. 使用flex布局:在父容器上设置display为flex,同时设置flex-wrap为wrap,这样子元素就可以自动换行了。 2. 动态计算图片宽度:为了实现多列布局,需要根据容器的宽度和每行的列数来计算每个图片的宽度。可以通过获取容器的宽度,然后除以列数得到每个图片的宽度。 3. 图片高度自适应:为了保持图片的比例,可以设置图片的高度为auto,这样图片的高度会根据宽度自适应。 下面是一个示例代码: ```html <template> <div class="container"> <div class="item" v-for="image in images" :key="image.id"> <img :src="image.url" :style="{ width: itemWidth + 'px', height: 'auto' }" /> </div> </div> </template> <script> export default { data() { return { images: [ { id: 1, url: 'image1.jpg' }, { id: 2, url: 'image2.jpg' }, { id: 3, url: 'image3.jpg' }, // 更多图片... ], columnCount: 3, // 列数 itemWidth: 0, // 每个图片的宽度 }; }, mounted() { this.calculateItemWidth(); window.addEventListener('resize', this.calculateItemWidth); }, beforeDestroy() { window.removeEventListener('resize', this.calculateItemWidth); }, methods: { calculateItemWidth() { const containerWidth = this.$el.offsetWidth; this.itemWidth = Math.floor(containerWidth / this.columnCount); }, }, }; </script> <style> .container { display: flex; flex-wrap: wrap; } .item { margin-bottom: 10px; } </style> ``` 这样就可以实现一个简单的多行多列图片流式布局。你可以根据实际需求调整列数和样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值