问题
I want to put a scrollable box inside of a fieldset
, but I’ve run into a quirk and I can’t figure out my way around it. When you put your scrollable div
inside of a fieldset
, the fieldset
expands instead of making the scrollable element scroll.
Here’s a test case. The following expands indefinitely (boo):
<div style="width: 300px; overflow: hidden;">
<fieldset>
<div style="overflow: scroll; white-space: nowrap;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed lorem arcu, sodales non gravida eget, vehicula vitae nulla. Quisque turpis justo, consectetur ut egestas at, pulvinar nec diam. Donec porttitor lobortis elit quis scelerisque. Proin at mollis nibh. Nulla nisi dolor, rutrum nec rhoncus congue, cursus at urna. Curabitur adipiscing euismod nisl nec consequat. Aliquam justo justo, bibendum id molestie eget, dignissim sit amet sapien. Phasellus non erat nulla, quis auctor eros. Proin pellentesque turpis eu ipsum venenatis egestas non eget lacus. Vestibulum ante diam, posuere ut fringilla nec, pretium ac metus. Integer laoreet fringilla ipsum, vel interdum urna pellentesque a. Donec lobortis tincidunt nisi, ac tristique massa pretium ac. Ut vel magna erat, et hendrerit sem. Curabitur vulputate, tellus quis pellentesque pretium, felis odio aliquam sapien, sit amet hendrerit arcu orci ut nulla. Vestibulum suscipit rhoncus arcu, ut aliquam eros sagittis a. Suspendisse eros elit, bibendum venenatis pulvinar at, scelerisque vel quam.
</div>
</fieldset>
</div>
But if you use a div, it works as expected (hurray!):
<div style="width: 300px; overflow: hidden;">
<div>
<div style="overflow: scroll; white-space: nowrap;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed lorem arcu, sodales non gravida eget, vehicula vitae nulla. Quisque turpis justo, consectetur ut egestas at, pulvinar nec diam. Donec porttitor lobortis elit quis scelerisque. Proin at mollis nibh. Nulla nisi dolor, rutrum nec rhoncus congue, cursus at urna. Curabitur adipiscing euismod nisl nec consequat. Aliquam justo justo, bibendum id molestie eget, dignissim sit amet sapien. Phasellus non erat nulla, quis auctor eros. Proin pellentesque turpis eu ipsum venenatis egestas non eget lacus. Vestibulum ante diam, posuere ut fringilla nec, pretium ac metus. Integer laoreet fringilla ipsum, vel interdum urna pellentesque a. Donec lobortis tincidunt nisi, ac tristique massa pretium ac. Ut vel magna erat, et hendrerit sem. Curabitur vulputate, tellus quis pellentesque pretium, felis odio aliquam sapien, sit amet hendrerit arcu orci ut nulla. Vestibulum suscipit rhoncus arcu, ut aliquam eros sagittis a. Suspendisse eros elit, bibendum venenatis pulvinar at, scelerisque vel quam.
</div>
</div>
</div>
How can I get the fieldset
to behave like the div
?
回答1:
WebKit and Firefox constrain fieldsets to have an "implicit" width based on the computed width of their contents. Here's how to override it in each.
WebKit makes it relatively easy. This behaviour is defined in the default stylesheet, so you can override it by specifying
min-width: 0
for the fieldset.Firefox is a tougher nut because fieldset width constraints are enforced deep in the Gecko layout code. Fortunately, there is a workaround: add a Gecko-only rule to set the
display
property for the fieldset to a value corresponding to one of several internal table elements.
Putting it all together:
fieldset { min-width: 0; }
/* FF hack; not needed for newer versions */
@-moz-document url-prefix() { /* Only target Gecko. (Breaks layout in IE.) */
fieldset { display: table-cell; }
}
jsFiddle demo.
Update (25 Sept 2017)
The [Firefox bug][bug] that necessitated the display: table-cell
hack has been fixed now; if you are targetting newer versions of Firefox, you may omit that and just use min-width: 0
. (Thanks @Nikolay for the reminder!)
For more details on why that used to be needed, my answer to a related question has a fuller explanation, including the gory browser internals.
回答2:
I'm not sure if you want that, but this is working :
<div style="width: 300px; overflow: auto;">
<fieldset>
<div style="overflow: auto; white-space: nowrap;">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed lorem arcu, sodales non gravida eget, vehicula vitae nulla. Quisque turpis justo, consectetur ut egestas at, pulvinar nec diam. Donec porttitor lobortis elit quis scelerisque. Proin at mollis nibh. Nulla nisi dolor, rutrum nec rhoncus congue, cursus at urna. Curabitur adipiscing euismod nisl nec consequat. Aliquam justo justo, bibendum id molestie eget, dignissim sit amet sapien. Phasellus non erat nulla, quis auctor eros. Proin pellentesque turpis eu ipsum venenatis egestas non eget lacus. Vestibulum ante diam, posuere ut fringilla nec, pretium ac metus. Integer laoreet fringilla ipsum, vel interdum urna pellentesque a. Donec lobortis tincidunt nisi, ac tristique massa pretium ac. Ut vel magna erat, et hendrerit sem. Curabitur vulputate, tellus quis pellentesque pretium, felis odio aliquam sapien, sit amet hendrerit arcu orci ut nulla. Vestibulum suscipit rhoncus arcu, ut aliquam eros sagittis a. Suspendisse eros elit, bibendum venenatis pulvinar at, scelerisque vel quam.
</div>
</fieldset>
</div>
You can remove the root div too, and it'll still work.
回答3:
There appears to be no viable solution to this problem. If you really want a fieldset you can use a div and then style it to look like a fieldset but you'll run into tons of cross-browser issues and headaches. Best solution: refactor the form so that you're not using fieldsets anymore.
回答4:
Is this what you're after?
<div style="overflow: auto; width: 300px; height: 55px;">
<fieldset style="overflow: scroll; width: 100%; white-space: nowrap;">
<div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed lorem arcu, sodales non gravida eget, vehicula vitae nulla. Quisque turpis justo, consectetur ut egestas at, pulvinar nec diam. Donec porttitor lobortis elit quis scelerisque. Proin at mollis nibh. Nulla nisi dolor, rutrum nec rhoncus congue, cursus at urna. Curabitur adipiscing euismod nisl nec consequat. Aliquam justo justo, bibendum id molestie eget, dignissim sit amet sapien. Phasellus non erat nulla, quis auctor eros. Proin pellentesque turpis eu ipsum venenatis egestas non eget lacus. Vestibulum ante diam, posuere ut fringilla nec, pretium ac metus. Integer laoreet fringilla ipsum, vel interdum urna pellentesque a. Donec lobortis tincidunt nisi, ac tristique massa pretium ac. Ut vel magna erat, et hendrerit sem. Curabitur vulputate, tellus quis pellentesque pretium, felis odio aliquam sapien, sit amet hendrerit arcu orci ut nulla. Vestibulum suscipit rhoncus arcu, ut aliquam eros sagittis a. Suspendisse eros elit, bibendum venenatis pulvinar at, scelerisque vel quam.
</div>
</fieldset>
</div>
回答5:
remember
position:absolute will not work with display:table cell That's what i have when try to debug the flex layout
so just keep in mind of it
来源:https://stackoverflow.com/questions/1716183/html-fieldset-allows-children-to-expand-indefinitely