CSS 三角形在產生過程中會以四種可預測的方式無法正確呈現:非零的內容框會讓形狀變成梯形、未宣告的透明邊框會覆蓋掉有顏色的一邊、奇數尺寸的進位會悄悄偷走一個像素,以及為裝飾用途撰寫的無障礙標記被重複用於具意義的狀態。這些問題大部分都存在於同一小群宣告中——元素的內容寬度與高度、四個完整展開的 border 屬性,以及 HTML 中唯一的副標籤屬性——這代表在任何程式碼複製到樣式表之前,可以依照固定順序進行診斷。依照這個固定順序逐步處理各種失敗模式,並在每個步驟搭配即時預覽,就是讓三角形在每個瀏覽器中都能乾淨呈現的關鍵,與那些在 DevTools 中看起來正確、但在有顏色的背景上、200% 縮放下或強制色彩模式下會壞掉的情況有所不同。CSS Triangle Generator 並排展示這些宣告與真實預覽,因此每個潛在的失敗都可以刻意觸發並直接從螢幕上讀出,而不是在頁面上線後才費力尋找。

破壞所產生 CSS 三角形的四種失敗模式
邊框三角形看起來很神秘,因為形狀的每個部分都是由邊框繪製而成,但元素本身應該什麼都不包含。這個單一的預期反轉幾乎可以解釋所有被回報的錯誤。任何大於零的寬度或高度都會在繪製的邊框下方加上一個內部矩形,而該矩形至少有一個邊會成為主要的視覺線。任何未明確設為透明的邊框都會以實心顏色加入幾何形狀中。任何在紙上看起來正確的進位數值,在瀏覽器量化半數後都可能會縮減一個像素。任何為裝飾分隔符所撰寫的 aria 屬性,都可能悄悄剝奪一個需要標籤的控制項的語意。
一旦點出原因,這些失敗模式中的每一種都可以在一分鐘內修復。下方的診斷表將螢幕上的症狀對應到宣告區塊中的根本原因,以及產生器可以套用的修正方式。
| 螢幕上的症狀 | 根本原因 | 應檢查項目 | 產生器中的修正 |
|---|---|---|---|
| 一邊較短的梯形 | 忘記設定 width: 0 與 height: 0 | 元素的內容框 | 重設寬度與高度;產生器會強制執行零尺寸規則 |
| 三角形在其中一個斜邊上消失 | 某個邊框未宣告為透明 | 四個完整展開的 border 顏色 | 重設方向,讓兩個非指向的邊讀為透明 |
| 三角形比要求的尺寸短一個像素 | 瀏覽器對奇數底邊等分的量化處理 | 兩個透明邊框的總和 | 改用偶數尺寸,或保留產生器已選擇的 20/21 分割 |
| 在 DevTools 中可見,但對螢幕閱讀器為靜默 | 在具意義的形狀上設了 aria-hidden="true" | HTML 程式碼片段與周圍的控制項 | 移除裝飾用的程式碼片段,並為互動元素加上帶標籤的文字 |
為什麼非零的內容框會讓形狀變成梯形
用來繪製邊框三角形的元素沒有繪製內容;其可見區域是由四個在角落相接的邊框組成。如果寬度或高度保留在使用者代理自預設值,每個邊框就會從偏移的邊開始,而不是從一個共享的單一點開始,四個傾斜的角落便無法再加總成一個封閉的三角形。瀏覽器會將產生的矩形填上元素的正常背景——預設為透明,因此看不見——而繪製出的形狀就會變成梯形,其短邊等於剩餘的寬度或高度。
MDN 的 背景與邊框指南說明了透明邊框如何繪製對角線的角落。CSS 背景與邊框規範則定義了產生器明確寫出的完整展開 border 寬度、樣式與顏色。兩份資料來源都確認這個規則是機械性的,而非魔術性的:非零的內容框仍會產生所要求尺寸的邊框,但額外的內容區域會位於其下方並使角落產生偏移。產生器會以零寬度與零高度來呈現元素,讓角落收合為單一一點。
奇數尺寸與未宣告的透明邊框如何流失像素
一旦內容框歸零,下一個失敗點就在垂直方向的尺寸。一個寬 41px 的向上三角形,使用 41px 的有顏色底部邊框,以及兩個透明側邊框,兩者合在一起同樣橫跨 41px。將這個範圍平分為兩半會得到每邊 20.5px。在實際情況下,Chromium 可能會將兩個 20.5px 的邊框量化為各 20px,導致繪製出的三角形比要求的寬度窄一個像素。
產生器會預先避免這種量化,將其中一個邊框設為向下取整,另一個設為向上取整,因此 41px 會變成一邊 20px、另一邊 21px。總和保持精準,幾何形狀在視覺上仍對稱,而且不需要靠人腦記住這個變通方法。相同的向下與向上取整分割方式,也適用於垂直三角形在寬度上的處理,以及水平三角形在高度上的處理。點陣化仍會因瀏覽器縮放以及裝置像素比而有所不同,因此預覽僅供參考,無法保證最終繪製結果。
使用 CSS Triangle Generator 進行即時診斷
手動逐一檢查失敗模式雖然可行,但 CSS Triangle Generator 的診斷價值在於,損壞的狀態與可運作的基準版本會並排顯示在同一個畫面上。該頁面提供同步的 CSS 與 HTML 面板,且相同的邊框宣告會同時用於預覽與複製出來的程式碼。方向、寬度、高度與一個六位數的 HEX 顏色是唯一的輸入;其餘的幾何形狀都從這四個值衍生出來。
產生與複製都在目前的瀏覽器分頁中進行,因此沒有上傳、沒有帳號,也沒有已儲存的設計狀態需要清除。因此,以不同的尺寸或顏色重新執行診斷是完全免費的。數個反覆出現的症狀——梯形、缺少的斜邊、流失的像素——在 相關錯誤指南中都有專屬的逐步說明,當同一個 bug 反覆出現時,這是非常實用的交叉驗證。
在產生後以五個有序步驟診斷 CSS 三角形
- 在產生器中設定輸入。選擇方向、寬度、高度與一個六位數的 HEX 顏色。寬度與高度請維持在十到三百整數像素的規定範圍內,讓產生器能僅依據這些值衍生出幾何形狀。
- 在三角形實際使用的大小與背景下檢查預覽。尋找梯形、缺少的斜邊、本該是尖端卻出現平坦邊,以及在 200% 縮放下任何可見的鋸齒。預覽使用與將複製到樣式表的同一組邊框幾何。
- 依宣告順序讀取 CSS 面板。確認寬度為零、高度為零、三個邊框為透明,以及一個邊框帶有選定的顏色。每個完整展開屬性都明確寫出,讓幾何形狀從一開始就保持可稽核狀態。
- 讀取 HTML 面板,並判斷 aria-hidden="true" 是否仍適合該情境。如果三角形是用於傳達狀態、方向、驗證或導覽,請將裝飾用的程式碼片段替換為圍繞它的帶標籤語意控制項,並移除該靜默屬性。
- 依序複製 CSS 與 HTML。這兩個剪貼簿請求是分開的,狀態會標示複製的格式,而剪貼簿被拒絕時,兩個程式碼區塊都會保持可見以便手動選取。如果預設類別會與現有樣式表衝突,請將其重新命名,然後一起更新兩組輸出。
稍後才顯現的主題、縮放與無障礙介面
有些問題只有在三角形被貼到實際元件後才會出現。第一個是主題設定:產生器的 HEX 顏色會以不透明邊框方式繪製,且不會跟隨設計 token、CSS 變數、漸層、currentColor 值,或任何 alpha 與廣色域語法。以可信賴的 token 替換所複製 CSS 中的字面值雖然合理,但開發者必須驗證目標語法是否受支援,以及透明側邊框是否仍保持透明。
第二個是對比。三角形若緊鄰內文,應同時在淺色與深色主題中檢查,而非假設其能從容器繼承足夠的對比。第三個是強制色彩模式,在該模式下,使用者代理可以將任何不透明顏色替換為系統調色盤;以單一 HEX 值繪製的邊框三角形特別容易受到此覆寫影響,因為沒有填色、描邊或次要 token 可以退而求其次。在 200% 縮放下進行一次簡短的強制色彩測試,即可在使用者實際接觸之前抓出大多數這類問題。
當邊框技巧不適用於該幾何形狀時
邊框三角形很精簡、不依賴其他資源,且在某個程度內具有可預測性。當形狀需要比純色四方向箭頭更多的東西時,這個可預測性就到了盡頭:圓角尖端、弧形邊緣、空心中心、漸層填色、真實描邊、柔和陰影,或任意多邊形。MDN 指南明確指出這些並非邊框的屬性;它們屬於 SVG 與 clip-path。產生器對這項限制誠實以對,且拒絕捏造底層技術無法表達的語法。
| 需求 | 邊框三角形 | SVG | clip-path |
|---|---|---|---|
| 純 CSS 的純色四方向箭頭 | 適用 | 適用,但需要額外的標記 | 適用,但需要額外的標記 |
| 圓角尖端或弧形邊緣 | 不支援 | 適用 | 適用 |
| 空心形狀、漸層或描邊 | 不支援 | 適用 | 適用 |
| 文字旁單一裝飾性箭頭 | 適用 | 適用 | 適用 |
| 需要帶標籤語意的控制項 | 搭配帶標籤文字時適用 | 搭配 role 與 label 時適用 | 搭配 role 與 label 時適用 |
對於一個指向四個方向之一、且尺寸在三百像素以下的純色裝飾三角形,產生器是從損壞走向正確的最短路徑。對於其他需求,診斷會在限制處停下,由開發者改選 SVG 或 clip-path,並在目標環境中測試瀏覽器支援。知道何時該轉換工具,本身就是疑難排解過程的一部分。
相關閱讀: 疑難排解從影像取得平均顏色:首先應檢查的事項。