リング+状態インジケータ

虹色グラデーションのリングをまとったアバターに、右下でオンライン・離席中・取り込み中を伝える小さな状態ドットを添えました。オンラインだけが静かに脈動します。

#css#avatar#status

ライブデモ

コード

HTML
<!-- リング+状態インジケータ: グラデーションリングのアバターに稼働状態のドットを添える -->
<ul class="roster" aria-label="メンバーの稼働状況">
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/64/200/200" alt="つむぎのアバター写真" width="60" height="60">
      <span class="dot dot--online" role="img" aria-label="オンライン"></span>
    </span>
    <p class="roster__name">つむぎ</p>
  </li>
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/91/200/200" alt="陽菜のアバター写真" width="60" height="60">
      <span class="dot dot--away" role="img" aria-label="離席中"></span>
    </span>
    <p class="roster__name">陽菜</p>
  </li>
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/1027/200/200" alt="蓮のアバター写真" width="60" height="60">
      <span class="dot dot--busy" role="img" aria-label="取り込み中"></span>
    </span>
    <p class="roster__name">蓮</p>
  </li>
</ul>
CSS
* { box-sizing: border-box; }
body {
  margin: 0;
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: 28px;
  font-family: "Hiragino Sans", "Segoe UI", system-ui, -apple-system, sans-serif;
  background:
    radial-gradient(circle at 20% 15%, rgba(129, 140, 248, .2) 0%, transparent 42%),
    radial-gradient(circle at 88% 85%, rgba(244, 114, 182, .14) 0%, transparent 46%),
    #14121f;
  color: #ece9f5;
}

.roster {
  list-style: none;
  display: flex;
  gap: 30px;
  margin: 0;
  padding: 28px 32px;
  border-radius: 22px;
  background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .09);
  box-shadow: 0 26px 60px -26px rgba(0, 0, 0, .7);
  flex-wrap: wrap;
  justify-content: center;
}

.roster__item {
  display: grid;
  justify-items: center;
  gap: 10px;
}

/* リング: conic-gradientをpaddingで縁取りにして虹色の輪を作る */
.ring {
  position: relative;
  display: inline-flex;
  padding: 3px;
  border-radius: 50%;
  background: conic-gradient(from 220deg, #f472b6, #facc15, #38bdf8, #f472b6);
  transition: transform .3s ease, filter .3s ease;
}
.roster__item:hover .ring {
  transform: scale(1.08);
  filter: brightness(1.15);
}

.ring__avatar {
  display: block;
  width: 60px;
  height: 60px;
  border-radius: 50%;
  object-fit: cover;
  border: 3px solid #171425;
}

.dot {
  position: absolute;
  right: 0;
  bottom: 0;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 3px solid #171425;
}

.dot--online {
  background: #22c55e;
  --pulse: rgba(34, 197, 94, .55);
  animation: dot-pulse 1.8s ease-out infinite;
}
.dot--away { background: #f59e0b; }

/* 取り込み中: Do-Not-Disturbの慣習に合わせ横棒を重ねる */
.dot--busy { background: #ef4444; }
.dot--busy::after {
  content: '';
  position: absolute;
  left: 3px;
  right: 3px;
  top: 50%;
  height: 2px;
  transform: translateY(-50%);
  background: #fff;
  border-radius: 2px;
}

.roster__name {
  margin: 0;
  font-size: 12.5px;
  font-weight: 600;
  color: rgba(236, 233, 245, .7);
}

@keyframes dot-pulse {
  0%   { box-shadow: 0 0 0 0 var(--pulse, transparent); }
  70%  { box-shadow: 0 0 0 7px rgba(0, 0, 0, 0); }
  100% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); }
}

@media (prefers-reduced-motion: reduce) {
  .dot--online { animation: none !important; }
  .ring { transition: filter .3s ease; }
  .roster__item:hover .ring { transform: none; }
}

@media (max-width: 480px) {
  .roster { gap: 20px; padding: 22px 18px; }
}
JavaScript
// リングの発光とドットの脈動はCSSのみで完結するためJSは不要です。

🤖 AIエージェント用プロンプト

このままコピーしてAIに貼り付け「追加する場所」だけ書き換えればOK
あなたは熟練のフロントエンドエンジニアです。私のWebサイトに「リング+状態インジケータ」の効果を追加してください。

# 追加してほしい効果
リング+状態インジケータ(バッジ & アバター)
虹色グラデーションのリングをまとったアバターに、右下でオンライン・離席中・取り込み中を伝える小さな状態ドットを添えました。オンラインだけが静かに脈動します。

# 追加する場所
👉【ここに対象箇所を記入:例「トップのヒーローセクション」「お問い合わせボタン」「記事カードの一覧」など】

# 参考実装(この見た目・挙動を再現してください)
【HTML】
<!-- リング+状態インジケータ: グラデーションリングのアバターに稼働状態のドットを添える -->
<ul class="roster" aria-label="メンバーの稼働状況">
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/64/200/200" alt="つむぎのアバター写真" width="60" height="60">
      <span class="dot dot--online" role="img" aria-label="オンライン"></span>
    </span>
    <p class="roster__name">つむぎ</p>
  </li>
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/91/200/200" alt="陽菜のアバター写真" width="60" height="60">
      <span class="dot dot--away" role="img" aria-label="離席中"></span>
    </span>
    <p class="roster__name">陽菜</p>
  </li>
  <li class="roster__item">
    <span class="ring">
      <img class="ring__avatar" src="https://picsum.photos/id/1027/200/200" alt="蓮のアバター写真" width="60" height="60">
      <span class="dot dot--busy" role="img" aria-label="取り込み中"></span>
    </span>
    <p class="roster__name">蓮</p>
  </li>
</ul>

【CSS】
* { box-sizing: border-box; }
body {
  margin: 0;
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: 28px;
  font-family: "Hiragino Sans", "Segoe UI", system-ui, -apple-system, sans-serif;
  background:
    radial-gradient(circle at 20% 15%, rgba(129, 140, 248, .2) 0%, transparent 42%),
    radial-gradient(circle at 88% 85%, rgba(244, 114, 182, .14) 0%, transparent 46%),
    #14121f;
  color: #ece9f5;
}

.roster {
  list-style: none;
  display: flex;
  gap: 30px;
  margin: 0;
  padding: 28px 32px;
  border-radius: 22px;
  background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .09);
  box-shadow: 0 26px 60px -26px rgba(0, 0, 0, .7);
  flex-wrap: wrap;
  justify-content: center;
}

