博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue木桶布局插件
阅读量:6689 次
发布时间:2019-06-25

本文共 2124 字,大约阅读时间需要 7 分钟。

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

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

分步骤

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

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

Vue组件容器:

二、再者我们需要获取容器和容器宽度
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:

npm:

转载地址:http://fwuoo.baihongyu.com/

你可能感兴趣的文章
参加51CTO学院软考培训,我通过啦
查看>>
维护机房里的电脑要掌握哪些知识
查看>>
利用 VMware 技术构建超融合平台 第 1 部分
查看>>
ONOS系统架构之高可用实现方案的演进
查看>>
windows 2008 修改ilo密码
查看>>
Windows AD证书服务系列---证书的使用范围(3)
查看>>
ps、firewords在win78中无法直接拖入的问题解决方法
查看>>
android-------非常好的图片加载框架和缓存库(Picasso)
查看>>
Titanium, PhoneGap, Sencha Touch, jQuery Mobile – Clearing up confusion
查看>>
eclipse如何部署Web工程到tomcat中
查看>>
在CentOS7上安装JDK1.8
查看>>
搜索和网页排名的数学原理
查看>>
Xcode项目中同一个名称不同位置 简单修改
查看>>
java设计模式-建造者模式
查看>>
oracle笔记
查看>>
ContentProvider数据更新
查看>>
Java 关于Ajax的实例--验证用户名(四)
查看>>
入字节码 -- ASM 关键接口 MethodVisitor
查看>>
如何在Centos 6 X86_64安装RHEL EPEL知识库?
查看>>
spring-util命名空间
查看>>