New CSS Container Queries

Web Development

Learn CSS Container Queries the new css feature that helps you style sidebars, aside and side navigations on different screen width.

What problem do container queries solve?

When creating a responsive design you often use a media query to change the document layout based on the size of the viewport.

However, many designs have common components that change layout depending on the available width of their container. This may not always relate to the size of the viewport, but instead relate to where in the layout the component is placed.

For example, the following component might be displayed in a narrow or wide column in the site layout. If there is space it displays as two columns, if not we want to display it stacked.

Code

 <body>
    <h1>My blog</h1>
    <div class="container">
      <main>
        <article class="article">
          <h2>Blog post 1</h2>
          <p>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi
            consequuntur ratione fuga, dicta quo possimus nulla similique unde
            eaque, neque aut, distinctio inventore ea! Architecto iusto
            reprehenderit dignissimos voluptate consectetur deleniti nostrum
            laudantium? In sed quaerat obcaecati, ipsa deserunt placeat iusto
            eius, dolore distinctio doloribus vel. Magni voluptates quaerat esse
            a quae porro nisi tempora ad inventore molestiae neque libero minima
            sit numquam itaque deleniti similique eum quia, molestias fugiat
            corrupti ullam veniam. Vel provident iusto, sed natus excepturi
            earum! Excepturi, quisquam ipsa. Iure quam consequuntur libero sint
            iusto iste aspernatur. Ad incidunt reprehenderit numquam! Minus
            voluptatem iusto tempore laudantium modi accusantium saepe porro
            repudiandae ullam animi qui aut facilis, eaque est non quasi
            officiis asperiores reiciendis sed necessitatibus? Ullam nemo
            corrupti nobis commodi, tenetur dolor, nulla odit inventore et in
            eius reiciendis soluta adipisci natus. Aut sit praesentium ab.
            Beatae commodi mollitia quaerat nemo voluptatem, reiciendis adipisci
            nulla aliquid, tempore quas repellat suscipit alias facere atque
            fugiat tenetur aperiam doloremque laborum dignissimos dolorum sint
            sunt in illum quae! Nemo tempore ipsa temporibus ipsum magnam fugit
            cum maxime eveniet aut, ut iure odio iusto dicta eaque quibusdam?
            Totam officiis perferendis, ratione error harum rerum quasi fuga
            culpa minima nisi temporibus hic! Minus beatae dolores pariatur
            quis, maiores, ratione doloremque rerum vitae perferendis ipsum
            saepe molestias qui unde aut? Tempore corporis alias aliquam
            eligendi asperiores dolorem quia, eos soluta et, quaerat beatae
            perferendis? Sapiente incidunt magni expedita nemo tempora
            dignissimos, ipsum rerum, aliquid possimus cupiditate, quod nam? Quo
            ipsa labore laudantium illo facere? Molestias quo error molestiae
            ratione, atque esse quod incidunt possimus, voluptatibus eaque in
            nesciunt quis? Saepe, iusto eveniet doloribus blanditiis ullam totam
            laborum vitae quidem nostrum vero cum sit modi laudantium placeat
            eligendi molestias, voluptatem esse dolorem aperiam veritatis,
            quisquam ratione consequatur atque. Consequatur quaerat saepe ipsa
            molestias harum quas dolorum id, corporis sequi vitae voluptatum
            assumenda aspernatur a fuga natus doloremque, dolores omnis velit
            deserunt quos! Dolorem distinctio cupiditate odit laudantium.
            Tempore autem eligendi illo asperiores. Odit consequuntur iste id
            voluptatem atque animi. Perspiciatis odio obcaecati recusandae
            dicta, ullam corrupti repudiandae praesentium minima velit nostrum
            eius laudantium quaerat a voluptas quisquam culpa ea vero minus
            natus cumque error sed delectus atque ducimus. Non, obcaecati totam
            vel ex libero, excepturi laudantium consequatur est illo asperiores
            saepe ea debitis nemo ipsa laborum recusandae quas modi error
            molestiae officiis perferendis accusantium culpa sint? Architecto
            quaerat aliquam eius quae id ea tempore dolorum ipsam nulla enim
            rerum nostrum doloribus optio nihil quos tenetur, eos, nemo iure
            atque distinctio! Odio animi accusantium dolorum architecto
            expedita, omnis vel eaque. Blanditiis maxime illo error dolorem
            tenetur eveniet voluptatibus earum veniam voluptas hic, nobis
            officia impedit. Nulla omnis eveniet tempora vel delectus illum
            incidunt commodi, totam architecto quibusdam quas itaque ducimus,
            beatae ipsam praesentium blanditiis maiores. Nisi animi cum beatae
            saepe odit nihil neque nostrum quae, quos culpa consequuntur
            consectetur, quas non a modi inventore sapiente veritatis?
            Molestiae, nihil! Quo nostrum maiores, quidem dolor sunt omnis, esse
            minus saepe quod ea qui? Ratione, sed harum!
          </p>
        </article>
        <div class="card">
          <img src="" alt="" />
          <div class="card-body">
            <h2>Heading of a nice article</h2>
            <p>
              Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos,
              modi.
            </p>
            <button class="btn">Send</button>
          </div>
        </div>
      </main>
      <aside class="sidebar">
        <article>
          <div class="card">
            <img src="" alt="" />
            <div class="card-body">
              <h2>Heading of a nice article</h2>
              <p>
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos,
                modi.
              </p>
              <button class="btn">Send</button>
            </div>
          </div>
        </article>
        <article>
          <div class="card">
            <img src="" alt="" />
            <div class="card-body">
              <h2>Heading of a nice article</h2>
              <p>
                Lorem ipsum dolor sit amet consectetur adipisicing elit. Eos,
                modi.
              </p>
              <button class="btn">Send</button>
            </div>
          </div>
        </article>
      </aside>
    </div>
  </body>
