深挖 Threads App 帖子布局,我进一步加深了对CSS网格布局的理解

6febbd7b210eae2766ac4a0fc83aa746.jpeg

ed8b6e24229e73b41a20e3958260411b.png

当我遇到一个新产品时,我首先想到的是他们如何实现CSS。当我遇到Meta的Threads时也不例外。我很快就探索了移动应用程序,并注意到我可以在网页上预览公共帖子。

这为我提供了一个深入挖掘的机会。我发现了一些有趣的发现,我将在本文中讨论。

让我们深入了解吧!

使用CSS Grid进行帖子布局

在生产应用程序中,CSS Grid的最显着的用例之一就是Threads。CSS Grid用于构建帖子布局。

看一下:

6b492f4f6f981e2a11fad258f92bb90e.png

:root {--barcelona-threadline-column-width: 48px;
}.post {display: grid;grid-template-columns:var(--barcelona-threadline-column-width)minmax(0, 1fr);grid-template-rows: 21px 19px max-content max-content;
}

有趣的事实:第一列网格被命名为--barcelona。我很好奇选择这个名字的原因。

帖子布局由2列* 4行网格组成。没有主容器;使用grid-column和grid-row属性手动放置帖子中的每个项目

用户头像

.post-avatar {padding-top: 4px;grid-row: 1 / span 2;grid-column: 1;
}

头像位于第一列中,跨越了前两行。值得注意的是存在padding-top。虽然我在生产代码中找不到具体原因,但它似乎是对UI对齐进行微调。

这是带有和不带有padding-top处理的头像的前后外观:

2924d468cef762f88b5c1c152753fa84.png

应用padding-top的另一个原因可能是将头像下移并使其更接近线条。

dfd6d203e0066efc31b6b6c8a134ada7.png

对网格行使用奇数值

奇数值作为网格行的高度是出于什么考虑?经过进一步检查,似乎是对用户界面进行微调的一种方式。行高的总和为40px,这包括头像的高度和padding-top(36px + 4px)。

5cba05d7e748266a3ad9a27bfc6ddb83.png

可能会好奇为什么这些值没有标准化。设计系统通常被认为是设计师必须严格遵循预定义的UI元素规则的信仰。

然而,这个例子表明,使用手动调整的值是可以接受的。在某些情况下,从严格的准则中偏离是可以接受的。

使用固定大小行的限制

由于前两行的固定宽度,无法向它们添加填充。然而,只要您意识到这个限制,就可以通过使用边距来解决。

以下是一个例子:

24b55000c166e23933c91ebad3373ce0.png

由于行大小固定,添加顶部和底部填充不会影响帖子标题。

 布局列之间的空间感觉有点乱

目前布局列之间的间隔为零。相反,图像的大小为36 * 36像素,而其容器的宽度为48像素。

734086cbe1fbbc1068c9a4d622d02919.png

这样可以模拟这里的间距。我不知道为什么团队会选择这种方法,但我更喜欢使用gap属性。

为什么不使用命名的CSS网格区域呢?

根据我目前观察到的情况,有三种网格布局变体,它们都可以受益于使用命名网格区域。

我尝试复制网格并基于命名区域构建它。与指定列和行的值相比,它看起来更容易扫描。

为了证明这一点,让我们为布局中的每个项目分配一个grid-area:

.AvatarContainer {grid-area: avatar;
}.HeaderContainer {grid-area: header;
}.BodyContainer {grid-area: body;
}.ThreadlineContainer {grid-area: line;
}.FooterContainer {grid-area: footer;
}

方式一:默认

825ecca8f7833c2a34612706a44e03f0.png

.post {display: grid;grid-template-columns:var(--barcelona-threadline-column-width)minmax(0, 1fr);grid-template-rows: 21px 19px max-content max-content;grid-template-areas:"avatar header""avatar body"". body"". footer";
}

注意使用 .来表示空白区域。

变化2:回复

变化是指某人回复另一个人的情况。

