側邊導航欄默認僅顯示圖標,鼠標懸停平滑展開文字標籤,右側三角形指示器同步翻轉。

父容器 overflow: hidden 會剪切偽元素 ::after 產生的三角形,導致指示器消失。
/* HTML 結構 */
<div id="nav">
<a id="nav-main"><span><i class="icon-home"></i> 主界面</span></a>
<a id="nav-sum"><span><i class="icon-laptop"></i> 統計界面</span></a>
</div>
/* 關鍵 CSS */
#nav a {
width: 30px; height: 52px;
position: relative;
overflow: hidden; /* 只裁剪內部 span,不影響 ::after */
}
#nav a span {
display: inline-block;
width: 46px; height: 50px;
overflow: hidden; /* 文字截斷由這裡控制 */
transition: width 0.5s; /* 平滑展開 */
}
#nav a::after { /* 三角形附著在 a 上,不受 span overflow 影響 */
content: ''; position: absolute;
right: -16px; bottom: 0;
border: 16px solid transparent;
border-left-color: inherit; /* 繼承父級背景色 */
}
#nav a:hover { width: 100px; }
#nav a:hover span { width: 116px; }
@keyframes extend-a {
0% { width: 30px; } 100% { width: 100px; }
}
@keyframes extend-span {
0% { width: 46px; } 100% { width: 116px; }
}
#nav a:hover { animation: extend-a 0.5s forwards; }
#nav a span:hover { animation: extend-span 0.5s forwards; }
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css">
<a> 的 ::after,文字截斷由內層 <span> 的 overflow: hidden 控制,互不干擾border-left-color: inherit 自動跟隨導航項背景色,無需重複定義forwards 保持終態,避免閃爍