css3响应式布局利器之容器查询

css3响应式布局利器之容器查询

容器查询是CSS中最受关注和要求的功能之一。可能大家接触过media query媒体查询,它可以根据不同设备的可视面积来设置css样式,那么容器查询到底是什么?

一、什么是容器查询

容器查询是可以帮助我们根据容器的内容(例如宽度和高度)来设置其内容样式的查询。这与媒体查询采用的方法不同,媒体查询可以帮助我们根据视口的更改来设置网页/网站的样式。

截至2020年,容器查询目前尚未在CSS中使用,但是我们真的需要正式添加容器才能获得附带的一些优势吗?

好吧,不完全是。我们可以进行一些调整,以在代码中实现类似容器查询的行为。我们将在下面介绍其中的一些。

二、flexbox实现容器查询

使用flexbox进行容器查询

Flexbox是一种单向布局模型,可让我们创建响应速度更快的网站。

在本文中,我们将使用一种基于flexbox的技术,以模仿容器查询。我们的目标是使用flexbox创建三列,并将它们全部移至具有特定容器宽度的行。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>container queries</title>
    <style>
        .container {
            display: flex;
            flex-wrap: wrap;
            gap: 1em;

        }
        .child {
            flex-basis: calc( calc(500px - 100%) * 999);;
            flex-grow: 1;
            background: rgb(231, 227, 227);
            padding: 1em;
            font-size: 18px;
        }

        .child1 {
            display: flex;
            flex-wrap: wrap;
        }
        .child1 p {
            flex-basis: calc( calc(400px - 100%) * 999);
            flex-grow: 1;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="child child1">
            <p>
                Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ducimus, perferendis!
            </p>
            <p>
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum, soluta.
            </p>
        </div>
        <div class="child child2">
            Lorem ipsum Lorem ipsum dolor sit amet consectetur, adipisicing elit. Laudantium aliquid esse fugiat!
        </div>
        <div class="child child3">
            consectetur adipisicing elit. Tempora totam, eos rerum ipsum consequuntur suscipit?
        </div>


    </div>
</body>
</html>


我们给具有“ .container”类的容器显示“ flex”和“ flex-wrap”的“ wrap”。

主容器的所有子元素均被赋予“伸缩增长”(flex-grow)值1。这使元素可以超出其原始宽度并填充剩余空间。

'flex-basis'属性帮助我们设置所有子元素的理想宽度。请注意,flexbox并不严格遵循此原则,它会在必要时进行调整。

较大的负“ flex-basis”值将导致子元素最终从初始列位置开始占据行位置。

上面我们在'flex-basis'属性中所做的事情是,我们利用'calc()'来设置'flex-basis'属性,这样它将在500px以下的某个地方给我们一个负值。这将导致所有子元素从列排列变成行排列。这就是通过flex来实现自适应响应式布局。那么容器查询怎么实现这样的功能呢?

三、grid容器查询

我们将css进行修改如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>BFW NEW PAGE</title>

    <style>
        .container {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            grid-gap: 1em;

        }
        .child {

            background: rgb(231, 227, 227);
            padding: 1em;
            font-size: 18px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="child child1">
            <p>
                Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ducimus, perferendis!
            </p>
            <p>
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum, soluta.
            </p>
        </div>
        <div class="child child2">
            Lorem ipsum Lorem ipsum dolor sit amet consectetur, adipisicing elit. Laudantium aliquid esse fugiat!
        </div>
        <div class="child child3">
            consectetur adipisicing elit. Tempora totam, eos rerum ipsum consequuntur suscipit?
        </div>


    </div>
</body>
</html>

我们首先将显示设置为grid,然后为我们的子元素设置1em的“ grid-gap”。在这种情况下,'grid-template-columns'属性发挥了所有作用。我们正在使用'repeat()'创建一个最小宽度为'300px',最大宽度为'1fr',且限制为'auto-fit'的网格。这允许网格填充整个视口。

结果是3列布局,但是当父容器低于'300px'时。

这就是基于容器的查询,不需要单独用@media,代码看上去也跟简洁。

{{collectdata}}

网友评论0