clip-pathを使って、svgや画像を使わずにCSSだけでアイコンを作成する方法をいくつか紹介します。
↓ Preview
css
/* ----- clip-icon ----- */
.clip-icon {
display: block;
width: 1em;
height: 1em;
background: currentColor;
}
/* ▶︎ */
.clip-icon[data-icon='arrow-triangle'] {
--inner: 16%;
clip-path: polygon(
calc(0% + var(--inner) * 1.5) calc(0% + var(--inner)),
calc(100% - var(--inner)) 50%,
calc(0% + var(--inner) * 1.5) calc(100% - var(--inner))
);
}
/* + */
.clip-icon[data-icon='plus'] {
--stroke: 4%;
--inner: 15%;
clip-path: polygon(
calc(50% - var(--stroke)) var(--inner),
calc(50% + var(--stroke)) var(--inner),
calc(50% + var(--stroke)) calc(50% - var(--stroke)),
calc(100% - var(--inner)) calc(50% - var(--stroke)),
calc(100% - var(--inner)) calc(50% + var(--stroke)),
calc(50% + var(--stroke)) calc(50% + var(--stroke)),
calc(50% + var(--stroke)) calc(100% - var(--inner)),
calc(50% - var(--stroke)) calc(100% - var(--inner)),
calc(50% - var(--stroke)) calc(50% + var(--stroke)),
var(--inner) calc(50% + var(--stroke)),
var(--inner) calc(50% - var(--stroke)),
calc(50% - var(--stroke)) calc(50% - var(--stroke))
);
}
/* - */
.clip-icon[data-icon='minus'] {
--stroke: 4%;
--inner: 15%;
clip-path: polygon(
calc(100% - var(--inner)) calc(50% - var(--stroke)),
calc(100% - var(--inner)) calc(50% + var(--stroke)),
var(--inner) calc(50% + var(--stroke)),
var(--inner) calc(50% - var(--stroke))
);
}
/* > */
.clip-icon[data-icon='arrow-caret'] {
--stroke: calc(4% / 1.4);
--inner: 16%;
clip-path: polygon(
calc(25% + var(--inner) / 2 + var(--stroke)) calc(0% + var(--inner) - var(--stroke)),
calc(75% - var(--inner) / 2 + var(--stroke) * 2) 50%,
calc(25% + var(--inner) / 2 + var(--stroke)) calc(100% - var(--inner) + var(--stroke)),
calc(25% + var(--inner) / 2 - var(--stroke)) calc(100% - var(--inner) - var(--stroke)),
calc(75% - var(--inner) / 2 - var(--stroke) * 2) 50%,
calc(25% + var(--inner) / 2 - var(--stroke)) calc(0% + var(--inner) + var(--stroke))
);
}
/* x */
.clip-icon[data-icon='x'] {
--stroke: calc(4% / 1.4);
--inner: 20%;
clip-path: polygon(
calc(var(--inner) + var(--stroke)) calc(var(--inner) - var(--stroke)),
50% calc(50% - 2 * var(--stroke)),
calc(100% - var(--inner) - var(--stroke)) calc(var(--inner) - var(--stroke)),
calc(100% - var(--inner) + var(--stroke)) calc(var(--inner) + var(--stroke)),
calc(50% + 2 * var(--stroke)) 50%,
calc(100% - var(--inner) + var(--stroke)) calc(100% - var(--inner) - var(--stroke)),
calc(100% - var(--inner) - var(--stroke)) calc(100% - var(--inner) + var(--stroke)),
50% calc(50% + 2 * var(--stroke)),
calc(var(--inner) + var(--stroke)) calc(100% - var(--inner) + var(--stroke)),
calc(var(--inner) - var(--stroke)) calc(100% - var(--inner) - var(--stroke)),
calc(50% - 2 * var(--stroke)) 50%,
calc(var(--inner) - var(--stroke)) calc(var(--inner) + var(--stroke))
);
}
/* ✅ */
.clip-icon[data-icon='checkmark'] {
/* アルファベットの L のような図形を書いてから45度傾ける */
--ax-x: 60%;
--ax-y: 76%;
--stroke: 4%;
--inner: 24%;
clip-path: polygon(
var(--inner) calc(var(--ax-y) - var(--stroke)),
calc(var(--ax-x) - var(--stroke)) calc(var(--ax-y) - var(--stroke)),
calc(var(--ax-x) - var(--stroke)) calc(var(--inner) / 5),
calc(var(--ax-x) + var(--stroke)) calc(var(--inner) / 5),
calc(var(--ax-x) + var(--stroke)) calc(var(--ax-y) + var(--stroke)),
var(--inner) calc(var(--ax-y) + var(--stroke))
);
rotate: 45deg;
}
/* ----- プレビュー用 ----- */
._iconpreview_ {
font-size: 40px;
border: dashed 1px #ccc;
} <div class="l--cluster -g:10"> <div class="_iconpreview_"> <span class="clip-icon" data-icon="arrow-triangle" aria-hidden="true"></span> </div> <div class="_iconpreview_"> <span class="clip-icon" data-icon="plus" aria-hidden="true"></span> </div> <div class="_iconpreview_"> <span class="clip-icon" data-icon="minus" aria-hidden="true"></span> </div> <div class="_iconpreview_"> <span class="clip-icon" data-icon="arrow-caret" aria-hidden="true"></span> </div> <div class="_iconpreview_"> <span class="clip-icon" data-icon="x" aria-hidden="true"></span> </div> <div class="_iconpreview_"> <span class="clip-icon" data-icon="checkmark" aria-hidden="true"></span> </div></div>* Classes without CSS are from Lism CSS.
clip-pathをなんでこう書いてるか?についての解説は図解しないといけなくて面倒なので省略していますが、需要があればがんばって追記します。