キーキャップ打鍵ボタンKeycap Press
.cg-btn-keycap {
position: relative;
display: inline-block;
padding: 0 0 10px;
border: none;
background: transparent;
cursor: pointer;
font: inherit;
-webkit-tap-highlight-color: transparent;
}
/* 受け皿(キーが沈み込む土台)。打鍵で一緒に潰れて影が締まる */
.cg-btn-keycap::before {
content: "";
position: absolute;
left: 4px;
right: 4px;
bottom: 0;
height: 18px;
border-radius: 10px;
background: #B7B0A0;
transform-origin: 50% 100%;
box-shadow: 0 10px 16px rgba(27, 26, 23, .26);
transition: transform .18s cubic-bezier(.34, 1.56, .64, 1), box-shadow .18s cubic-bezier(.34, 1.56, .64, 1);
}
/* キートップ本体。指を離すと少し行き過ぎてから戻る(ばね) */
.cg-btn-keycap .cap {
position: relative;
display: block;
padding: 15px 34px;
font-family: 'IBM Plex Mono', ui-monospace, monospace;
font-size: 14px;
font-weight: 700;
letter-spacing: .14em;
color: #1B1A17;
background: linear-gradient(#FFFDF6, #E7E1D3);
border: 1px solid #CFC8B8;
border-radius: 11px;
overflow: hidden;
transform: translateY(0);
box-shadow: 0 8px 0 #A9A291, inset 0 2px 0 #fff;
transition: transform .18s cubic-bezier(.34, 1.56, .64, 1), box-shadow .18s cubic-bezier(.34, 1.56, .64, 1);
}
/* キートップを走る光沢。ホバーで一度だけ抜けていく */
.cg-btn-keycap .cap::after {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: -60%;
width: 40%;
background: linear-gradient(100deg, transparent, rgba(255, 255, 255, .95), transparent);
transform: skewX(-18deg);
transition: left .55s cubic-bezier(.22, 1, .36, 1);
}
.cg-btn-keycap:hover .cap,
.cg-btn-keycap:focus-visible .cap {
transform: translateY(-2px);
box-shadow: 0 10px 0 #A9A291, inset 0 2px 0 #fff;
}
.cg-btn-keycap:hover .cap::after,
.cg-btn-keycap:focus-visible .cap::after { left: 120%; }
.cg-btn-keycap:active .cap {
transform: translateY(8px);
box-shadow: 0 0 0 #A9A291, inset 0 3px 6px rgba(27, 26, 23, .22);
}
.cg-btn-keycap:active::before {
transform: scaleY(.7);
box-shadow: 0 4px 8px rgba(27, 26, 23, .34);
}
.cg-btn-keycap:focus-visible {
outline: 3px solid #3A5A78;
outline-offset: 4px;
border-radius: 14px;
}
@media (prefers-reduced-motion: reduce) {
.cg-btn-keycap::before,
.cg-btn-keycap .cap { transition: none; }
.cg-btn-keycap .cap::after { display: none; }
}
<button type="button" class="cg-btn-keycap" aria-label="決定"><span class="cap">ENTER</span></button>