专栏首页前端皮小蛋你可能不知道的「 CSS 容器查询 」

你可能不知道的「 CSS 容器查询 」

背景

今天PM过来问我: 蛋总,有些用户反馈他们屏幕太小了 , 需要滑动, 操作不方便。我们的系统能不能改成自适应布局啊?

我顿时虎躯一震:woc, 要把一个迭代了一年多的固定设计的产品,改成自适应布局? 真让人害怕 ???。

于是,我就去查了一些自适应布局的资料,尝试找出一种改造成本最小的方案。

过程中发现了一个比较好玩的东西:CSS 容器查询

对此,我做了一下简单的整理和总结,在此分享给大家,希望对大家有所启发。

正文

什么是 CSS 容器查询

简单来说: 容器查询允许开发者根据容器元素的大小来设置元素的样式。

它类似于 @media查询,不同之处在于它根据容器的大小不是视口的大小进行判断。

我们使用创建响应式设计时,通常使用媒体查询根据视口的大小来更改文档布局。

但是,许多设计都有一些通用组件,这些组件会根据其容器的可用宽度来更改布局。

这可能并不总是与视口的大小有关,而是与组件在布局中的放置位置有关

例如,以下组件可能显示在网站布局的列中。

如果有空间,它将显示为两列,否则,我们希望将其堆叠显示。

上图中的左右两个组件,是同一个组件,功能上是完全一样的,只是要展示不同的布局。

目前而言, 我们可以通过以某种方式识别该组件,比如通过添加一个或使用其他选择器来定位元素,该选择器可以查看它在文档结构中的位置。

但是,这并不能完全实现媒体查询在整个布局中的作用。

媒体查询使我们能够根据视口的范围来改变元素的大小。

当我们添加一个类或目标元素时,我们决定当对象在侧边栏中时,它必须使用堆叠布局。

但是,就可用空间而言,很可能是在大屏幕上,侧边栏中的对象将具有足够的空间来以并排布局显示。

容器查询将解决这种情况。

除了查看视口的大小,我们还可以查看容器的大小,并根据容器中的空间进行布局调整。

CSS 容器查提案

容器查询, 将成为css containment规范的一部分,并向contain属性添加新值。

contain属性最初是为了性能优化而设计的。

它为Web开发人员提供了一种方法来隔离DOM的各个部分,并向浏览器声明这些部分与文档的其余部分无关。

使用contain: size;表示浏览器在两个维度上都知道该区域的大小。

知道它有多大的容器,正是我们进行容器查询所需要的。

但是,通常我们并不经常知道这两个维度有多大。

当我们使用媒体查询时,大多数时候我们都会指定可用的宽度(或内联大小)。

我们将列定义为: 该维度中,空间的百分比分数

因此,容器查询仅允许通过在一维中指示大小来扩展包含属性,这被描述为单轴遏制

以下CSS将创建一个仅在嵌入式轴上包含容器的容器,内容可以增长到在块轴上所需的大小:

.sidebar {
  contain: layout inline-size;
}

声明contain属性,并且把layoutsize的值叠加, 浏览器便会在该元素上创建一个containment上下文。

声明了这个属性,就意味着浏览器知道:我以后可能要查询此容器。

然后,可以编写一个查询来查找此包含上下文而不是视口大小,以便为组件制定布局决策。

使用创建容器查@container

这将查询最近的包含上下文。

为了使卡仅在边栏宽于700px时才显示为两列,我们使用以下CSS:

@container (min-width: 700px) {
  .card {
    display: grid;
    grid-template-columns: 2fr 1fr;
  }
}

如果布局的其他区域也是containment,那么我们可以将组件放到那些区域中,它将自动响应相关的容器。这使得我们可以在模式库中创建的各种组件真正可重用,而无需知道它们所处的上下文。

其实还有很多事情可以说,上文介绍的只是一些基本概念。

另外,上文显示的基本功能都已经可以在Chrome Canary中进行测试。

下载Canary,然后转到chrome://flags,搜索Container Queries并启用该标志。

在线演示demo集合

本文演示的 demo 的在线链接:https://codepen.io/rachelandrew/pen/NWdaxde

以及容器查询 demo 的大集合: https://codepen.io/collection/XQrgJo

容器查询的兼容性

目前还没有浏览器支持。

容器查询的相关进展

https://bugs.chromium.org/p/chromium/issues/list?q=component:Blink

Proposed (提案阶段)

Tracking bug: https://bugs.chromium.org/p/chromium/issues/detail?id=1145970

共识和标准

Chrome浏览器中提供功能后,此处列出的值不保证是最新的。

  • Firefox: No signal
  • Edge: No signal
  • Safari: No signal
  • Web Developers: No signals

结论

CSS 容器查询,为自适应布局方案提供了一种新的思路。

但是目前还处于提案阶段, 感兴趣的可以保持关注。

好了,本文的内容就这么多,谢谢。

