Menu navigasi yang mirip dengan Dock macOS, dengan ikon yang melebar dengan mulus saat diarahkan.
Dermaga apung ini ideal jika Anda menginginkan dampak visual dan kemudahan penggunaan sebagai navigasi utama aplikasi Anda.
Dasbor dan aplikasi web: Penempatan tetap di bagian bawah layar, menghemat ruang dan mempermudah mengakses fungsi-fungsi utama.
Situs portofolio: Interaksi yang kaya memberikan kesan canggih kepada pengguna.
Animasi karakteristik: Dengan menggunakan kelas semu :has() CSS, animasi perluasan berkelanjutan yang mulus dapat dicapai tanpa menggunakan JavaScript.
Glassmorphism: Menerapkan backdrop-filter: blur() ke latar belakang memberikan tekstur modern yang memungkinkan konten di belakang terlihat jelas.
Perluasan halus: Dengan menentukan transform-origin: bottom center, ikon akan meluas ke atas secara alami dari bawah.
Kerja sama tooltip: Tidak hanya ikon yang membesar ketika diarahkan, tetapi juga tooltip yang menunjukkan peran masing-masing ikon muncul, dengan jelas menyampaikan nama fungsi yang sulit disampaikan hanya dengan ikon.
Kompatibel dengan mode gelap: Secara otomatis menyesuaikan warna dan bayangan latar belakang untuk menjaga visibilitas dan keindahan di lingkungan tema apa pun.
Sesuaikan properti di bawah ini dengan kebutuhan proyek Anda.
Ubah tingkat pembesaran: Anda dapat menyesuaikan ukuran pembesaran maksimum dengan mengubah nilai transform: scale(1.4) dari .dock-item:hover.
Tingkat pembesaran elemen yang berdekatan: Sesuaikan kekuatan efek riak dengan mengubah scale(1.15) atau scale(1.05) seperti .dock-item:has(+ .dock-item:hover).
Ukuran dok: Anda dapat menyesuaikan ukuran keseluruhan dengan mengubah width / height dari .dock-item dan height dari .dock.
Salin kode di bawah ini dan gunakan dalam proyek Anda.
<div class="dock-wrapper">
<nav class="dock">
<a href="#" class="dock-item" data-tooltip="Home">
<svg viewBox="0 0 24 24"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/></svg>
</a>
<a href="#" class="dock-item" data-tooltip="Messages">
<svg viewBox="0 0 24 24"><path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/></svg>
</a>
<a href="#" class="dock-item" data-tooltip="Dashboard">
<svg viewBox="0 0 24 24"><path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/></svg>
</a>
<a href="#" class="dock-item" data-tooltip="Settings">
<svg viewBox="0 0 24 24"><path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.06-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.73,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.06,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.43-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.49-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/></svg>
</a>
<a href="#" class="dock-item" data-tooltip="Profile">
<svg viewBox="0 0 24 24"><path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></svg>
</a>
</nav>
</div>
<style>
.dock-wrapper {
display: flex;
justify-content: center;
align-items: center;
min-height: 200px;
padding: 40px 20px;
background-color: #f8fafc;
overflow: hidden;
border-radius: 12px;
}
/* Kompatibel dengan mode gelap */
@media (prefers-color-scheme: dark) {
.dock-wrapper {
background-color: #0f172a;
}
}
.dock {
display: flex;
justify-content: center;
align-items: flex-end;
padding: 12px;
background: rgba(255, 255, 255, 0.4);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.7);
border-radius: 24px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.8);
gap: 12px;
height: 74px;
position: relative;
}
@media (prefers-color-scheme: dark) {
.dock {
background: rgba(30, 41, 59, 0.5);
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
}
.dock-item {
width: 50px;
height: 50px;
background: linear-gradient(135deg, #ffffff 0%, #f1f5f9 100%);
border-radius: 14px;
display: flex;
justify-content: center;
align-items: center;
color: #334155;
text-decoration: none;
transition: all 0.25s cubic-bezier(0.25, 1, 0.5, 1);
position: relative;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08), inset 0 1px 1px rgba(255, 255, 255, 1);
transform-origin: bottom center;
}
@media (prefers-color-scheme: dark) {
.dock-item {
background: linear-gradient(135deg, #334155 0%, #1e293b 100%);
color: #cbd5e1;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3), inset 0 1px 1px rgba(255, 255, 255, 0.1);
}
}
.dock-item svg {
width: 24px;
height: 24px;
fill: currentColor;
transition: all 0.25s ease;
}
/* ツールチップ */
.dock-item::before {
content: attr(data-tooltip);
position: absolute;
top: -45px;
background: rgba(15, 23, 42, 0.9);
color: white;
padding: 6px 12px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
opacity: 0;
transform: translateY(10px);
transition: all 0.3s cubic-bezier(0.25, 1, 0.5, 1);
pointer-events: none;
white-space: nowrap;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
@media (prefers-color-scheme: dark) {
.dock-item::before {
background: rgba(255, 255, 255, 0.9);
color: #0f172a;
}
}
/* ホバー時の中央要素 */
.dock-item:hover {
transform: scale(1.4);
margin: 0 12px;
z-index: 10;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15), inset 0 1px 1px rgba(255, 255, 255, 1);
}
@media (prefers-color-scheme: dark) {
.dock-item:hover {
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.4), inset 0 1px 1px rgba(255, 255, 255, 0.2);
}
}
.dock-item:hover::before {
opacity: 1;
transform: translateY(0);
}
/* 直近の隣接要素(左右) */
.dock-item:has(+ .dock-item:hover),
.dock-item:hover + .dock-item {
transform: scale(1.15);
margin: 0 4px;
z-index: 5;
}
/* 2つ隣の要素(左右) */
.dock-item:has(+ .dock-item + .dock-item:hover),
.dock-item:hover + .dock-item + .dock-item {
transform: scale(1.05);
z-index: 1;
}
</style> Cuplikan ini menggunakan kelas semu :has() CSS untuk menghasilkan animasi yang halus.
Chrome/Edge: 105+ (didukung penuh)
Safari: 15.4+ (didukung penuh)
Firefox: 121+ (didukung penuh)
Bahkan di lingkungan browser lama, perilaku fallback adalah memperbesar ikon yang dilayangkan saja tanpa menyebabkan kesalahan.