談到 <fieldset>
與 <legend>
,大部分人肯定會比較陌生,在 HTML 標籤中,屬於比較少用的那一批。
我最早知道這兩個標籤,是在早年學習 reset.css 或者 normalize.css 時,在這些重置統一程式碼預設樣式的 CSS 中看到的。最近因為研究邊框,遇到了這兩個標籤,發現它們還是很有意思的,遂起一篇,將整理的一些知識點分享給大家。
瞭解 <fieldset>
與 <legend>
通常而言,<fieldset>
與 <legend>
比較常用在表單當中。
<fieldset>
:HTML<fieldset>
元素用於對錶單中的控制元素進行分組<legend>
:在<fieldset>
中內建了一個<legend>
元素作為 fieldset 的標題
簡單而言,fieldset 可以單獨使用,對錶單的元素進行分組,而 legend
則需要和 fieldset
配套使用,成對出現,作為分組的標題。
看個簡單的例子,簡單的 HTML 及結構如下:
<fieldset> <legend>Form</legend> <div> <label>Name :</label><input type="text" placeholder="input Name" /> </div> <div> <label>Password :</label><input type="text" placeholder="input Name" /> </div> </fieldset>
fieldset { border: 1px solid#ddd; padding: 12px; } legend { font-size: 18px; padding: 0 10px; }
效果如下:
CodePen Demo -- fieldset & legend Demo
比較有意思的點在於,如果給 fieldset
設定了 border
邊框,則 legend
元素內的內容則會作為分組的標題,嵌入 border
內。
控制 legend
的位置及樣式
對於 legend
的位置和樣式,是可以進行控制的。
對於位置,我們可以通過 margin
和 父元素的 padding
進行控制,如果父元素 fieldset
不設定 padding
,legend
不設定 margin ,則 legend
預設定位在最左側。
fieldset { border: 1px solid#ddd; // padding: 12px; } legend { font-size: 18px; }
效果圖:
通過改變 legend
的 margin
或者父元素的 padding-left
,可以控制標題的初始位置:
fieldset { border: 1px groove #ddd; } legend { animation: marginMove 10s infinite alternate; } @keyframes marginMove { 100% { margin-left: 100px; } }
效果圖:
通過控制 legend
的 padding
,可以增加周圍元素的區域,讓留白更多一點。
應用場景 -- 標題兩側橫線
瞭解了上述基本知識後,我們就可以稍微開始深入,想一想,上述 <fieldset>
與 <legend>
的一些有意思的應用場景。
最適合的場景我覺得應該就是標題兩側帶橫線的佈局了。類似這樣:
當然,這個佈局的解決方式有很多,通常會使用偽元素來生成左右兩側的橫線,或者是通過絕對定位區域性進行覆蓋疊加。
這裡,使用 <fieldset>
與 <legend>
非常快速的完成:
<div class="g-container"> <fieldset><legend>排行榜</legend></fieldset> </div>
fieldset { width: 300px; height: 24px; border: 1px solid transparent; border-top-color: #000; } legend{ margin: auto; padding: 0 10px; }
fieldset
只設定上邊框,通過 margin: auto
將標題定位到中間, 通過 padding
控制兩側的留白。非常的完美。
CodePen Demo -- fieldset & legend Demo 2
邊框巢狀文字
在這篇文章中 -- How to Add Text in Borders Using Basic HTML Elements,還介紹了一種非常有意思的使用場景,在邊框中巢狀文字。
想象一下,一個 <fieldset>
元素配合一個 <legend>
元素,可以生成一個邊框嵌文字的效果,那麼,將多組組合,再進行定位排布,就可以生成多邊邊框巢狀文字的效果了。
虛擬碼如下:
<div class="g-container"> <fieldset><legend>CSS fieldset</legend></fieldset> <fieldset><legend>HTML element</legend></fieldset> <fieldset><legend>JavaScript</legend></fieldset> <fieldset><legend>TypeScript</legend></fieldset> </div>
.g-container { position: relative; width: 300px; height: 300px; } fieldset{ position: absolute; width: 300px; height: 300px; border: 10px solid transparent; border-top-color: #000; } legend{ padding: 0 10px; } fieldset:nth-of-type(2){ transform: rotate(90deg); } fieldset:nth-of-type(3){ transform: rotate(180deg); } fieldset:nth-of-type(3)>legend{ transform: rotate(180deg); } fieldset:nth-of-type(4){ transform: rotate(-90deg); }
效果圖如下:
通過多個 <fieldset>
和 <legend>
的組合,我們可以拼出一個容器的 4 個邊,組成一個非常好看的邊框嵌文字效果。
通過給 legend
加上 animation
,讓文字動起來
legend{ animation: move 3s infinite linear alternate; } @keyframes move { 100% { margin-left: 70px; } }
CodePen Demo -- Border Text Design using HTML fieldset and legend
好,基於這個,我們就可以去生成各種 N 邊形邊框嵌文字的邊框了。下面是簡單的嘗試 幾種多邊形邊框。
CodePen Demo -- fieldset and legend generate polygon
最後
本文到此結束,希望對你有幫助 :)
更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。
如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。