پیشنمایش زنده
کد HTML
<button class="morph-btn">
<span class="btn-fill"></span>
<span class="shadow"></span>
<span class="btn-text">
<span style="--i:0">L</span><span style="--i:1">a</span
><span style="--i:2">u</span><span style="--i:3">n</span
><span style="--i:4">c</span><span style="--i:5">h</span>
</span>
<span class="orbit-dots">
<span></span>
<span></span>
<span></span>
<span></span>
</span>
<span class="corners">
<span></span>
<span></span>
<span></span>
<span></span>
</span>
</button>
کد CSS
.morph-btn {
position: relative;
padding: 22px 56px;
font-family: "Segoe UI", system-ui, sans-serif;
font-size: 16px;
font-weight: 700;
letter-spacing: 3px;
text-transform: uppercase;
color: #ffffff;
background: transparent;
border: none;
cursor: pointer;
overflow: visible;
isolation: isolate;
}
/* Main fill that morphs */
.morph-btn .btn-fill {
position: absolute;
inset: 0;
background: #0d0d0d;
border-radius: 4px;
transition: border-radius 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
z-index: 1;
}
.morph-btn:hover .btn-fill {
border-radius: 50px;
animation: jelly 0.5s ease;
}
@keyframes jelly {
0% {
transform: scale(1, 1);
}
30% {
transform: scale(1.15, 0.85);
}
50% {
transform: scale(0.9, 1.1);
}
70% {
transform: scale(1.05, 0.95);
}
100% {
transform: scale(1, 1);
}
}
/* Floating dots that orbit */
.morph-btn .orbit-dots {
position: absolute;
inset: -30px;
pointer-events: none;
}
.morph-btn .orbit-dots span {
position: absolute;
width: 8px;
height: 8px;
background: #0d0d0d;
border-radius: 50%;
opacity: 1;
transition: opacity 0.3s ease;
}
.morph-btn:hover .orbit-dots span {
opacity: 1;
}
.morph-btn .orbit-dots span:nth-child(1) {
top: 0;
left: 50%;
animation: orbit1 3s linear infinite;
}
.morph-btn .orbit-dots span:nth-child(2) {
bottom: 0;
left: 50%;
animation: orbit2 3s linear infinite;
}
.morph-btn .orbit-dots span:nth-child(3) {
top: 50%;
left: 0;
animation: orbit3 4s linear infinite;
}
.morph-btn .orbit-dots span:nth-child(4) {
top: 50%;
right: 0;
animation: orbit4 4s linear infinite;
}
@keyframes orbit1 {
0% {
transform: translateX(-50%) translateY(0) scale(1);
}
25% {
transform: translateX(30px) translateY(10px) scale(0.6);
}
50% {
transform: translateX(-50%) translateY(20px) scale(1);
}
75% {
transform: translateX(-80px) translateY(10px) scale(0.6);
}
100% {
transform: translateX(-50%) translateY(0) scale(1);
}
}
@keyframes orbit2 {
0% {
transform: translateX(-50%) translateY(0) scale(0.6);
}
25% {
transform: translateX(-80px) translateY(-10px) scale(1);
}
50% {
transform: translateX(-50%) translateY(-20px) scale(0.6);
}
75% {
transform: translateX(30px) translateY(-10px) scale(1);
}
100% {
transform: translateX(-50%) translateY(0) scale(0.6);
}
}
@keyframes orbit3 {
0% {
transform: translateY(-50%) translateX(0) scale(0.8);
}
50% {
transform: translateY(-50%) translateX(-15px) scale(1.2);
}
100% {
transform: translateY(-50%) translateX(0) scale(0.8);
}
}
@keyframes orbit4 {
0% {
transform: translateY(-50%) translateX(0) scale(1.2);
}
50% {
transform: translateY(-50%) translateX(15px) scale(0.8);
}
100% {
transform: translateY(-50%) translateX(0) scale(1.2);
}
}
/* Text split animation */
.morph-btn .btn-text {
position: relative;
display: inline-block;
z-index: 3;
}
.morph-btn .btn-text span {
display: inline-block;
transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
transition-delay: calc(var(--i) * 0.03s);
}
.morph-btn:hover .btn-text span {
transform: translateY(-100%);
animation: letterBounce 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;
animation-delay: calc(var(--i) * 0.03s);
}
@keyframes letterBounce {
0% {
transform: translateY(0);
}
40% {
transform: translateY(-120%);
}
70% {
transform: translateY(10%);
}
100% {
transform: translateY(0);
}
}
/* Corner accents */
.morph-btn .corners span {
position: absolute;
width: 20px;
height: 20px;
border: 2px solid #0d0d0d;
transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
opacity: 1;
}
.morph-btn .corners span:nth-child(1) {
top: -10px;
left: -10px;
border-right: none;
border-bottom: none;
}
.morph-btn .corners span:nth-child(2) {
top: -10px;
right: -10px;
border-left: none;
border-bottom: none;
}
.morph-btn .corners span:nth-child(3) {
bottom: -10px;
left: -10px;
border-right: none;
border-top: none;
}
.morph-btn .corners span:nth-child(4) {
bottom: -10px;
right: -10px;
border-left: none;
border-top: none;
}
.morph-btn:hover .corners span {
opacity: 1;
}
.morph-btn:hover .corners span:nth-child(1) {
transform: translate(-5px, -5px) rotate(-5deg);
}
.morph-btn:hover .corners span:nth-child(2) {
transform: translate(5px, -5px) rotate(5deg);
}
.morph-btn:hover .corners span:nth-child(3) {
transform: translate(-5px, 5px) rotate(5deg);
}
.morph-btn:hover .corners span:nth-child(4) {
transform: translate(5px, 5px) rotate(-5deg);
}
/* Magnetic shadow */
.morph-btn .shadow {
position: absolute;
inset: 5px;
background: rgba(13, 13, 13, 0.3);
border-radius: 4px;
filter: blur(15px);
z-index: 0;
transition: all 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
transform: translateY(10px);
}
.morph-btn:hover .shadow {
border-radius: 50px;
transform: translateY(15px) scale(1.1);
filter: blur(20px);
}
/* Click effect */
.morph-btn:active .btn-fill {
transform: scale(0.92);
transition: transform 0.1s ease;
}
.morph-btn:active .shadow {
transform: translateY(3px) scale(0.85);
filter: blur(8px);
opacity: 0.5;
transition: all 0.1s ease;
}
.morph-btn:active .btn-text {
transform: scale(0.95);
transition: transform 0.1s ease;
}
.morph-btn:active .corners span:nth-child(1) {
transform: translate(-15px, -15px) rotate(-15deg) scale(0.8);
}
.morph-btn:active .corners span:nth-child(2) {
transform: translate(15px, -15px) rotate(15deg) scale(0.8);
}
.morph-btn:active .corners span:nth-child(3) {
transform: translate(-15px, 15px) rotate(15deg) scale(0.8);
}
.morph-btn:active .corners span:nth-child(4) {
transform: translate(15px, 15px) rotate(-15deg) scale(0.8);
}
.morph-btn:active .orbit-dots span {
animation-play-state: paused;
transform: scale(1.5);
}