پیشنمایش زنده
کد HTML
<div class="btn-wrapper">
<input id="capture-toggle" class="btn-cbox" type="checkbox" />
<label for="capture-toggle" class="btn">
<span class="letter">C</span>
<span class="letter">a</span>
<span class="letter">p</span>
<span class="letter">t</span>
<span class="letter">u</span>
<span class="letter">r</span>
<span class="letter">e</span>
<div class="shutter-wrapper">
<span class="shutter s-1"></span>
<span class="shutter s-2"></span>
<span class="shutter s-3"></span>
<span class="shutter s-4"></span>
<span class="shutter s-5"></span>
<span class="shutter s-6"></span>
</div>
</label>
<div class="flash"></div>
<div class="message">
<span class="warning">Warning</span>
| Flashing lights
</div>
</div>
کد CSS
.btn-wrapper {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: column;
user-select: none;
filter: drop-shadow(0 4px 4px #0005);
}
.btn-wrapper .message {
position: absolute;
bottom: 20px;
font-family: "Inter", sans-serif;
font-weight: 200;
font-size: 12px;
letter-spacing: 0.05em;
color: #fff4;
filter: drop-shadow(0 -6px 8px #fff);
margin-top: 0rem;
.warning {
color: #fe06;
}
}
.btn {
--color-1: 200, 220, 250;
--color-bg: 20, 0, 30;
--color-fg: 230, 230, 230;
--border-radius: 100px / 200px;
--pad: 1px;
cursor: pointer;
font-size: 16px;
font-family: "Inter", sans-serif;
font-weight: 400;
letter-spacing: 0.15em;
color: rgba(var(--color-fg), 0.265);
text-shadow: 0 0 2px rgba(var(--color-1), 0.5);
text-transform: uppercase;
position: relative;
padding: 15px 40px;
background: radial-gradient(circle at center, #0000 30%, #fff1 41%, #0000 43%),
radial-gradient(circle at center, #0000 50%, #fff1 55%, #0000 60%),
radial-gradient(circle at 75% 15%, #fff6 0.5%, #0000 2%),
radial-gradient(circle at 78% 5%, #fff3 1%, #0000 10%),
conic-gradient(
from 135deg at 50% 50%,
#0000,
rgba(var(--color-1), 0.15),
#0000,
rgba(var(--color-1), 0.1),
#0000
),
radial-gradient(circle at center, #000 70%, #fff1),
conic-gradient(
from 85deg at 50% 40%,
#0000,
rgba(255, 0, 100, 1),
#0000,
rgba(var(--color-1), 0.5),
#0000
),
rgba(var(--color-bg), 0.5);
border: none;
border-radius: var(--border-radius);
cursor: pointer;
overflow: clip;
overflow-clip-margin: var(--pad);
margin: 3rem;
transition:
color 0.3s ease,
border-radius 0.3s ease;
display: inline-flex;
}
.btn::before {
content: "";
position: absolute;
inset: calc(-1 * var(--pad));
background: rgba(var(--color-1), 0.15);
border-radius: calc(var(--border-radius) + var(--pad));
z-index: -1;
}
.btn::after {
content: "";
position: absolute;
width: 200%;
height: 50%;
top: 25%;
left: -50%;
background: rgba(255, 255, 255, 0.5)
linear-gradient(to left, rgba(var(--color-1), 1), #fff9);
border-radius: calc(var(--border-radius) + var(--pad));
z-index: -1;
filter: blur(4px) drop-shadow(0 -20px 20px rgba(var(--color-1), 0.75))
drop-shadow(0 -10px 0 rgba(var(--color-1), 0.75));
animation: rotate 3s linear infinite;
opacity: 0;
transition: opacity 0.3s ease;
}
.btn .letter {
display: inline-block;
position: relative;
animation: letter-glow 1.7s ease infinite;
}
.btn .letter:nth-child(1) {
animation-delay: 0.3s;
}
.btn .letter:nth-child(2) {
animation-delay: 0.2s;
}
.btn .letter:nth-child(3) {
animation-delay: 0.1s;
}
.btn .letter:nth-child(4) {
animation-delay: 0s;
}
.btn .letter:nth-child(5) {
animation-delay: 0.1s;
}
.btn .letter:nth-child(6) {
animation-delay: 0.2s;
}
.btn .letter:nth-child(7) {
animation-delay: 0.3s;
}
@keyframes letter-glow {
50% {
color: rgba(var(--color-fg), 1);
background-position-y: 20px;
}
}
.btn-cbox {
position: absolute;
inset: 0;
opacity: 0;
pointer-events: none;
}
.flash {
position: absolute;
inset: 0;
border-radius: 30px / 100px;
background: rgb(255, 255, 255);
z-index: 2;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.btn .shutter-wrapper {
--angle: 120deg;
position: absolute;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
z-index: 1;
opacity: 0;
transition:
transform 0.3s ease,
opacity 0.3s ease;
transform: rotate(var(--angle));
}
.btn .shutter-wrapper .shutter {
position: absolute;
width: 100%;
aspect-ratio: 1;
align-self: center;
left: 50%;
background: url(data:image/png;base64,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),
linear-gradient(to top, #000, 0%, #000, 50%, #666660);
background-position:
0px 0px,
0 0;
mask-image: radial-gradient(circle at -50% -20%, transparent 66%, white 66.3%),
radial-gradient(circle at -50% 50%, transparent 90%, white 91%);
mask-composite: subtract;
mask-position:
0px 0px,
0px 100%;
mask-size: 100% 100%;
transition:
mask-position 0.2s ease,
mask-size 0.2s ease,
transform 0.3s ease,
opacity 0.3s ease;
pointer-events: none;
transform-origin: center left;
}
.btn .shutter.s-1 {
z-index: 1;
transform: rotate(0deg);
}
.btn .shutter.s-2 {
z-index: 2;
transform: rotate(60deg);
}
.btn .shutter.s-3 {
z-index: 3;
transform: rotate(120deg);
}
.btn .shutter.s-4 {
z-index: 4;
transform: rotate(180deg);
}
.btn .shutter.s-5 {
z-index: 5;
transform: rotate(240deg);
}
.btn .shutter.s-6 {
z-index: 6;
transform: rotate(300deg);
}
.btn:hover {
.shutter-wrapper {
opacity: 0.9;
transform: rotate(calc(var(--angle) - 5deg));
}
.shutter {
mask-position:
-25px 0%,
0% 100%;
}
}
.btn-cbox:checked + .btn + .flash {
opacity: 1;
animation: flash 0.5s ease-out forwards;
animation-delay: -0.15s;
}
.btn:active {
.shutter-wrapper {
opacity: 1;
transform: rotate(calc(var(--angle) - 25deg));
}
.shutter {
mask-position:
-109px 0%,
0% 100%;
mask-size: 120% 100%;
}
}
@keyframes flash {
0% {
opacity: 0;
}
20% {
opacity: 0.7;
filter: blur(40px);
}
40% {
opacity: 0.5;
filter: blur(20px);
}
80% {
opacity: 1;
filter: blur(80px);
}
100% {
opacity: 0;
}
}
/* Hover Effects */
.btn:hover {
--border-radius: 100px / 1000px;
color: rgba(var(--color-fg), 1);
text-shadow: 0 0 2px rgba(var(--color-fg), 1);
&::after {
opacity: 1;
}
.bracket {
filter: blur(1px);
}
.bracket.left {
opacity: 1;
transform: scale(0.75) translate(12px, 12px);
border-width: 1px;
border-radius: 2px;
}
.bracket.right {
opacity: 1;
transform: scale(0.75) translate(-12px, -10px);
border-width: 1px;
border-radius: 2px;
}
}
@keyframes flash {
0% {
opacity: 0;
}
50% {
opacity: 1;
filter: blur(40px);
}
100% {
opacity: 0;
}
}
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(-360deg);
}
}