アイコンスライド
シンプルな遷移ボタン。ホバーで矢印アイコンが右からスライドインしながらラベルがわずかに左へ寄り、クリックすると矢印が前へ弾んで進む感覚を演出します。次へ進む導線に。
ライブデモ
コード
HTML
<!-- アイコンスライドボタン: hoverで矢印がスライドインしラベルが少し左へ寄る。押すと前進感のある弾みが出る -->
<div class="stage">
<button class="btn-slide" type="button" aria-label="次のステップへ進む">
<span class="btn-slide__label">次のステップへ</span>
<span class="btn-slide__icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M4 12h14M13 6l6 6-6 6"></path></svg>
</span>
</button>
<p class="hint">ホバーで矢印がスライドインし、クリックすると前へ弾みます</p>
</div>
CSS
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
overflow: hidden;
font-family: "Segoe UI", system-ui, sans-serif;
background: radial-gradient(circle at 50% 20%, #eefcf6 0%, #e4f3ea 50%, #d8ecdf 100%);
}
.stage {
display: grid;
place-items: center;
gap: 22px;
}
.btn-slide {
position: relative;
display: inline-flex;
align-items: center;
overflow: hidden;
border: none;
border-radius: 999px;
padding: 18px 34px;
font-size: 16px;
font-weight: 700;
letter-spacing: .02em;
color: #fff;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
background: linear-gradient(135deg, #16a870 0%, #0d8f5f 100%);
box-shadow: 0 12px 26px rgba(13, 143, 95, .32);
transition: transform .3s cubic-bezier(.22, 1, .36, 1), box-shadow .35s ease;
/* 待機時のアイドル: 影がゆっくり呼吸してクリック可能なことを伝える */
animation: slide-idle-breathe 3.2s ease-in-out infinite;
}
@keyframes slide-idle-breathe {
0%, 100% { box-shadow: 0 12px 26px rgba(13, 143, 95, .32); }
50% { box-shadow: 0 15px 34px rgba(13, 143, 95, .48); }
}
.btn-slide__label {
transition: transform .35s cubic-bezier(.22, 1, .36, 1);
}
/* アイコンは幅0・不透明度0で畳んでおき、hoverで幅/余白/不透明度/位置を同時に開く */
.btn-slide__icon {
display: grid;
place-items: center;
width: 0;
margin-left: 0;
opacity: 0;
transform: translateX(-10px);
transition: width .35s cubic-bezier(.22, 1, .36, 1),
margin-left .35s cubic-bezier(.22, 1, .36, 1),
opacity .3s ease,
transform .35s cubic-bezier(.22, 1, .36, 1);
}
.btn-slide__icon svg {
width: 18px;
height: 18px;
flex: none;
display: block;
}
.btn-slide__icon svg path {
fill: none;
stroke: #fff;
stroke-width: 2.4;
stroke-linecap: round;
stroke-linejoin: round;
}
.btn-slide:hover,
.btn-slide:focus-visible {
transform: translateY(-2px);
box-shadow: 0 18px 36px rgba(13, 143, 95, .42);
animation-play-state: paused;
}
.btn-slide:hover .btn-slide__label,
.btn-slide:focus-visible .btn-slide__label {
transform: translateX(-4px);
}
.btn-slide:hover .btn-slide__icon,
.btn-slide:focus-visible .btn-slide__icon {
width: 18px;
margin-left: 10px;
opacity: 1;
transform: translateX(0);
}
.btn-slide:active {
transform: translateY(0) scale(.97);
}
/* 押下時: アイコンがさらに前へ弾んで「前進感」を演出 */
.btn-slide:active .btn-slide__icon {
transform: translateX(4px);
}
.btn-slide:focus-visible {
outline: 3px solid rgba(13, 143, 95, .5);
outline-offset: 4px;
}
.hint {
margin: 0;
font-size: 13px;
color: #4b6b5b;
text-align: center;
}
@media (prefers-reduced-motion: reduce) {
.btn-slide { animation: none; }
}
JavaScript
/* アイコンスライドボタン: 演出はCSSのみで完結(hover/active時のwidth・transformの遷移)。JS不要。 */
🤖 AIエージェント用プロンプト
このままコピーしてAIに貼り付け「追加する場所」だけ書き換えればOK
あなたは熟練のフロントエンドエンジニアです。私のWebサイトに「アイコンスライド」の効果を追加してください。
# 追加してほしい効果
アイコンスライド(ボタン)
シンプルな遷移ボタン。ホバーで矢印アイコンが右からスライドインしながらラベルがわずかに左へ寄り、クリックすると矢印が前へ弾んで進む感覚を演出します。次へ進む導線に。
# 追加する場所
👉【ここに対象箇所を記入:例「トップのヒーローセクション」「お問い合わせボタン」「記事カードの一覧」など】
# 参考実装(この見た目・挙動を再現してください)
【HTML】
<!-- アイコンスライドボタン: hoverで矢印がスライドインしラベルが少し左へ寄る。押すと前進感のある弾みが出る -->
<div class="stage">
<button class="btn-slide" type="button" aria-label="次のステップへ進む">
<span class="btn-slide__label">次のステップへ</span>
<span class="btn-slide__icon" aria-hidden="true">
<svg viewBox="0 0 24 24"><path d="M4 12h14M13 6l6 6-6 6"></path></svg>
</span>
</button>
<p class="hint">ホバーで矢印がスライドインし、クリックすると前へ弾みます</p>
</div>
【CSS】
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
overflow: hidden;
font-family: "Segoe UI", system-ui, sans-serif;
background: radial-gradient(circle at 50% 20%, #eefcf6 0%, #e4f3ea 50%, #d8ecdf 100%);
}
.stage {
display: grid;
place-items: center;
gap: 22px;
}
.btn-slide {
position: relative;
display: inline-flex;
align-items: center;
overflow: hidden;
border: none;
border-radius: 999px;
padding: 18px 34px;
font-size: 16px;
font-weight: 700;
letter-spacing: .02em;
color: #fff;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
background: linear-gradient(135deg, #16a870 0%, #0d8f5f 100%);
box-shadow: 0 12px 26px rgba(13, 143, 95, .32);
transition: transform .3s cubic-bezier(.22, 1, .36, 1), box-shadow .35s ease;
/* 待機時のアイドル: 影がゆっくり呼吸してクリック可能なことを伝える */
animation: slide-idle-breathe 3.2s ease-in-out infinite;
}
@keyframes slide-idle-breathe {
0%, 100% { box-shadow: 0 12px 26px rgba(13, 143, 95, .32); }
50% { box-shadow: 0 15px 34px rgba(13, 143, 95, .48); }
}
.btn-slide__label {
transition: transform .35s cubic-bezier(.22, 1, .36, 1);
}
/* アイコンは幅0・不透明度0で畳んでおき、hoverで幅/余白/不透明度/位置を同時に開く */
.btn-slide__icon {
display: grid;
place-items: center;
width: 0;
margin-left: 0;
opacity: 0;
transform: translateX(-10px);
transition: width .35s cubic-bezier(.22, 1, .36, 1),
margin-left .35s cubic-bezier(.22, 1, .36, 1),
opacity .3s ease,
transform .35s cubic-bezier(.22, 1, .36, 1);
}
.btn-slide__icon svg {
width: 18px;
height: 18px;
flex: none;
display: block;
}
.btn-slide__icon svg path {
fill: none;
stroke: #fff;
stroke-width: 2.4;
stroke-linecap: round;
stroke-linejoin: round;
}
.btn-slide:hover,
.btn-slide:focus-visible {
transform: translateY(-2px);
box-shadow: 0 18px 36px rgba(13, 143, 95, .42);
animation-play-state: paused;
}
.btn-slide:hover .btn-slide__label,
.btn-slide:focus-visible .btn-slide__label {
transform: translateX(-4px);
}
.btn-slide:hover .btn-slide__icon,
.btn-slide:focus-visible .btn-slide__icon {
width: 18px;
margin-left: 10px;
opacity: 1;
transform: translateX(0);
}
.btn-slide:active {
transform: translateY(0) scale(.97);
}
/* 押下時: アイコンがさらに前へ弾んで「前進感」を演出 */
.btn-slide:active .btn-slide__icon {
transform: translateX(4px);
}
.btn-slide:focus-visible {
outline: 3px solid rgba(13, 143, 95, .5);
outline-offset: 4px;
}
.hint {
margin: 0;
font-size: 13px;
color: #4b6b5b;
text-align: center;
}
@media (prefers-reduced-motion: reduce) {
.btn-slide { animation: none; }
}
【JavaScript】
/* アイコンスライドボタン: 演出はCSSのみで完結(hover/active時のwidth・transformの遷移)。JS不要。 */
# 外部ライブラリ
なし(追加ライブラリ不要)
# 守ってほしいこと
- 既存のHTML構造・レイアウト・デザインを壊さないこと。必要に応じてクラス名・色・サイズを私のサイトに合わせて調整してよい。
- クラス名やidが既存と衝突しないよう、必要なら接頭辞で名前空間を分けること。
- レスポンシブ対応と prefers-reduced-motion への配慮を入れること。
- 私のサイトのフレームワーク(React / Vue / 素のHTML など)に合わせて実装すること。不明な場合は素のHTML/CSS/JSで提示し、組み込み手順も説明すること。
- 変更後の確認手順も簡潔に教えてください。