[译] 写给设计师看的 CSS 容器查询,三级缓存框架问题你都了解了吗

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

height: 100%;

}

}

上述(三种)风格差异取决于媒体查询或者视口宽度,意味着我们不能根据其父容器宽度去控制它们。现在你可能在想,这有什么问题?嗯,这是个好问题。

问题是开发者被限制住了,只能在视口宽度大于某个特定值时使用一个组件的特定样式类。例如,如果我想在平板电脑中使用“featured”类,那就行不通了,为什么?因为它的媒体查询在视口宽度大于等于 1300px 时启动。

de908739accd206dae63bab6c17045f0.png

不仅如此,我们还可能面临内容比预期少的问题,有时候,创作者只会添加一篇文章,而设计稿中包含了三篇,在这种情况下,要么我们有一个空白区域,要么文章会适配展开以填充可用空间,请看下图:

2bdee570324dfabe0d7553c0f622e262.png

在第一种情况下,文章太宽导致正在使用的图像被破坏(拉伸),而在第二种情况下,效果是一样的,但有更多的网格项正在扩大以填补可用空间,这(体验)并不是很好。

如果使用容器查询,我们可以通过查询父容器来决定如何显示特定的组件去解决这些问题。请看下图,它展示了我们如何使用容器查询来解决这个问题

6af6f3a9d3995e5477dfc9b60b6e4144.png

因此,我们将解决思路转移到组件的父容器上会发生什么呢?换句话说,如果我们查询其父容器,根据其父容器的宽度或高度来决定组件的外观,该怎么办?让我们来了解下容器查询的概念。

什么是容器查询


首先,让我定义一个容器,包含着其他子元素的元素,有时被称为一个 wrapper(包装器),如果你有兴趣了解更多关于容器的信息,我有一篇完整的文章[4]。

