不使用
标签,因为它如何绘制一个框并放置
< /a> 在它的顶部,越过边界。像这样。但是, fieldset
元素是为了组织表单,使用它进行通用设计并不比使用表格进行通用设计更好。所以,我的问题是......如何使用另一个标签获得相同的结果?必须在(或任何其他标签)下删除边框将使用),并且由于可能存在“复杂”的主体背景图像,因此我无法仅将图例的背景颜色设置为与下面的元素相匹配。
我希望它无需 JavaScript 即可工作,但 CSS3 和基于 XML 的格式(例如 SVG 或 XHTML)也可以。
I personally like the <fieldset>
tag because of how it draws a box and puts the <legend>
at the top of it, over the border. Like this.
However, the fieldset
element was made to organize forms, and using it for general design is no better than using tables for general design. So, my question is... how can I achieve the same result using another tag? The border has to be erased under the <legend>
(or whatever other tag will be used), and since there could be a "complex" body background image, I can't afford to just set the background-color
of the legend to match the one of the element under.
I'd like it to work without JavaScript, but CSS3 and XML-based formats (such as SVG or XHTML) are fine.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
演示 jsBin 链接
Demo jsBin link
不,这真的不可能。 甚至浏览器制造商自己也在努力解决这个问题。
当然,我无法抗拒不管怎样,尝试一下吧。我花了很多时间在这上面,Anonymous 同时提出了一个与我的非常相似的“解决方案”(他的
test1
)。但我的不需要固定宽度的“图例”。不过,这段代码显然有点破解,我不知道它在复杂的网站上表现如何。我也同意 Anonymous 的观点,即使用字段集进行分组并不像使用表格进行布局那么糟糕。字段集是为元素分组而设计的,尽管在 HTML 中它们实际上只应该用于对表单控件进行分组。
作为旁注,您可能还想查看 HTML5
figure
和figcaption
元素。这些似乎是您的示例中使用的最佳元素。不过,这仅适用于问题的语义部分,因为我认为这些元素的渲染方式与字段集/图例不同。更不用说当前的浏览器可能还不支持这些元素。
No, it isn't really possible. Even browser makers themselves are struggling with that.
Of course, I couldn't resist having a go at it anyway. And I spent so much time on that, that Anonymous came up with a "solution" rather similar to mine in the mean time (his
test1
). But mine doesn't need the fixed width "legend".This code is evidently a bit of a hack, though, and I don't know how well it'll fare in complex sites. I also agree with Anonymous that using a fieldset for grouping isn't nearly as bad as using tables for layout. Fieldsets were designed for grouping elements, though in HTML they're really only supposed to be used for grouping form controls.
As a side note, you might also want to have a look at the HTML5
figure
andfigcaption
elements. Those seem to be the best elements to use in your example.That's only for the semantic part of the issue, though, since I don't think those elements are rendered the same as a fieldset/legend. Not to mention that current browsers probably don't support these elements yet to begin with.
这是错误的。使用表格进行布局的主要问题是几乎没有布局映射到表格数据。第二个问题是,那些不映射到表格数据的数据都不是表格数据,而有些则不是。也就是说,标记的语义与页面的语义不匹配。此外,实际上,表格的布局机制通常使自定义样式和纯文本浏览变得痛苦或不可能。
现在,fieldset 显然具有对表单字段进行分组的意图。为外观选择元素几乎总是表明这是一个糟糕的选择。然而,对于这个具体的例子,我认为包含列表的 fieldset+legend 几乎没有缺点(事实上,我唯一能想到的是一个 scaper,它天真地将 fieldset 解释为发出表单信号,然后浪费用户的时间进行枚举它的内容不同;但我不知道有什么实际作用)。主要原因是 form 元素服务于包含输入的功能和语义目的,而 fieldset 从早期起就具有特殊的、不可再现的视觉效果。此外,如果字段集中的视觉元素以任何方式起作用,那么从语义上讲,字段集确实再次包含一组交互式小部件,这就是原始点。
我的建议是如果你愿意就使用它。我不会,但不是因为语义方面的考虑:我宁愿不依赖特殊效果,并且一般会避开形式而不是功能。
无论如何,这里有一些值得咀嚼的东西:
This is mistaken. The main problem with using tables for layout is that almost no layouts map to tabular data. The second problem is that none of those that don't map to tabular data are tabular data, and some of those that do aren't. That is, the semantics of the markup wouldn't match those of the page. In addition, pragmatically, tables' layout mechanism usually makes custom styling and text-only browsing painful or impossible.
Now, fieldset clearly has the intent of grouping form fields. And choosing an element for its appearance is almost always a sign it's a bad choice. However, for this specific example I would argue that a fieldset+legend containing a list has almost no disadvantages (in fact, the only one I can think of is a scaper which naively interprets fieldset as signalling a form and then wasting the user's time enumerating its contents differently; but I know of nothing which actually does this). The main reason for this is that the form element serves the functional and semantic purpose of containing inputs, while fieldset has possessed since the early days had special, non-reproducable visual effects. In addition, if the visual elements in the fieldset are in any way functional, semantically the fieldset does again contain a set of interactive widgets, which was the original point.
My advice is to use it if you want to. I wouldn't, but not because of semantic considerations: I prefer not to rely on special effects, and eschew form over function in general.
Anyway, here's something to chew on:
这里有一个可能的解决方案,重点是简单性(如果您可以稍微放松对透明背景的要求)。没有额外的元素。
Here a possible solution with a focus on simplicity (if you can loose your requirement for transparent background a bit). No additional elements.
如果您还需要使用 border-radius :
If you need to use
border-radius
as well:我相信你已经知道答案了。
您有两个选择,提供自己的边框(这是很多不必要的工作)或定位一个遮挡边框的元素(这样做的问题是您只能有纯色背景色,但也许这样就可以了)。
据我所知,您无法在每个浏览器中很好地进行此练习。不过,我喜欢你的风格,这是正确的方法,但可能不是你能够以令人满意的方式解决的问题。
我对这些主题的一般看法是,您不应该尝试使用网络做一些需要 A)过度努力或 B)一开始并不完全明显的标记解决方案的事情。网络有其局限性,您最好遵守这些限制,而不是试图解决这些限制。
所以我不得不问,
I believe you already know the answer.
You have 2 options, provide your own border (that's a lot of unnecessary work) or position an element with occludes the border (the problem with that is that you can only have a solid background color, but maybe that's fine).
To my knowledge there's not anything you can do to make this workout nicely in every browser out there. I like your style though, it's the right approach but probably not a problem you'll be able to solve in a satisfying manner.
My general opinion on these topics is that you should not try and do things with the web that requires A) excessive effort or B) a markup solution which is not entirely obvious to begin with. The web has limitations and you would do well to ad-her to them rather than trying to work around those limitations.
So I'm forced to ask, what's the problem with <legend/>?
我得到了一个合理的结果。
I got a reasonable result.
我稍微更新一下匿名者的提议:
I update a little bit the propostion of Anonymous to that:
使用
::before
伪元素生成模拟的上边框,然后将模拟
元素放置在具有
z-index
和position
属性的::before
块。最后,在模拟字段集的顶部使用渐变和纯色停止点,将线性渐变的顶部颜色设置为透明,以便假字段集后面的任何背景都将可见。Use
::before
pseudoelement to generate the top border of the emulated<fieldset>
, then position the emulated<legend>
element over the::before
block withz-index
andposition
properties. Lastly, use gradient and a solid color-stop on the top of the emulated fieldset, setting the top color of the linear gradient to transparent so whatever background is behind the fake fieldset will be visible.