相关资料

  1. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries
  2. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries
  3. https://caniuse.com/?search=%40container%20
  4. https://www.chromestatus.com/feature/6525308435955712
  5. https://bugs.chromium.org/p/chromium/issues/detail?id=1145970
  6. https://morioh.com/p/8b1afe84f3c2

本文分享自微信公众号 - 前端皮小蛋(gh_e69260c16440),作者:南山皮小蛋

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你可能不知道的 CSS 计数器

    CSS 里面的伪元素其实是非常好用的,但是经常容易被大家忽略,伪元素里面常用到的 content 属性,可能现在很多人仅仅以为 content 属性的值只支持字...

    桃翁
  • 你可能不知道的css-doodle

    第一个原因是刚找到一份前端的工作,业务上都需要尽快的了解,第二个原因就是懒还有拖延的习惯,一旦今天没有写文章,就由可能找个理由托到下一周,进而到了下一周又有千万...

    Daotin
  • 5个你可能不知道的CSS属性

    每年都有新的CSS属性被标准化,并在主流浏览器中可用。 它们旨在使Web开发人员的工作变得轻松,创造出新颖美丽的网站。 在这篇文章中,我将介绍5个相对较新的CS...

    企鹅号小编
  • 5个你可能不知道的CSS属性

    每年都有新的CSS属性被标准化,并在主流浏览器中可用。 它们旨在使Web开发人员变得轻松,创造出新颖美丽的网站。

    疯狂的技术宅
  • 你可能不知道的gitignore生成器

    •团队协同过程中,你是否被吐槽过为什么.pyc或者.env文件也上传到代码仓库了,.env里面有可能涉及到个人的一些敏感的账号密码之类的,.pyc这类文件被人在...

    追马
  • 你可能不知道的printf

    printf可能是我们在学习C语言的过程中最早接触的库函数了。其基本使用想必我们都已经非常清楚了。但是下面的这些情况你是否已经清楚地知道了呢?

    编程珠玑
  • 你不知道 CSS 可以做的 4 件事

    这样就实现了延时1s,一共0.5s的淡入动画。其中ease是animation-timing-function的默认值。animation-timing-fun...

    落落落洛克
  • 你不知道 CSS 可以做的 4 件事

    这样就实现了延时1s,一共0.5s的淡入动画。其中ease是animation-timing-function的默认值。animation-timing-fun...

    桃翁
  • 你可能不知道的 React Hooks

    React Hooks 与类组件不同,它提供了用于优化和组合应用程序的简单方式,并且使用了最少的样板文件。

    桃翁
  • 你可能不知道的 ZooKeeper 知识点

    Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源、有趣、入门级的 ZooKeeper 教程,面向有编程基础的新手。

    HelloGitHub
  • 你可能不知道的setInterval的坑

    之前印象中一直记得setInterval有一些坑,但是一直不是很清楚那些坑是什么。今天去摸索了下之后,决定来做个记录以免自己忘记,也希望让更多人了解到这个坑。

    嘿嘿嘿
  • Burpsuite你可能不知道的技巧

    一年一度的Burpsuite过期的时间又到了,Burpsuite作为Web安全者必不可少的一件神器,其实有很多实用的技巧,本篇文章的目的是抛砖引玉,通过分享一些...

    C4rpeDime
  • 你可能不知道的 JSON.stringify 用法

    JS 中有许多常见的函数,我们可能每天都在使用它们,但是却不知道它们的一些额外功能。JSON.stringify 就是这样的一个函数,今天就来看下它的特殊用法。

    savokiss
  • 你可能不知道的 Python 技巧

    英文 | Python Tips and Trick, You Haven't Already Seen

    Python猫
  • 你可能不知道的Redis用法

    基于Redis丰富的数据结构,除了充当缓存层来提升查询效率以外,还能应用在很多常见的场景,比如:分布式锁,消息队列,限流等。看到这些场景你可能会有疑问,Redi...

    大数据技术架构
  • 8 个你可能不知道的 Docker 知识

    我是攻城师
  • 8个你可能不知道的Docker知识

    自从上世纪 90 年代硬件虚拟化被主流的技术广泛普及之后,对数据中心而言,发生的最大的变革莫过于容器和容器管理工具,例如:Docker。在过去的一年内,Dock...

    静一
  • 这些 CSS 伪类,你可能还不知道,可以用起来了!

    css 伪类是用于向某些选择器添加特殊的效果,是动态的,指当前元素所处的状态或者特性。只有一个元素达到一个特定状态时,它可能得到一个伪类的样式;当状态改变时,它...

    前端小智@大迁世界
  • 5件你可能不知道可以使用 CSS-in-JS 来做的事情

    除了传统的 CSS,你还可以使用 内联样式 和 CSS-in-JS 作为 React 应用程序的样式选项。

    一墨编程学习

扫码关注云+社区

领取腾讯云代金券