Navigation rail

내비게이션 레일

A narrow, icon-first navigation bar fixed vertically along the left edge of a screen.

Also known as: Side railIcon railRail navigation
···
html
<div class="nrw">
  <nav class="rail" aria-label="주요 메뉴" id="rail">
    <i class="rpill" id="rpill"></i>
    <button aria-current="page"><span>⌂</span></button>
    <button><span>⌕</span></button>
    <button><span>♡</span></button>
    <button><span>☺</span></button>
  </nav>
  <div class="rcontent"><div class="rbar" style="width:70%"></div><div class="rbar" style="width:44%"></div><div class="rbar" style="width:58%"></div></div>
</div>
css
.nrw{display:flex;width:100%;height:100%}
.rail{position:relative;width:48px;background:var(--surface);border-right:1px solid var(--line);display:grid;grid-auto-rows:40px;place-items:center;padding-top:10px;gap:6px}
.rail button{width:34px;height:34px;border-radius:10px;border:0;background:none;color:var(--muted);font-size:15px;cursor:pointer;position:relative;z-index:1}
.rail button[aria-current]{color:var(--accent)}
.rpill{position:absolute;top:10px;left:7px;width:34px;height:34px;border-radius:10px;background:color-mix(in srgb, var(--accent) 16%, transparent);transition:transform .25s ease}
.rcontent{flex:1;padding:16px;display:grid;gap:9px;align-content:start}
.rbar{height:9px;border-radius:5px;background:var(--line)}
js
const btns = [...document.querySelectorAll('.rail button')];
const pill = document.getElementById('rpill');
function select(i) {
  btns.forEach((b, idx) => idx === i ? b.setAttribute('aria-current', 'page') : b.removeAttribute('aria-current'));
  pill.style.transform = 'translateY(' + (i * 40) + 'px)';
}
let auto = true, cur = 0;
select(0);
btns.forEach((b, i) => b.addEventListener('click', () => { auto = false; cur = i; select(i); }));
setInterval(() => { if (!auto) return; cur = (cur + 1) % btns.length; select(cur); }, 1500);

The basic structure — a nav of icon buttons with aria-current on the active screen — matches bottom navigation. Pairing each icon with a small label beneath it helps; icon-only items need an aria-label to supply an accessible name.

The difference from bottom navigation, covered there, is screen size — a rail sits vertically on wider tablet or desktop screens with room to spare, while bottom navigation lies horizontally at the bottom of a narrow mobile screen within thumb's reach. The difference from a sidebar is width and content — a sidebar is wider, text-list-first, and sometimes holds submenus, while a rail is icon-first, much narrower, and usually holds only top-level destinations with no submenus.

It's common for a rail to reshape into bottom navigation once the viewport narrows past a breakpoint.