介绍
之前写过两篇文章,别离解说了Flex布局和网格布局。而后有很多人反馈说。网格布局没有场景,学会Flex布局就能够了。
明天这篇文章就通过一个例子来解说一下网格布局的劣势。并不是说Flex布局无奈实现。而是说在某些场景下应用Flex布局逻辑会不清晰,代码会简单很多。
手机桌面的小组件
明天要举的例子就是从手机桌面下面来的。当初的手机桌面上,能够自定义的放一些App图标,也能够增加很多小组件。就拿我的苹果手机来举例。一个桌面,它会有4列的图标,而后在这些桌面上能够任意增加小组件。小组件可能是一行4列或者是两行两列等各种状况。
如果咱们用前端页面来实现这种成果的话,该怎么做呢?
Flex实现
大家能够先本人想想看这种布局用Flex该怎么实现。
如果应用Flex布局的形式来实现这个需要。咱们会发现应用Flex布局会很麻烦,须要用js去提前计算,以后行是否存在一行多列的组件,或者多行一列的组件。得出布局构造后,再去做第一层的div
,以及第二层div
。
这里的逻辑太麻烦,我就不写了。有趣味能够本人去尝试写写看。
Grid实现
首先会有一个父节点。他是一个是列多行的网格容器。为了防止留下空白,咱们设置主动布局算法为dense
。
<div class="grid-box" id="box"></div>
上面是CSS:
.grid-box { border: 1px solid #999; width: 200px; height: 400px; display: grid; margin: 20px; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(8, 1fr); gap: 6px; padding: 6px; grid-auto-flow: dense;}.grid-box > div { background-color: bisque; border-radius: 4px; border: 1px solid #ccc;}
假如桌面的图标或小组件,能够抉择1x1,1x2,2x1,2x2四种成果。所以咱们能够先设置三种大小的子节点空间,因为默认是1x1,所以1x1不须要独自这种。有了这几个class
咱们创立子节点的时候,只有往上面增加这个对应的class
就能实现对应的成果。
.grid-box-item-1 { grid-column-end: span 2; /* 1x2 */}.grid-box-item-2 { grid-row-end: span 2; /* 2x1 */}.grid-box-item-3 { /* 2x2 */ grid-column-end: span 2; grid-row-end: span 2;}
因为要管制随机地位,网格布局并不像Flex布局那样,能够指定子节点的程序。所以这个子节点要通过JS往容器append
。
function randomItem() { let styleArr = [0,0,0,0,1,1,2,3]; let itemsEl = ''; for (let i = 0; i < styleArr.length; i++) { itemsEl += `<div class="grid-box-item-${styleArr[i]}">${i}</div>`; } boxEl.innerHTML = itemsEl;}randomItem();
成果如图:
最初咱们对款式数组做一个随机。
function randomItem() { let styleArr = [0,0,0,0,1,1,2,3]; styleArr = styleArr.sort(() => { return Math.random() > 0.5 ? 1 : -1; }); // ...}
当咱们每次从新调用randomItem
办法之后,都会对子节点做一个随机的摆放。成果如图:
总结
还是下面的例子,如果布局构造是固定的,那么应用Flex布局其实也不简单,然而一有变动,Flex就简单了。
能够看出,应用Flex可能疾速解决大部分的场景了,这个也就是之前很多人评论的,找不到应用Grid布局的场景,没必要学Grid布局。
然而一旦遇到一些非凡不状况,不晓得Grid布局,就只能应用Flex,那么代码就会又臭又长。
完结
好了,本文到此结束,心愿本文对你有所帮忙 :-)
最近新弄了一个公粽号:写代码的浩,求关注 。前面会逐渐把把握的前端常识以及职场常识积淀下来。
如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。