容器查询的功能现在可以在 Chrome Canary 浏览器的 flag 下开启(译者注,指的是 chrome://flags )。感谢 Miriam Suzanne[5] 以及其他朋友的努力。

当一个组件被放在一个容器中时,代表着它被包含在该容器中,这意味着,我们可以查询其父容器的宽度并基于此对其进行修改。请看下图:

c1e59df5ef56484464e559562eb4c85b.png

注意,每张卡片都有一条黄色的轮廓线,它代表每个组件的父容器。通过 CSS 容器查询,我们可以基于其父组件的宽度来修改组件,为了更清楚地说明这一点,以下是上述(布局)的 HTML 代码:

该子组件具有 .c-media 类,它的父容器是 .o-grid__item 元素,在 CSS 中,我们可以这样做:

.o-grid__item {

contain: layout inline-size style;

}

.c-media {

/* 默认样式 */

}

@container (min-width: 320px) {

.c-media {

/* 样式 */

}

}

@container (min-width: 450px) {

.c-media {

/* 样式 */

}

}

首先,我们告诉浏览器每个具有 .o-grid__item 类的元素都是一个容器,接着,我们告诉浏览器,如果父元素的宽度大于或等于 320px,它就应该呈现出不同的布局,对于 450px 的查询也是如此,这就是 CSS 容器查询的工作方式。

此外,我们可以在任何地方定义它们,也就是说如果需要的话,我们可以在顶层容器上进行查询。现在你已经了解了 CSS 容器查询的基本概念,我想给你展示如下图片。

f812e862ed8784304ebe33631c61f197.png

在左侧,这是一个正在调整尺寸的视口,在右侧,一个组件(布局)根据其父组件的宽度改变,这就是容器查询的强大和有用之处。

如果你想进一步了解容器查询的 CSS 细节,我写了一篇关于它的详细文章[6]。

设计时考虑容器查询


作为一名设计师,你需要适应这个革命性的 CSS 功能,因为它将改善我们设计网页和编写 CSS 的方式。我们不仅会针对屏幕尺寸进行设计,还要考虑到组件在其容器宽度改变时应该如何适配。

现在,设计系统越来越受欢迎,设计团队会构建一套规则和组件,以便其他成员可以基于此构建页面,随着 CSS 容器查询的到来,我们还需要在设计组件时,考虑应该如何根据其父容器宽度进行适配。

考虑如下设计:

d700b71705a991ccb60ef26885580e6d.png

请注意,我们有标题栏、文章部分、引言和通讯,它们每一个都应该适应视口或其父容器宽度。

我可以设想将组件分为以下几部分:

  • 视口(媒体查询)

  • 父容器(容器查询)

  • 通用型:不受影响的组件,如按钮、标签、段落。

对于示例的用户界面,我们可以这样划分组件。

afb02cdeeff2092f3c480eefd6c71bc9.png

当我们以这种思维方式设计用户界面时,我们可以开始考虑组件不同的变化,这些变化取决于它们的父容器宽度,让我们来探讨一下。

在下图中,请注意文章组件的每个变化是如何在特定的宽度中发挥作用的。

103fee8d3ad1aa41e1a98c66ee7bab59.png

作为一名设计师,基于父容器宽度考虑如何设计,一开始可能有点奇怪,但这就是未来的发展趋势,我们向前端开发人员提供每个组件的细节和变化,他们可以使用它们(的规范进行编码)。

不仅如此,我们可能还有一个组件的布局,它只在特定的环境下显示, 例如,事件列表页面, 在这种情况下,明确在哪里使用这个布局是很重要的。

问题是,如何告诉设计师应该在哪里使用这些组件?

与开发人员沟通


良好的沟通是项目成功的一个重要因素,作为一名设计师,希望你能提供指导,说明组件不同的适配应该用在哪里,它可以是一个完整的页面设计,也可以是一个显示每个组件如何使用的简单图片。

让我们将其应用于我们之前讨论的文章组件。

9d7bd05ee3f0b41f5fe2cbbd3da31b7e.png

请注意我如何将每个变化映射到特定上下文,而不是视口。为了进一步证明这一点,我想向你展示该组件在与 CSS grid 一起使用时会有什么不同。

在 CSS grid 布局中,我们可以通过使用 auto-fit 关键字来告诉浏览器,如果列的数量少于预期时,我们希望它能够延伸(你可以阅读更多关于它的信息这里[7])。这个功能很强大,因为它可以帮助我们在同一环境下显示不同的变化。请看下图:

1c71faf9820503dd52627a3165cea289.png

拥有一个能根据其父容器宽度做出自适应的组件是非常有用的,正如你刚才看到的,我们在桌面尺寸上查看一个页面,并且有不同的部分,每一个部分的列数都不一样。

设计响应式组件时要避免复杂化


重要的是要记住,一个组件的内部组成结构就像乐高游戏,你可以根据当前变化对它们进行排序,但凡事都有一个度,有时候,对于前端开发人员来说,与其用容器查询来实现自适应,还不如去实现一个全新的组件。

请考虑以下几点。

1d59d35556f0896a67bb2ecd381bcabd.png

它有以下几点:

  • 头像

  • 名称

  • 按钮

  • 键/值对

如果内部结构保持不变,或者至少不包含新的结构,我们可以修改组件,并有以下多种不同布局。

85ac9ab89e758870f6bc4c084de5681f.png

CSS 容器查询的使用案例


让我们来探讨一些可以使用 CSS 容器查询实现的案例。

聊天列表

我在 Facebook messenger 上看到了这种模式,聊天列表根据视口宽度变化,我们可以使用 CSS 容器查询来实现。

eab102413e3ce6cb24c7fbda0af692f1.png

当有足够的空间时,列表会展开并显示每个用户的名字,聊天列表的父元素可以是一个被动态调整大小的元素(例如:通过使用 CSS 视口单位,或 CSS 比较功能)。

下面是我们如何在 CSS 中实现这一点。

    • Ahmad Shadeed

      Ahmad Shadeed

      Main content

      .content {

      display: grid;

      grid-template-columns: 0.4fr 1fr;

      }

      aside {

      contain: layout inline-size style;

      }

      @container (min-width: 180px) {

      .name {

      display: block;

      }

      }

      注意侧边栏的宽度是 0.4f ,所以它是动态宽度,另外,我还添加了 contain 属性,并且如果容器宽度大于 180px ,则会显示用户名。

      与此类似的另一个案例是侧边导航栏,我们可以从新的一行或在图标旁边切换导航项标签的位置。

      516eb9087e27a330dd49d722d7d413bb.png

      注意,当容器(侧边栏)较小时,导航项标签是如何切换为新的一行的,而当有足够空间时,导航项标签是如何切换到导航图标旁边的。

      演示[8]

      手风琴

      手风琴模式可用于像 FAQs 这样的场景,在某些情况下,我们可能需要在侧边栏或用户界面中的一个小区域内添加 FAQs 列表,容器查询可以提供帮助!

      f98269565c26039ac84f15f831284386.png

      下面是我们如何使用 CSS 容器查询实现上述功能。

      @container (min-width: 180px) {

      .faq-title {

      display: flex;

      justify-content: space-between;

      font-size: 1.25rem;

      }

      跳槽是每个人的职业生涯中都要经历的过程,不论你是搜索到的这篇文章还是无意中浏览到的这篇文章,希望你没有白白浪费停留在这里的时间,能给你接下来或者以后的笔试面试带来一些帮助。

      也许是互联网未来10年中最好的一年。WINTER IS COMING。但是如果你不真正的自己去尝试尝试,你永远不知道市面上的行情如何。这次找工作下来,我自身感觉市场并没有那么可怕,也拿到了几个大厂的offer。在此进行一个总结,给自己,也希望能帮助到需要的同学。

      面试准备

      面试准备根据每个人掌握的知识不同,准备的时间也不一样。现在对于前端岗位,以前也许不是很重视算法这块,但是现在很多公司也都会考。建议大家平时有空的时候多刷刷leetcode。算法的准备时间比较长,是一个长期的过程。需要在掌握了大部分前端基础知识的情况下,再有针对性的去复习算法。面试的时候算法能做出来肯定加分,但做不出来也不会一票否决,面试官也会给你提供一些思路。

      网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

      需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
      img

      一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
      几个大厂的offer。在此进行一个总结,给自己,也希望能帮助到需要的同学。

      面试准备

      面试准备根据每个人掌握的知识不同,准备的时间也不一样。现在对于前端岗位,以前也许不是很重视算法这块,但是现在很多公司也都会考。建议大家平时有空的时候多刷刷leetcode。算法的准备时间比较长,是一个长期的过程。需要在掌握了大部分前端基础知识的情况下,再有针对性的去复习算法。面试的时候算法能做出来肯定加分,但做不出来也不会一票否决,面试官也会给你提供一些思路。

      网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

      需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
      [外链图片转存中…(img-TL3Rb1Yf-1713418361571)]

      一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值