پیشنمایش زنده
کد HTML
<button class="button">
<span class="text">ST RT</span>
<div class="katana-container">
<div class="katana katana-1">
<div class="handle"></div>
<div class="guard"></div>
<div class="blade"></div>
</div>
<div class="katana katana-2">
<div class="handle"></div>
<div class="guard"></div>
<div class="blade"></div>
</div>
</div>
</button>
کد CSS
.button {
width: 100%;
height: 100%;
height: 500px;
position: relative;
background: none;
border: none;
display: flex;
align-items: center;
justify-content: center;
}
.text {
opacity: 0;
position: absolute;
color: #e8e8e8;
font-size: 4rem;
z-index: 5;
pointer-events: none;
transition: opacity 0.5s ease;
animation: fuse 2s infinite;
}
@keyframes fuse {
20%,
80% {
opacity: 0.6;
}
40% {
opacity: 0.2;
}
60% {
opacity: 0;
}
70% {
opacity: 0.4;
}
75% {
opacity: 0;
}
}
.button:hover .text,
.button:active .text {
opacity: 1;
animation-play-state: paused;
}
.katana-container {
width: 100%;
height: 100%;
position: absolute;
margin: 50px auto;
background: none;
transform: rotate(90deg);
border-radius: 50%;
cursor: pointer;
}
.katana {
position: absolute;
width: 400px;
height: 30px;
top: 50%;
left: 50%;
transform-origin: center;
transition: transform 0.8s cubic-bezier(0.15, 1.15, 0.35, 1.15);
}
.blade {
width: 75%;
height: 6px;
background: linear-gradient(
90deg,
#c0c0c0 0%,
#e8e8e8 20%,
#ffffff 50%,
#e8e8e8 80%,
#c0c0c0 100%
);
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
border-radius: 0 50% 50% 0;
box-shadow: 0 0 10px rgba(200, 200, 200, 0.5);
}
/* Curved blade effect */
.blade::before {
content: "";
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.2) 30%,
rgba(255, 255, 255, 0.8) 50%,
rgba(255, 255, 255, 0.2) 70%,
transparent 100%
);
border-radius: 0 50% 50% 0;
transform: translateY(-1px);
}
.handle {
width: 25%;
height: 28px;
background: repeating-linear-gradient(
45deg,
transparent,
transparent 4px,
rgba(139, 69, 19, 0.5) 4px,
rgba(139, 69, 19, 0.5) 8px
);
position: absolute;
left: 0px;
border-radius: 15px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
}
.guard {
width: 40px;
height: 40px;
background: radial-gradient(
circle at center,
#2b2b2b 0%,
#1a1a1a 60%,
#000000 100%
);
position: absolute;
left: 20%;
top: 50%;
transform: translateY(-50%);
border-radius: 50%;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
z-index: 1;
}
.guard::after {
content: "";
position: absolute;
width: 80%;
height: 80%;
top: 10%;
left: 10%;
border-radius: 50%;
background: repeating-radial-gradient(
circle at center,
#2b2b2b 0%,
#1a1a1a 20%,
#000000 40%
);
}
.katana-1 {
transform: translate(-60%, -60%) rotate(150deg) translateX(-100%);
}
.katana-2 {
transform: translate(-60%, -60%) rotate(-150deg) translateX(-100%);
}
.katana-container:hover .katana-1,
.katana-container:active .katana-1 {
transform: translate(-60%, -60%) rotate(150deg) translateX(0);
animation: katanaClash1 0.8s cubic-bezier(0.15, 1.15, 0.35, 1.15) forwards;
}
.katana-container:hover .katana-2,
.katana-container:active .katana-2 {
transform: translate(-60%, -60%) rotate(-150deg) translateX(0);
animation: katanaClash2 0.8s cubic-bezier(0.15, 1.15, 0.35, 1.15) forwards;
}
@keyframes katanaClash1 {
0% {
transform: translate(-60%, -60%) rotate(150deg) translateX(-100%);
}
40% {
transform: translate(-60%, -60%) rotate(125deg) translateX(-20%);
}
70% {
transform: translate(-60%, -60%) rotate(140deg) translateX(10%);
}
100% {
transform: translate(-60%, -60%) rotate(150deg) translateX(0%);
}
}
@keyframes katanaClash2 {
0% {
transform: translate(-60%, -60%) rotate(-150deg) translateX(100%);
}
40% {
transform: translate(-60%, -60%) rotate(-125deg) translateX(20%);
}
70% {
transform: translate(-60%, -60%) rotate(-140deg) translateX(-10%);
}
100% {
transform: translate(-60%, -60%) rotate(-150deg) translateX(0%);
}
}
.katana-container::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
background: transparent;
transform: translate(-70%, -70%);
pointer-events: none;
}
.katana-container:hover::after,
.katana-container:active::after {
animation: clashSpark 0.8s cubic-bezier(0.15, 1.15, 0.35, 1.15);
}
@keyframes clashSpark {
0%,
100% {
width: 0;
height: 0;
background: radial-gradient(
circle,
rgba(255, 255, 255, 0.9) 0%,
transparent 70%
);
}
40% {
width: 100px;
height: 100px;
background: radial-gradient(
circle,
rgba(255, 255, 255, 0.9) 0%,
transparent 70%
);
}
}