摘要:多行布局下就会导致每行的品牌布局参差不齐,严重影响美观。于是就有了本篇的木桶布局插件。木桶布局的实现是这样分步骤的首先对要填放的内容进行排序,筛选出每一行的元素。
公司最近在重构,使用的是Vue框架。涉及到一个品牌的布局,因为品牌的字符长度不一致,所以导致每一个的品牌标签长短不一。多行布局下就会导致每行的品牌布局参差不齐,严重影响美观。于是就有了本篇的木桶布局插件。
首先对要填放的内容进行排序,筛选出每一行的元素。
再对每一行元素进行修整,使其美观对齐。
分步骤首先获取我们需要的元素、和我们目标容器的宽度。
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:vue-barrel
npm: vue-barrel
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/98779.html
摘要:前端日报精选变量声明与赋值值传递浅拷贝与深拷贝详解浅谈自适应学习比你想象的要简单常见排序算法之实现世界万物诞生记中文深入理解笔记与异步编程译不可变和中的知乎专栏译怎样避免开发时的深坑疯狂的技术宅在翻译网格布局掘金详解改变模糊度亮 2017-08-15 前端日报 精选 ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解浅谈web自适应学习 React.js 比你想象的要简单常见排序算法之...
摘要:如何实现浏览器内多个标签页之间的通信阿里调用等本地存储方式页面可见性可以有哪些用途通过的值检测页面当前是否可见,以及打开网页的时间等在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放网页验证码是干嘛的,是为了解决什么安全问题。 前端面试题总结——综合问题(持续更新中) 1.页面从输入URL到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好) 1.输入域名地址2.发...
摘要:如何实现浏览器内多个标签页之间的通信阿里调用等本地存储方式页面可见性可以有哪些用途通过的值检测页面当前是否可见,以及打开网页的时间等在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放网页验证码是干嘛的,是为了解决什么安全问题。 前端面试题总结——综合问题(持续更新中) 1.页面从输入URL到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好) 1.输入域名地址2.发...
阅读 3470·2021-10-08 10:04
阅读 842·2019-08-30 15:54
阅读 2148·2019-08-29 16:09
阅读 1333·2019-08-29 15:41
阅读 2253·2019-08-29 11:01
阅读 1710·2019-08-26 13:51
阅读 1007·2019-08-26 13:25
阅读 1785·2019-08-26 13:24