<ul>
<li>
<div class="block" data-position="top">top</div>
</li>
<li>
<div class="block" data-position="right">right</div>
</li>
<li>
<div class="block" data-position="bottom">bottom</div>
</li>
<li>
<div class="block" data-position="left">left</div>
</li>
<li>
<div class="block" data-position="lower-left">lower-left</div>
</li>
<li>
<div class="block" data-position="upper-left">upper-left</div>
</li>
<li>
<div class="block" data-position="lower-right">lower-right</div>
</li>
<li>
<div class="block" data-position="upper-right">upper-right</div>
</li>
</ul>
@property --shape-triangle-top {
syntax: "*";
inherits: false;
initial-value: polygon(50% 0, 100% 100%, 0 100%);
}
@property --shape-triangle-bottom {
syntax: "*";
inherits: false;
initial-value: polygon(0 0, 100% 0, 50% 100%);
}
@property --shape-triangle-right {
syntax: "*";
inherits: false;
initial-value: polygon(0 0, 100% 50%, 0 100%);
}
@property --shape-triangle-left {
syntax: "*";
inherits: false;
initial-value: polygon(0 50%, 100% 0, 100% 100%);
}
@property --shape-triangle-lower-left {
syntax: "*";
inherits: false;
initial-value: polygon(0 0, 100% 100%, 0 100%);
}
@property --shape-triangle-upper-left {
syntax: "*";
inherits: false;
initial-value: polygon(0 0, 100% 0, 0 100%);
}
@property --shape-triangle-lower-right {
syntax: "*";
inherits: false;
initial-value: polygon(100% 0, 100% 100%, 0 100%);
}
@property --shape-triangle-upper-right {
syntax: "*";
inherits: false;
initial-value: polygon(0 0, 100% 0, 100% 100%);
}
:root {
--c-white: #f7f7f7;
--c-primary: #cd5c5c;
}
*,
::before,
::after {
box-sizing: border-box;
}
body {
padding: max(5vi, 16px);
font-family: "Open Sans", sans-serif;
font-size: 1em;
line-height: 1.5;
background-color: var(--c-white);
}
ul {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 8px;
max-inline-size: 1200px;
margin: auto;
}
li {
display: grid;
place-items: center;
padding: 16px;
}
.block {
position: relative;
min-inline-size: 196px;
padding-block: 1.2em;
padding-inline: 1.5em;
font-size: 1rem;
line-height: 1.5;
color: var(--c-white);
text-align: center;
background-color: var(--c-primary);
border-radius: 4px;
box-shadow: 0 10px 12px -8px rgb(0 0 0 / 35%);
&::after {
--_size: 16px;
position: absolute;
content: "";
}
}
[data-position="top"]::after {
inline-size: var(--_size);
block-size: calc(var(--_size) / 2 * tan(60deg));
inset-block-end: 100%;
inset-inline: 0;
margin-inline: auto;
clip-path: var(--shape-triangle-top);
background-color: inherit;
}
[data-position="bottom"]::after {
inline-size: var(--_size);
block-size: calc(var(--_size) / 2 * tan(60deg));
inset-block-start: 100%;
inset-inline: 0;
margin-inline: auto;
clip-path: var(--shape-triangle-bottom);
background-color: inherit;
}
[data-position="right"]::after {
inline-size: calc(var(--_size) / 2 * tan(60deg));
block-size: var(--_size);
inset-block: 0;
inset-inline-start: 100%;
margin-block: auto;
clip-path: var(--shape-triangle-right);
background-color: inherit;
}
[data-position="left"]::after {
inline-size: calc(var(--_size) / 2 * tan(60deg));
block-size: var(--_size);
inset-block: 0;
inset-inline-end: 100%;
margin-block: auto;
clip-path: var(--shape-triangle-left);
background-color: inherit;
}
[data-position="lower-left"]::after {
inline-size: var(--_size);
aspect-ratio: 1;
inset-block-end: 4px;
inset-inline-start: 4px;
margin-block: auto;
clip-path: var(--shape-triangle-lower-left);
background-color: currentcolor;
}
[data-position="upper-left"]::after {
inline-size: var(--_size);
aspect-ratio: 1;
inset-block-start: 4px;
inset-inline-start: 4px;
margin-block: auto;
clip-path: var(--shape-triangle-upper-left);
background-color: currentcolor;
}
[data-position="lower-right"]::after {
inline-size: var(--_size);
aspect-ratio: 1;
inset-block-end: 4px;
inset-inline-end: 4px;
margin-block: auto;
clip-path: var(--shape-triangle-lower-right);
background-color: currentcolor;
}
[data-position="upper-right"]::after {
inline-size: var(--_size);
aspect-ratio: 1;
inset-block-start: 4px;
inset-inline-end: 4px;
margin-block: auto;
clip-path: var(--shape-triangle-upper-right);
background-color: currentcolor;
}
This Pen doesn't use any external JavaScript resources.