<!-- overdesigned stuff -->
<sup>Make things easier, not harder</sup>
<h1><i>Dead</i> <i>simple</i> <i>grid.</i></h1>
<!-- also a bit overdesigned stuff -->
<div class="lead">
<p>A simpler to configure variant of Chris Coyiers ”Expando Grid”</p>
<p>
source: <a href="https://codepen.io/chriscoyier/pen/GRYKObj" target="_blank">codepen.io/chriscoyier/pen/GRYKOb</a>
<u class="hello-i-am-a-line"></u>
<b>Reasoning</b>
Use simple CSS-variables to make these "auto-grids" simpler and more "modular". Also i've got somewhat of a strong belief in thinking "element first" and screen sizes second. In practice this means that we simply create our elements, say a card, and that element should then scale to whatever. Or like in this case scale to whatever columns within some defined reason.
</p>
</div>
<!-- your bog standard other stuff -->
<div class="grid">
<div class="card">
<h2>Lorem ipsum</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>Is Simply</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>Dummy Text</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>Of The Typesetting</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>Industry</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>It Has Survived</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>Since The</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<h2>1600's</h2>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
</div>
<hr>
<h3>Using data-attribute to control max columns</h3>
<p class="lead">data-columns="2"</p>
<div class="grid" data-columns="2">
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
</div>
<p class="lead">data-columns="3"</p>
<div class="grid" data-columns="3">
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
</div>
<p class="lead">data-columns="4"</p>
<div class="grid" data-columns="4">
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
<div class="card">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Adipisci illo nobis quisquam. Officiis earum culpa sit in consequuntur!</p>
</div>
</div>
<p>...and we could go on and on.</p>
@import url('https://fonts.googleapis.com/css2?family=Pacifico&display=swap');
/*
The stuff that matters
Short reasoning: Application logic shouldn't mix with obvious config params.
-
see Chris Coyiers 'Expando Grid': https://codepen.io/chriscoyier/pen/GRYKObj
*/
/* 1. Define critical things here */
:root {
--grid-columns: 5;
--grid-min-width: 250px;
--grid-gap: 2.5rem;
}
/* 2. Apply here */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, max(var(--grid-min-width), 100% / calc(var(--grid-columns) + 1))), 1fr));
gap: var(--grid-gap);
}
/* ... and we're done ... */
/*
but wait -- couldn't we do more stuff?
...sure, let's use data-attributes and modify local CSS variables
*/
.grid[data-columns] {
/* define */
&[data-columns="1"]{ --grid-columns: 1; }
&[data-columns="2"]{ --grid-columns: 2; }
&[data-columns="3"]{ --grid-columns: 3; }
&[data-columns="4"]{ --grid-columns: 4; }
&[data-columns="5"]{ --grid-columns: 5; }
&[data-columns="6"]{ --grid-columns: 6; }
/* apply */
grid-template-columns: repeat(auto-fit, minmax(min(100%, max(var(--grid-min-width), 100% / calc(var(--grid-columns) + 1))), 1fr));
}
/*----------------------------------------
# MISC IRRELEVANT STYLING
----------------------------------------*/
.grid[data-columns]{
margin-bottom: var(--spacing-double);
> div { padding: var(--spacing); background: rgba(255,255,255,0.1); border-radius: 1rem; }
}
:root {
--spacing: 2rem;
--spacing-half: 1rem;
--spacing-double: 4rem;
}
/* reset: Josh's Custom CSS Reset @ https://www.joshwcomeau.com/css/custom-css-reset/ */
*,*::before,*::after,input,select,form{box-sizing:border-box}*{margin:0}html,body{height:100%}body{line-height:1.5;-webkit-font-smoothing:antialiased}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}
body {
height: auto;
background: #111;
color: #fff8;
font: 300 100%/1.5 system-ui;
padding: 5svh;
background: linear-gradient(to top, hsl(260, 84%, 5%), hsl(260, 84%, 0%));
background-attachment: fixed;
}
body, html { min-height: 100%; }
body {
&::before {
width: 100%; display: block; content: '';
height: .1rem; position: absolute; top: 0; left: 0;
background: linear-gradient(to right, cyan, magenta, yellow);
}
}
/* irrelevant garbage */
* { text-align: center; } /* :) */
h1,
h2,
h3 {
font-weight: 400;
color: #fff9;
line-height: 1.1;
letter-spacing: 0.06rem;
word-break: break-all;
}
h1 {
font-family: 'Pacifico', cursive, system-ui;
font-size: clamp(3.8rem, calc(5vw + 1rem), 5.8rem);
margin-bottom: var(--spacing-half);
text-transform: lowercase;
color: #fff;
position: relative;
z-index: 1;
}
h2 { margin: 0 0 var(--spacing-half); font-size: clamp(100%, calc(1vw + 1rem), 125%); }
h3 { margin: 0 0 var(--spacing); font-size: clamp(125%, calc(1vw + 1rem), 150%); }
/* dark voodoo stuff */
sup {
text-transform: uppercase;
font-size: 70%;
color: rgba(255, 255, 255, 0.4);
letter-spacing: .15rem;
&:after, &:before {
display: inline-block;
content: '---------------';
word-break: none;
letter-spacing: -.1rem;
color: rgba(255, 255, 255, 0.3);
}
&:after { margin-left: .5rem; }
&:before { margin-right: .5rem; }
}
a { color: currentcolor; text-underline-offset: .2rem; text-decoration: none; }
a:hover, a:active, a:focus { color: cyan; }
i { font-style: normal; }
/* why not */
@keyframes why-not {
0% { opacity: 1 }
90% { opacity: 1; text-shadow: 0 0 var(--spacing-double) currentcolor; }
95% { opacity: 0; text-shadow: 0 0 20rem currentcolor; transform: rotateX(0); }
100% { opacity: 1; text-shadow: 0 0 20rem currentcolor; transform: rotateX(25deg); }
}
h1 {
i:nth-child(1){ color: cyan; text-shadow: 0 0 var(--spacing-double) currentcolor; }
i:nth-child(2){ color: magenta; text-shadow: 0 0 var(--spacing-double) currentcolor; }
i:nth-child(3){ color: yellow; text-shadow: 0 0 var(--spacing-double) currentcolor;}
i {
display: inline-block;
animation: why-not alternate 1s linear infinite;
&:nth-child(2){ animation-delay: 20ms; }
&:nth-child(3){ animation-delay: 40ms; }
}
}
.lead {
margin: 0 auto var(--spacing-double);
position: relative;
z-index: 10;
width: 100%; max-width: 50rem;
p { margin: 0 auto; }
p:first-child { font-size: 150%; color: white; margin-bottom: calc(var(--spacing) / 4); }
}
u.hello-i-am-a-line, hr {
height: .5px;
display: block;
margin: var(--spacing-double) auto;
max-width: 70%;
width: 100%;
border: 0;
background: rgba(255,255,255,0.2);
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.