一些 HTML 元素带有预设设计,例如<input type="checkbox">
元素的不方便的小方块、<meter>
元素的有限颜色条以及<details>
元素的“某些方面让我感到困扰”的箭头。我们可以对其进行样式设置以匹配我们网站的现代美学,同时利用其功能。还有许多元素很少被用作同时其默认外观和功能在现代网页设计中不太需要。
<fieldset>
HTML 元素及其子元素<legend>
就是这样的一个例子。
<fieldset>
元素传统上用于对表单控件进行分组和访问。我们可以通过屏幕上分组内容周围存在边框来直观地注意到分组。此组的标题位于<legend>
元素内,该元素作为<fieldset>
的第一个子元素添加。
<fieldset>
和<legend>
的这种组合创建了一个独特的现成的“边框中的文本”设计,其中标题放置在边框所在的位置,并且边框线不会穿过文本。边框线在遇到标题文本的开头时“断开”,并在文本结束之后恢复。
在这篇文章中,我们将利用<fieldset>
和<legend>
组合来创建一个更现代的边框文本设计,该设计快速易于编码和更新。
对于四个边框,我们需要四个<fieldset>
元素,每个元素在内部包含一个<legend>
元素。我们将出现在边框上的文本添加到<legend>
元素中。
<fieldset><legend>Wash Your Hands</legend></fieldset>
<fieldset><legend>Stay Apart</legend></fieldset>
<fieldset><legend>Wear A Mask</legend></fieldset>
<fieldset><legend>Stay Home</legend></fieldset>
首先,我们将<fieldset>
元素彼此堆叠在网格单元格中,并为其提供边框。您可以使用任何您想要的方式堆叠它们——它不一定要是网格。
由于<legend>
元素的文本默认情况下出现在<fieldset>
的顶边框处,因此每个<fieldset>
元素仅保留其顶部边框可见,而其余边框则为透明。
此外,我们为所有<fieldset>
元素提供了一个box-sizing
属性,其值为border-box
,以便<fieldset>
元素的宽度和高度也包含其边框和填充大小。稍后执行此操作会在我们设置<legend>
元素的样式时创建分层设计。
body {
display: grid;
margin: auto; /* to center */
margin-top: calc(50vh - 170px); /* to center */
width: 300px; height: 300px;
}
fieldset {
border: 10px solid transparent;
border-top-color: black;
box-sizing: border-box;
grid-area: 1 / 1; /* first row, first column */
padding: 20px;
width: inherit;
}
在此之后,我们旋转最后三个<fieldset>
元素,以便将它们的顶部边框用作我们设计的侧面和底部边框。
/* rotate to right */
fieldset:nth-of-type(2){ transform: rotate(90deg); }
/* rotate to bottom */
fieldset:nth-of-type(3){ transform: rotate(180deg); }
/* rotate to left */
fieldset:nth-of-type(4){ transform: rotate(-90deg); }
接下来是设置<legend>
元素的样式。使用<legend>
元素创建平滑边框文本的关键是为其提供零(或足够小)的line-height
。如果它具有较大的行高,则会取代其所在边框的位置,将边框向下推。当边框随行高移动时,我们将无法连接设计的四个侧面,并且需要重新调整边框。
legend {
font: 15pt/0 'Averia Serif Libre';
margin: auto; /* to center */
padding: 0 4px;
}
fieldset:nth-of-type(3) > legend {
transform: rotate(180deg);
}
我使用font
简写属性为<legend>
元素的font-size
、line-height
和font-family
属性提供值。
添加我们设计底部边框处文本的<legend>
元素,fieldset:nth-of-type(3)>legend
,由于其旋转的<fieldset>
父元素而上下颠倒。垂直翻转该<legend>
元素以使其文本正向显示。
向第一个<fieldset>
元素添加图像,您将得到如下所示的内容
横向边距可以沿边框移动文本。具有auto
值的左和右边距将使文本居中,如上图所示。只有左边距具有auto
值时,文本才会与右侧对齐,反之亦然,对于右边距。
奖励:经过简短的几何绕行,这里有一个我使用相同技术制作的八边形设计
不错的技巧!请务必添加
role="presentation"
(详情)以防止屏幕阅读器等辅助技术将这些元素宣布为fieldset
和legend
,这会让使用这些工具的用户感到困惑。感谢分享。我一直在寻找这个。:D
太赞了
这让我想起了那些带有两侧线条的“分割标题”。我记得(这已经是很久以前了!)一些解决方案使用背景颜色隐藏文本下方的线条,但当然这种方法在图像或多色背景上不起作用。我一直在使用
::before
和::after
技巧,但是经过一些样式设置,fieldset
方法也可以使用。你救了我,真的非常感谢你
我想知道在表单外部使用
fieldset
+legend
来实现“带标签的边框”效果是否合法。我听到的是,这样做并非不可饶恕的罪过,特别是当我们可以将其标记为仅出于演示目的而完成时。好的,但是如何在不破坏边框的情况下添加文本?我想在形状边框内添加文本。