掘金私信表情功能布局错位的二三事

1,155 阅读3分钟

我正在参加「掘金·启航计划」

前言

今天掘金web端正式上线了私信功能,迫不及待的去试了下,结果发现表情的排版布局错位。作为一个强迫症患者,这能忍?不行,我得给他改一下。

一、排查问题

image.png
从图直观可以看出,是因为存在某些个表情之间没有间隔导致排版布局错位。

image.png 审查元素,发现了这一段css代码。

.item:nth-child(8n+8) {
    margin-right: 0px;
}
.cYLuAZ .list .item {
    padding-bottom:10px;
    width:28px;
    margin-right:26px;
}

这行代码的意思是:选择器匹配属于其父元素的第 8n+8 个子元素,且该元素的 class 为 item,将它的 margin-right 设置为 0px。

有经验的小伙伴在看到这段css代码时,就知道这样写的目的其实是为了实现一行8个元素,每个元素之间间隔相同,左右两边没有间距的布局。

由图上可以看到,目前第一行只有 7 个元素,第 8 个元素出现在第二行第一个位置,且表情列表右侧出现滚动条。猜测是因为出现滚动条导致宽度变小,所以最后一个元素被挤到下一行了,移除滚动条看看效果:

image.png

可以看出,移除后布局正常。所以,最终得出结论:是因为出现 Y 轴滚动条,导致宽度变小,将每一行最后一个元素挤到下一行导致的排版布局错乱。

二、解决方法

2.1 增加宽度

最简单粗暴的方法,因为多个滚动条宽度占据了表情容器的宽度的,那表情容器宽度接增加滚动条宽度即可。

image.png 由图可以看出,滚动条宽度为17

image.png 容器宽度加上17px后布局正常展示。但是这样也有问题,在没有出现滚动条时,右侧会多出一段空白

2.2 修改 item 的 margin-right

因为 item 的 width 固定, margin-right 也是固定,所以当一整行的 8 个元素的 width + margin-right 超出容器宽度时,会导致换行。那么我们可以把 margin-right 的值改为动态计算的即可

image.png

2.3 使用 grid 布局

使用flex布局时,间距是利用 margin-right 实现 。改使用 gird 布局,可以固定每列的宽度及总共的列数,然后利用 justify-content: space-between实现左右无间隔,中间间隔等分效果。利用 row-gap实现每行的间距。 image.png 使用 grid 布局,

{
    display:grid;
}

将容器分为 8 列,每列宽度为 表情的宽度 :

{
    display:grid;
    grid-template-columns: repeat(828px);
}

使每列按照 space-between 的方式排列 :

{
    display:grid;
    grid-template-columns: repeat(828px);
    justify-content: space-between;
}

添加每行间距 :

{
    display:grid;
    grid-template-columns: repeat(828px);
    justify-content: space-between;
    row-gap:10px;
}

最后,移除 item 的 padding-top 和 margin-right。

不熟悉 grid 布局的同学,可以参考 阮一峰老师的《CSS Grid 网格布局教程》

三、最后

overflow有一个属性值overlay,可以使滚动条悬浮而不占据空间

image.png 但是悬浮会遮住表情的部分,在本次示例中效果不好。因为是此次新 get 到的知识点,所以记录一下。

各位同学如果还有其他解决方式,欢迎评论区留言!