* {
  margin: 0;
  padding: 0;
}

.container {
  max-width: 1400px;
  margin: auto;
  padding: 0 1rem;
  display: grid;
  grid-template-columns: 2fr 1fr;
}
h1 {
  margin: 3rem auto;
  text-align: center;
}
h2 {
  margin-bottom: 2rem;
}
main {
  display: grid;
  grid-template-columns: 2fr 1fr;
}
main .card {
  max-height: 300px;
  flex-direction: column;
}
.card {
  width: fit-content;
  max-width: 500px;
  display: flex;
  color: darkviolet;
  border: 1px solid darkviolet;
  padding: 1.2rem;
  margin: 1rem auto;
}
.card img {
  width: 300px;
  min-height: 150px;
  background-color: darkviolet;
  margin-bottom: 1.5rem;
}
.card .card-body {
  display: flex;
  flex-direction: column;
  justify-content: space-around;
}
.card .btn {
  color: darkviolet;
  border: 1px solid darkviolet;
  border-radius: 5px;
  cursor: pointer;
  display: block;
  padding: 0.3rem 0.75rem;
}
.sidebar {
  border-left: 1px solid #333;
}
@media (max-width: 1200px) {
  main {
    grid-template-columns: 1fr;
  }
  main .card {
    flex-direction: row;
  }
}
/*  @container*/

main,
.sidebar {
  container-type: inline-size;
}

.sidebar .card .card-body {
  margin-left: 1rem;
}

@container (max-width:400px) {
  .sidebar .card {
    background: #222;
    color: #fff;
    flex-direction: column;
    margin: 1rem;
    border-radius: 10px;
    box-shadow: 0 2px 6px 2px rgba(0, 0, 0, 0.4);
  }
  .sidebar :nth-child(2) .card {
    background: darkblue;
  }
  .sidebar .card .card-body {
    margin-left: 0rem;
  }
  .sidebar .card .btn {
    margin-top: 1rem;
    background: green;
    color: #fff;
    font-weight: bold;
  }
}

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.