资讯专栏INFORMATION COLUMN

Vue木桶布局插件

hersion / 1907人阅读

摘要:多行布局下就会导致每行的品牌布局参差不齐,严重影响美观。于是就有了本篇的木桶布局插件。木桶布局的实现是这样分步骤的首先对要填放的内容进行排序,筛选出每一行的元素。

    公司最近在重构,使用的是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

相关文章

  • 大搜车面试总结

    摘要:面试总结工作久了有时候也需要出去看看。前几天大搜车的约了面试,就记录一下关于这次面试的具体内容。给出大致思路,参数回调函数事件。采用去触发事件,在组件注册相应的事件来达到交互的目的。 面试总结 工作久了有时候也需要出去看看。 前几天大搜车的hr约了面试,就记录一下关于这次面试的具体内容。 一、笔试 先填写了个人信息,第一步就是笔试。 哪种盒模型包含padding header中哪种标...

    ziwenxie 评论0 收藏0
  • 2017-08-15 前端日报

    摘要:前端日报精选变量声明与赋值值传递浅拷贝与深拷贝详解浅谈自适应学习比你想象的要简单常见排序算法之实现世界万物诞生记中文深入理解笔记与异步编程译不可变和中的知乎专栏译怎样避免开发时的深坑疯狂的技术宅在翻译网格布局掘金详解改变模糊度亮 2017-08-15 前端日报 精选 ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解浅谈web自适应学习 React.js 比你想象的要简单常见排序算法之...

    xinhaip 评论0 收藏0
  • 前端面试题总结——综合问题(持续更新中)

    摘要:如何实现浏览器内多个标签页之间的通信阿里调用等本地存储方式页面可见性可以有哪些用途通过的值检测页面当前是否可见,以及打开网页的时间等在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放网页验证码是干嘛的,是为了解决什么安全问题。 前端面试题总结——综合问题(持续更新中) 1.页面从输入URL到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好) 1.输入域名地址2.发...

    Lin_YT 评论0 收藏0
  • 前端面试题总结——综合问题(持续更新中)

    摘要:如何实现浏览器内多个标签页之间的通信阿里调用等本地存储方式页面可见性可以有哪些用途通过的值检测页面当前是否可见,以及打开网页的时间等在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放网页验证码是干嘛的,是为了解决什么安全问题。 前端面试题总结——综合问题(持续更新中) 1.页面从输入URL到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好) 1.输入域名地址2.发...

    elarity 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<