1a660b1035c2d83b85184f9051802714.png

.post--reply {grid-template-rows: 36px 0 max-content max-content;grid-template-areas:"avatar header""body body""body body""footer footer";
}

变化3:螺纹连接细线

337f95b3588108a851d0ed143a2f4e06.png

.post--withLine {grid-template-areas:"avatar header""avatar body""line body""footer footer";
}

这里使用命名网格区域使得只需在一个地方进行编辑就可以更改布局。

SVG细线处理

说实话,最初吸引我注意的是Threads应用程序中的线条。我对它的构造方式感到好奇,因为几周前我曾写过一个类似的主题。

请参见下图:

d320398ca5534a4c8f46e383fac5f409.png

连接我的头像和马克的头像的那条线是一条 SVG 路径。它由三部分组成。

b26cdd78ad26fc2f2c9d37554d44b94a.png

第一部分的长度是用 JavaScript 计算的。

网格的内联CSS变量

我很高兴看到像Threads这样的大型应用程序正在使用我和许多其他人提倡的东西。

在用户个人资料中,选项卡网格布局是使用包含选项卡数的内联CSS变量构建的。

81a8d5dd57aeaca22c77cd0cc54d558c.png

很有用。当选项卡数量增加时,我们只需要更改CSS变量的值。很简洁,对吧?

溢出换行

我注意到在帖子正文中使用了overflow-wrap: anywhere。我以前没有使用过或听说过这个关键词。我使用break-word。

根据MDN的说法,它与break-word相同,但有一个额外的东西:

计算最小内容内在大小时,考虑了单词折断引入的软换行机会。

我仍然没有发现使用break-word和anywhere之间的区别。如果Threads团队中有任何人正在阅读这篇文章,我非常好奇为什么。

动态视口单位的使用

我喜欢在启动画面中使用动态视口单位dvh。

1e07f6d9e37dc7c539674d03506ff91a.png

防御性的CSS策略

为了确保flexbox布局不会因为最小内容长度而破裂,使用min-width: 0来重置该行为。

0ac1c07faabfb57302109ac0527d58aa.png

结论

今天就到这里。我喜欢检查CSS并了解Threads团队如何构建产品。我相信还有很多东西我没有注意到,因为这只是Web上的预览版本。

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77223.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis BigKey案例

面试题: 阿里广告平台,海量数据里查询某一固定前缀的key小红书,你如何生产上限制keys*/flushdb/flushall等危险命令以防止误删误用?美团,MEMORY USAGE命令你用过吗?BigKey问题,多大算big&#…

webpack基础知识七:说说webpack proxy工作原理?为什么能解决跨域?

一、是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实现代理首先需要一个中间服务器,webpac…

web爬虫第五弹 - JS逆向入门(猿人学第一题)

0- 前言 爬虫是一门需要实战的学问。 而对于初学者来说,要想学好反爬,js逆向则是敲门砖。今天给大家带来一个js逆向入门实例,接下来我们一步一步来感受下入门的逆向是什么样的。该案例选自猿人学练习题。猿人学第一题 1- 拿到需求 进入页面…

记录--一个好用的轮子 turn.js 实现仿真翻书的效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库&#xff0…

MySQL — 存储引擎

文章目录 存储引擎存储引擎类型InnoDBMyISAMMEMORY 存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种。这篇文章主要是对其进行简单的介绍。 存储引擎 MySQL可插…

linux下绑定进程到指定CPU的操作方法

taskset简介 # taskset Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on ex…

ensp-GVRP服务

ensp-GVRP服务 日期:6-26 📎GVRP实验.zip📎GVRP服务.docx

快速WordPress个人博客并内网穿透发布到互联网

快速WordPress个人博客并内网穿透发布到互联网 文章目录 快速WordPress个人博客并内网穿透发布到互联网 我们能够通过cpolar完整的搭建起一个属于自己的网站,并且通过cpolar建立的数据隧道,从而让我们存放在本地电脑上的网站,能够为公众互联网…

