아바타

Avatar

사용자를 나타내는 원형 이미지, 또는 이미지가 없을 때 이니셜·아이콘으로 대체되는 조각.

다른 이름: Profile pictureUser iconAvatar group
···
html
<div class="avw">
  <div class="av-single" id="avs"></div>
  <div class="av-group">
    <span class="av-item" style="background:#f25c8a">이</span>
    <span class="av-item" style="background:#5b5bf7">박</span>
    <span class="av-item" style="background:#18c29c">최</span>
    <span class="av-item more">+5</span>
  </div>
</div>
css
.avw{display:grid;gap:22px;justify-items:center}
.av-single{width:52px;height:52px;border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:700;font-size:16px;overflow:hidden;position:relative}
.av-single[data-state=loading]{background:linear-gradient(100deg,var(--line) 30%,color-mix(in srgb, var(--line) 40%, var(--surface)) 50%,var(--line) 70%);background-size:200% 100%;animation:avshim 1.2s ease-in-out infinite}
.av-single[data-state=photo]{background:linear-gradient(135deg,#5b5bf7,#f25c8a)}
.av-single[data-state=initials]{background:#7c6df2}
@keyframes avshim{0%{background-position:120% 0}100%{background-position:-20% 0}}
.av-group{display:flex}
.av-item{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:12px;font-weight:700;border:2px solid var(--bg);margin-left:-9px}
.av-item:first-child{margin-left:0}
.more{background:var(--muted)}
js
const av = document.getElementById('avs');
const states = ['loading', 'photo', 'initials'];
let i = 0;
function paint() {
  av.dataset.state = states[i];
  av.textContent = states[i] === 'initials' ? '정경' : '';
}
paint();
setInterval(() => { i = (i + 1) % states.length; paint(); }, 1500);

이미지가 로드되지 않으면(URL이 깨졌거나 아직 업로드하지 않은 신규 유저) <img onerror>로 감지해 이니셜이나 기본 아이콘으로 바꿔치기하는 폴백 처리가 필요합니다. 로딩 중에는 스켈레톤으로, 실패하면 이니셜로, 성공하면 실제 사진으로 — 세 상태를 다 준비해야 자연스럽습니다.

여러 사용자를 좁은 공간에 보여줄 땐 아바타를 살짝 겹쳐 쌓고 마지막에 "+5"처럼 남은 인원 수를 표시하는 "아바타 그룹" 패턴을 씁니다.

접근성: 사진이 의미를 담고 있으면(누구인지가 중요하면) alt에 이름을 넣고, 장식이거나 옆에 이름 텍스트가 이미 있어 중복되면 alt=""로 비웁니다.