.roster__item {
  display: grid;
  justify-items: center;
  gap: 10px;
}

/* リング: conic-gradientをpaddingで縁取りにして虹色の輪を作る */
.ring {
  position: relative;
  display: inline-flex;
  padding: 3px;
  border-radius: 50%;
  background: conic-gradient(from 220deg, #f472b6, #facc15, #38bdf8, #f472b6);
  transition: transform .3s ease, filter .3s ease;
}
.roster__item:hover .ring {
  transform: scale(1.08);
  filter: brightness(1.15);
}

.ring__avatar {
  display: block;
  width: 60px;
  height: 60px;
  border-radius: 50%;
  object-fit: cover;
  border: 3px solid #171425;
}

.dot {
  position: absolute;
  right: 0;
  bottom: 0;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 3px solid #171425;
}

.dot--online {
  background: #22c55e;
  --pulse: rgba(34, 197, 94, .55);
  animation: dot-pulse 1.8s ease-out infinite;
}
.dot--away { background: #f59e0b; }

/* 取り込み中: Do-Not-Disturbの慣習に合わせ横棒を重ねる */
.dot--busy { background: #ef4444; }
.dot--busy::after {
  content: '';
  position: absolute;
  left: 3px;
  right: 3px;
  top: 50%;
  height: 2px;
  transform: translateY(-50%);
  background: #fff;
  border-radius: 2px;
}

.roster__name {
  margin: 0;
  font-size: 12.5px;
  font-weight: 600;
  color: rgba(236, 233, 245, .7);
}

@keyframes dot-pulse {
  0%   { box-shadow: 0 0 0 0 var(--pulse, transparent); }
  70%  { box-shadow: 0 0 0 7px rgba(0, 0, 0, 0); }
  100% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); }
}

@media (prefers-reduced-motion: reduce) {
  .dot--online { animation: none !important; }
  .ring { transition: filter .3s ease; }
  .roster__item:hover .ring { transform: none; }
}

@media (max-width: 480px) {
  .roster { gap: 20px; padding: 22px 18px; }
}

【JavaScript】
// リングの発光とドットの脈動はCSSのみで完結するためJSは不要です。

# 外部ライブラリ
なし(追加ライブラリ不要)

# 守ってほしいこと
- 既存のHTML構造・レイアウト・デザインを壊さないこと。必要に応じてクラス名・色・サイズを私のサイトに合わせて調整してよい。
- クラス名やidが既存と衝突しないよう、必要なら接頭辞で名前空間を分けること。
- レスポンシブ対応と prefers-reduced-motion への配慮を入れること。
- 私のサイトのフレームワーク(React / Vue / 素のHTML など)に合わせて実装すること。不明な場合は素のHTML/CSS/JSで提示し、組み込み手順も説明すること。
- 変更後の確認手順も簡潔に教えてください。