Conditional Styling For Autoplacement Changes in CSS Grid

I am looking for a way to detect when the grid-auto-flow css property has been engaged and apply conditional styling, eg. larger font-size.

Full demo example: Stackblitz (as you can’t resize in Stackoverflow’s snippet container).

Is this possible using just CSS? Or am I going the wrong way about solving this?

I need the font-size: x to get larger when the screen gets smaller. I’d rather refrain from introducing any javascript (and or) media queries into this.

unless there’s a media-query that can detect this change

main {   display: grid;   color: rgb(107, 107, 107);   font-size: 1em;   grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));   grid-auto-flow: row; }  main section:first-child h1 {   padding-left: var(--page-left-padding); }  main section article {   display: grid;   grid-template-columns: repeat(2, 1fr); }  main section article div {   align-self: center;   font-size: 0.3em; }  main section article div:last-child {   padding-bottom: 3em; }  main section article p {   font-size: 1em; }  ul, li {   text-decoration: none;   list-style: none; }
<main>   <section>     <h1>If you resize, this text will be positioned above, not to the side.</h1>   </section>   <section>     <article>       <p>Lorem Ipsum</p>       <div>         <li>Lorem ipsum dolor sit amet</li>         <li>consectetur adipiscing elit</li>         <li>Praesent iaculis tempor</li>         <li>nulla nec rutrum. Donec eu purus</li>         <li>uspendisse potenti</li>         <li>libero sem sollicitudin</li>       </div>     </article>     <article>       <p>Mauris sem tortor</p>       <div>         <li>Lorem ipsum dolor sit amet</li>         <li>consectetur adipiscing elit</li>         <li>Praesent iaculis tempor</li>         <li>nulla nec rutrum. Donec eu purus</li>         <li>uspendisse potenti</li>         <li>libero sem sollicitudin</li>       </div>     </article>   </section> </main>

Add Comment
1 Answer(s)

To detect changes of screen width use media-query, they are made for this. And you can set any font-size according to your media breakpoints. I agree, media breakpoints can’t detect changes in number of columns while using grid-template-columns auto-fit. But it’s CSS friendly.

To connect grid-template-columns count and font size you can use following way.

main {   grid-template-columns: repeat(2, 1fr); } main section:first-child h1 {   font-size: 28px; }  @media (max-height: 475px) {   main {     grid-template-columns: repeat(1, 1fr);   }   main section:first-child h1 {     font-size: 36px;   } } 

Or, if you want to count columns and detect changes caused by auto-fit – this is task for JavaScript.

Made simple JavaScript, which counts the number of blocks in first column, comparing their offsetTop. Then we gat the number of columns in CSS variable --cols and can use it anywhere we like, for instance font-size: calc(36px / var(--cols));

countCols();  window.addEventListener("resize", function() {   countCols();   });  function countCols() {   let cols = 0;   let mainOffsetTop = document.querySelector('main section').offsetTop; /* main offset top */   let mainSections = document.querySelectorAll('main section');    for (let i = 0; i < mainSections.length; i += 1) {     /* (section offset top) and (main offset top) == for the first row elements */     if((mainSections[i].offsetTop - mainOffsetTop) == 0) {       cols++;     } else {       break;     }       }   // getting CSS variable in body   document.documentElement.style.setProperty('--cols', cols); }
main {   display: grid;   color: rgb(107, 107, 107);   font-size: 1em;   grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));   grid-auto-flow: row; }  main section:first-child h1 {   padding-left: var(--page-left-padding);   font-size: calc(36px / var(--cols)); }  main section article {   display: grid;   grid-template-columns: repeat(2, 1fr); }  main section article div {   align-self: center;   font-size: 0.3em; }  main section article div:last-child {   padding-bottom: 3em; }  main section article p {   font-size: 1em; }  ul, li {   text-decoration: none;   list-style: none; }
<main>   <section>     <h1>If you resize, this text will be positioned above, not to the side.</h1>   </section>   <section>     <article>       <p>Lorem Ipsum</p>       <div>         <li>Lorem ipsum dolor sit amet</li>         <li>consectetur adipiscing elit</li>         <li>Praesent iaculis tempor</li>         <li>nulla nec rutrum. Donec eu purus</li>         <li>uspendisse potenti</li>         <li>libero sem sollicitudin</li>       </div>     </article>     <article>       <p>Mauris sem tortor</p>       <div>         <li>Lorem ipsum dolor sit amet</li>         <li>consectetur adipiscing elit</li>         <li>Praesent iaculis tempor</li>         <li>nulla nec rutrum. Donec eu purus</li>         <li>uspendisse potenti</li>         <li>libero sem sollicitudin</li>       </div>     </article>   </section> </main>

Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.