common.css
* ,
*::before,
*::after{
box-sizing:border-box;
}
.center-l {
box-sizing: content-box;
}
:root {
--font-plain: Helvetica Neue,Helvetica,Arial,sans-serif;
--font-special: Barlow Condensed,Helvetica,sans-serif;
--font-mono: Menlo,Courier,Courier New,Andale Mono,monospace;
--color-dark: hsl(0,0%,0%);
--color-darkish: hsl(0,0%,25%);
--color-lightish: hsl(0,0%,90%);
--color-light: hsl(0,0%,98%);
--color-mid: grey;
--ratio: 1.4;
--s-5: calc(var(--s0)/var(--ratio)/var(--ratio)/var(--ratio)/var(--ratio)/var(--ratio));
--s-4: calc(var(--s0)/var(--ratio)/var(--ratio)/var(--ratio)/var(--ratio));
--s-3: calc(var(--s0)/var(--ratio)/var(--ratio)/var(--ratio));
--s-2: calc(var(--s0)/var(--ratio)/var(--ratio));
--s-1: calc(var(--s0)/var(--ratio));
--s0: 1rem;
--s1: calc(var(--s0)*var(--ratio));
--s2: calc(var(--s0)*var(--ratio)*var(--ratio));
--s3: calc(var(--s0)*var(--ratio)*var(--ratio)*var(--ratio));
--s4: calc(var(--s0)*var(--ratio)*var(--ratio)*var(--ratio)*var(--ratio));
--s5: calc(var(--s0)*var(--ratio)*var(--ratio)*var(--ratio)*var(--ratio)*var(--ratio));
--measure: 65em;
--line-height: var(--ratio);
--line-height-small: calc(0.8*var(--ratio));
--border-thin: var(--s-5);
--border-thick: var(--s-2);
line-height: var(--ratio);
font-size: 62.5%;
font-family: var(--font-plain);
background-color: var(--color-light);
color: var(--color-dark);
}
body {
font-size: 1.6rem;
}
.font-size\:base {
font-size: 1rem;
}
.font-size\:biggish {
font-size: 1.75rem;
}
.font-size\:big {
font-size: 2.25rem;
}
html,body,div,header,nav,main,footer {
max-width: none;
}
Stack
<div class="stack">
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
</div>
.stack {
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.stack > * {
margin-top: 0;
margin-bottom: 0;
}
.stack > * + * {
margin-top: var(--space, 1.5rem);
}
.stack-false {
margin-bottom: auto;
}
Box
<div class="box">
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
</div>
<div class="box invert">
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
</div>
.box {
--color-light:hsl(0,0%,80%);
--color-dark:hsl(0,0%,20%);
color:var(--color-dark);
background-color: var(--color-light);
padding: var(--s1);
border: var(--border-thin) solid;
outline: var(--border-thin) transparent;
outline-offset: calc(var(--border-thin) * 1);
}
.box * {
color:inherit;
}
.box.invert {
color:var(--color-light);
background: var(--color-dark);
}
Center
<div class="center">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Nulla laborum illum vero quibusdam. Eos earum, ducimus eligendi cum, tempora tenetur at inventore unde dolore, laboriosam nisi consequuntur odio magnam accusamus!
<button>子要素がcenterのflexによって中央揃えになる</button>
</div>
.center {
max-width:60ch;
margin-left: auto;
margin-right: auto;
box-sizing: content-box;
padding-left:var(--s1);
padding-right:var(--s1);
display: flex;
flex-direction: column;
align-items: center;
}
Cluster
<div class="cluster">
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
</div>
<p>↓外側はspace-between、内側はflex-start</p>
<div class="cluster space-between">
<p class="test">LOGO</p>
<div class="cluster">
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
<div class="test">子要素</div>
</div>
</div>
.cluster {
display: flex;
flex-wrap: wrap;
gap:var(--space,1rem);
background: pink;
justify-content: center;
align-items: center;
}
.space-between{
justify-content: space-between;
}
.test {
padding: var(--s1);
background-color: rgb(255, 253, 152);
font-size: 3rem;
}
Sidebar
<div class="with-sidebar">
<div class="sidebar">
<img src="https://placehold.jp/350x150.png" alt="">
</div>
<div class="not-sidebar">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Hic repellendus ipsa rerum laborum, pariatur facilis sed quaerat, itaque adipisci est doloribus reprehenderit! Assumenda dolores quas illo ratione, doloribus amet mollitia.
</div>
</div>
<hr>
<div class="with-sidebar">
<div class="not-sidebar">
<input style="width:100%" type="text">
</div>
<div class="sidebar">
<button style="width:100%">search</button>
</div>
</div>
.with-sidebar {
display: flex;
flex-wrap: wrap;
}
.sidebar {
flex-basis: 20rem;
flex-grow:1;
background-color: pink;
}
.not-sidebar {
flex-basis:0;
flex-grow:999;
min-width:50%;
background: purple;
}
Switcher
<div class="switcher">
<div>子要素1(必要に応じてmax-width:100%をつける)</div>
<div>子要素2</div>
<div>子要素3</div>
<div>子要素4</div>
</div>
.switcher {
display: flex;
flex-wrap: wrap;
gap: var(--gutter,var(--s1));
--threshold: 30rem;
}
.switcher > * {
flex-grow: 1;
flex-basis: calc((var(--threshold) - 100%) * 999);
background-color: pink;
}
.switcher > :nth-child(2) {
flex-grow:2;
background: purple;
}
.switcher > :nth-last-child(n+5),
.switcher > :nth-last-child(n+5) ~ * {
flex-basis: 100%;
}
Cover
<div class="cover">
<p>headerコンテンツ</p>
<h1>テスト</h1>
<p>footerコンテンツ</p>
</div>
.cover {
--space: var(--s1);
display: flex;
flex-direction: column;
padding: var(--space);
min-height:100vh;
}
.cover > * {
margin-top: var(--space);
margin-bottom: var(--space);
}
.cover > h1 {
margin-top: auto;
margin-bottom: auto;
}
.cover > :first-child:not(h1) {
margin-top: 0;
}
.cover > :last-child:not(h1){
margin-bottom: 0;
}
Grid
<div class="grid">
<div>子要素1</div>
<div>子要素2</div>
<div>子要素3</div>
<div>子要素4</div>
</div>
.grid {
display: grid;
grid-gap: 1rem;
--minimum: 20ch;
}
@supports(width:min(var(--minimum),100%)){
.grid {
grid-template-columns: repeat(auto-fit,minmax(min(var(--minimum),100%),1fr));
}
}
Frame
<div class="frame">
<img src="https://placehold.jp/350x150.png" alt="">
</div>
<p>↓original size</p>
<img src="https://placehold.jp/350x150.png" alt="">
img {
max-width: 100%;
}
.frame {
--n :9;
--d :16;
padding-bottom: calc(var(--n) / var(--d) * 100%);
position: relative;
}
.frame * {
overflow: hidden;
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
display: flex;
justify-content: center;
align-items: center;
}
.frame > img,
.frame > video {
width: 100%;
height: 100%;
object-fit: cover;
}
Reel
<div class="reel">
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
<div>子要素</div>
</div>
.reel {
--space:1rem;
--color-light:#fff;
--color-dark:#000;
--reel-height:auto;
--item-width:25ch;
display: flex;
height:var(--reel-height);
overflow-x: auto;
overflow-y: hidden;
scrollbar-color: var(--color-light) var(--color-dark);
}
.reel::-webkit-scrollbar {
height: 1rem;
}
.reel::-webkit-scrollbar-track {
background-color: var(--color-dark);
}
.reel::-webkit-scrollbar-thumb {
background-color: var(--color-dark);
background-image:linear-gradient(
var(--color-dark) 0,
var(--color-dark) 0.25rem,
var(--color-light) 0.25rem,
var(--color-light) 0.75rem,
var(--color-dark) 0.75rem
);
}
.reel > * {
flex: 0 0 var(--item-width);
}
.reel > img {
height: 100%;
flex-basis: auto;
width: auto;
}
.reel > * + * {
margin-left: var(--space);
}
.reel.overflowing:not(.no-bar) {
padding-bottom: var(--space);
}
.reel.no-bar {
scrollbar-width: none;
}
.reel.no-bar::-webkit-scrollbar {
display: none;
}
Imposter
<div style="position: relative;">
<p>スタティックなコンテンツ</p>
<div class="imposter">
<p>重ね合わされるコンテンツ</p>
</div>
</div>
.imposter {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}
.imposter.contain {
--margin: 0px;
max-width: calc(100% - var(--margin) * 2);
max-height: calc(100% - var(--margin) * 2);
overflow: auto;
}
Icon
<span class="with-icon">
<svg class="icon">
<use href="symbols.svg#telBtn-icon"></use>
</svg>
<span>close</span>
</span>
.icon {
height:0.75em;
height:1cap;
width: 0.75em;
width: 1cap;
}
.width-icon{
display: inline-block;
align-items: center;
}
.width-icon .icon {
margin-inline-end:var(--space,0.5em);
}