group normalization

1、 Theory look for this link for more information, actually only this image can illustrate the group normalization.you can ignore the rest of this artical. 2、 Code check this link for detailed about the formulation and the theory of the group normalzi…

如何发布自己的npm包

发布一个简单的npm包 首先创建一个文件夹(唯一的命名)创建package.json包,输出npm init,一直回车就好。创建index.js文件,向外暴露方法。 将包上传或更新到 npm 执行登录命令:npm login 登录npm官网&…

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<

开源免费用|Apache Doris 2.0 推出跨集群数据复制功能

随着企业业务的发展&#xff0c;系统架构趋于复杂、数据规模不断增大&#xff0c;数据分布存储在不同的地域、数据中心或云平台上的现象越发普遍&#xff0c;如何保证数据的可靠性和在线服务的连续性成为人们关注的重点。在此基础上&#xff0c;跨集群复制&#xff08;Cross-Cl…

【QT调用ST-link-使用QT编写程序-调用ST-LINK_CLI.exe-烧写STM32F4xxx-基础样例】

【QT结合ST-link&#xff0c;使用QT编写程序&#xff0c;调用ST-LINK_CLI.exe,烧写STM32F4xxx-基础样例】 1、前言2、实验环境3、先前了解-自我总结4、实验过程&#xff08;0&#xff09;硬件连接与供电&#xff08;1&#xff09;安装&使用STM32 ST-LINK Utility&#xff0…

合并果子C++详解

题目描述 在一个果园里&#xff0c;多多已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并&#xff0c;多多可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。可以看出&#xff0c;…

AOF日志:宕机了,Redis如何避免数据丢失

当服务器宕机后&#xff0c;数据全部丢失&#xff1a;我们很容易想到的一个解决方案是从后端数据库恢复这些数据&#xff0c;但这种方式存在两个问题&#xff1a;一是&#xff0c;需要频繁访问数据库&#xff0c;会给数据库带来巨大的压力&#xff1b;二是&#xff0c;这些数据…

【云原生】K8S超详细概述

目录 一、Kubernets概述1.1 K8S什么1.2为什么要用K8S 二、Kubernetes 集群架构与组件2.1Master组件Kube-apiserverKube-controller-managerKube-scheduler 2.2 配置存储中心etcd 2.3 Node 组件KubeletKube-Proxydocker 或 rocket 三、 Kubernetes 核心概念3.1Pod3.2Pod 控制器K…

React Dva项目 Model中编写与调用异步函数

上文 React Dva项目中模仿网络请求数据方法 中&#xff0c;我们用项目方法模拟了后端请求的数据 那么 今天我们就在models中尝试去使用一下这种异步获取数据的方法 之前 我们在文章 React Dva项目创建Model,并演示数据管理与函数调用 中已经接触过Model了 也可以理解为 它就是 …

STM32入门学习之定时器中断

1.STM32的通用定时器是可编程预分频驱动的16位自动装载计数器。 STM32 的通用定时器可以被用于&#xff1a;测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波 形 ( 输出比较和 PWM) 等。 使用定时器预分频器和 RCC 时钟控制器预分频器&#xff0c;脉冲长度和波形 周…

C# Blazor 学习笔记(7):组件嵌套开发

文章目录 前言相关资料组件嵌套组件模板RenderFragment 意义传统前端样式组件化css 前言 我们在组件化一共有三个目的。 不用写CSS不用写html不用写交互逻辑 简单来说就是Java常说的约定大于配置。我们只需要必须的参数即可&#xff0c;其它的都按照默认配置。我们不需要关系…

穷举深搜暴搜回溯剪枝(3)

一)字母大小写全排列 784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 1)从每一个字符开始进行枚举&#xff0c;如果枚举的是一个数字字符&#xff0c;直接忽视 如果是字母的话&#xff0c;进行选择是变还是不变 2)当进行遍历到叶子结点的时候&#xff0c;直接将…