首页 技术 正文
技术 2022年11月18日
0 收藏 827 点赞 4,811 浏览 1839 个字

    公司最近在重构,使用的是Vue框架。涉及到一个品牌的布局,因为品牌的字符长度不一致,所以导致每一个的品牌标签长短不一。多行布局下就会导致每行的品牌布局参差不齐,严重影响美观。于是就有了本篇的木桶布局插件。

木桶布局的实现是这样分步骤的:
  1. 首先对要填放的内容进行排序,筛选出每一行的元素。
  2. 再对每一行元素进行修整,使其美观对齐。

分步骤

一、根据需要选出每行的元素

    首先获取我们需要的元素、和我们目标容器的宽度。

Vue组件容器:


<template>
<div ref="barrel"> <slot></slot> </div>
</template>
二、再者我们需要获取容器和容器宽度
this.barrelBox = this.$refs.barrel;this.barrelWidth = this.barrelBox.offsetWidth;
三、接着循环我们的元素,根据不同的元素的宽度进行分组。

ps:对于元素的宽度获取的时候我们需要对盒模型进行区分。

Array.prototype.forEach.call(items, (item) => {            paddingRight = 0;            paddingLeft = 0;            marginLeft = parseInt(window.getComputedStyle(item, "").getPropertyValue('margin-left'));            marginRight = parseInt(window.getComputedStyle(item, "").getPropertyValue('margin-right'));            let boxSizing = window.getComputedStyle(item, "").getPropertyValue('box-sizing');            if (boxSizing !== 'border-box') {                paddingRight = parseInt(window.getComputedStyle(item, "").getPropertyValue('padding-right'));                paddingLeft = parseInt(window.getComputedStyle(item, "").getPropertyValue('padding-left'));            }            widths = item.offsetWidth + marginLeft + marginRight + 1;            item.realWidth = item.offsetWidth - paddingLeft - paddingRight + 1;            let tempWidth = rowWidth + widths;            if (tempWidth > barrelWidth) {                dealWidth(rowList, rowWidth, barrelWidth);                rowList = [item];                rowWidth = widths;            } else {
rowWidth = tempWidth; rowList.push(item); } })
四、接着是对每一组的元素进行合理分配。

const dealWidth = (items, width, maxWidth) => {let remain = maxWidth - width;let num = items.length;let remains = remain % num;let residue = Math.floor(remain / num);items.forEach((item, index) => { if (index === num - 1) { item.style.width = item.realWidth + residue + remains + 'px'; } else { item.style.width = item.realWidth + residue + 'px'; }})

}

    我这边是采用的平均分配的方式将多余的宽度平均分配到每一个元素里。如一行中全部元素占800px,有8个元素,该行总长为960px。则每行增加的宽度为(960-800)/8=16,每个与元素宽度增加16px;
    值得注意的是,js在获取元素宽度的时候会存在精度问题,所以需要进行预设一个像素进行缓冲。

以下是我的代码地址

Github:vue-barrel

npm: vue-barrel

原文地址:https://segmentfault.com/a/1190000016829062

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,813