229

问题

我有一个<选择>其中一个<选项>的文本值很长。我想要<选择>调整大小,使其永远不会比其父级宽,即使它必须切断显示的文本。最大宽度:100%应该这样做。

调整大小前:

调整大小之前的页面,显示整个<code>选择</code>

调整大小后我想要什么:

调整大小后我想要的页面,用<code>选择</code>剪切其内容

但是如果你加载这个jsFiddle示例并将“结果”面板的宽度调整为小于<选择>,您可以看到<字段集>无法缩小宽度。

调整大小后我实际看到的内容:

调整大小后的当前页面,带有滚动条

然而具有的等效页<div>而不是<字段集>缩放正确。你可以看到更轻松地测试您的更改如果你有<字段集>和a<div>在一页上彼此相邻.如果你删除周围的<字段集>标签,调整大小有效。这个<字段集>标签以某种方式导致水平调整中断。

这个<字段集>行为就像有CSS规则一样字段集{最小宽度:最小内容;}. (最小含量大致表示不会导致子级溢出的最小宽度。)如果我更换<字段集>用一个<div>具有最小宽度:最小含量,看起来完全一样。然而没有规则最小含量在我的样式中,在浏览器默认样式表中,或者在Firebug的CSS检查器中可见。我试图覆盖<字段集>在Firebug的CSS检查器和Firefox的默认样式表中表单.css,但这没有帮助。具体重写最小宽度宽度也没做什么。

代码

字段集的HTML:

<字段集><div class=“wrapper”><select id=“section”name=“section“><option value=“-1”></option><option value=“1501”selected=“selected”>黑色石英狮身人面像,判断我的誓言。敏捷的棕色狐狸跳过了懒狗</选项><option value=“1480”>分包商</option>山谷文丘拉管最新章节访客不适用</选择></div></fieldset>

我的CSS应该可以工作,但没有:

字段集{/*隐藏fieldset特定的视觉功能:*/边距:0;填充:0;边界:无;}选择{最大宽度:100%;}

重置宽度属性到默认值不执行任何操作:

字段集{宽度:自动;最小宽度:0;最大宽度:无;}

进一步的CSS,其中我试图解决问题却失败了:

/*尝试许多方法来固定宽度,但没有成功:*/字段集{显示:块;最小宽度:0;最大宽度:100%;宽度:100%;文本溢出:剪辑;}div.包装器{宽度:100%;}选择{溢出:隐藏;}

更多详细信息

这个问题也发生在更全面、更复杂的jsFiddle示例,这与我实际尝试修复的网页更为相似。你可以从中看到<选择>不是问题所在–是一个内联块div公司也无法调整大小。虽然这个例子更复杂,但我假设上面简单案例的修复也会修复这个更复杂的案例。

[编辑:请参阅下面的浏览器支持详细信息。]

这个问题的一个奇怪之处是如果您设置div.wrapper{宽度:50%;},的<字段集>停止调整自身大小<选择>会撞到视口的边缘。调整大小的过程就像<选择>宽度:100%尽管<选择>看起来有宽度:50%.

使用50%宽度包装器div调整大小后

如果你给予<选择>它本身宽度:50%,该行为不会发生;宽度设置得很简单。

用50%宽度调整大小后选择

我不明白造成这种差异的原因。但这可能并不相关。

我还发现了非常相似的问题HTML字段集允许子项无限扩展。提问者找不到解决方案猜测没有解决方案除了移除<字段集>。但我想知道,如果真的不可能<字段集>显示正确,为什么?中的内容<字段集>规范默认CSS(就这个问题而言)导致这种行为?由于多个浏览器都是这样工作的,所以这种特殊行为可能在某些地方有文档记录。

背景目标和要求

我尝试这样做的原因是,作为使用大表单为现有页面编写移动样式的一部分<字段集>。在智能手机上(或者如果您使浏览器窗口变小),页面中带有<字段集>比表单的其他部分宽得多。大多数表单都很好地限制了其宽度,但带有<字段集>否则,将强制用户缩小或向右滚动以查看所有该部分。

我对简单地删除<字段集>,因为它是在大型应用程序的许多页面上生成的,我不确定CSS或JavaScript中的哪些选择器可能依赖于它。

如果需要,我可以使用JavaScript,JavaScript解决方案总比什么都没有好。但是,如果JavaScript是实现这一点的唯一方法,我很想听听为什么仅使用CSS和HTML无法做到这一点。


编辑:浏览器支持

在这个网站上,我需要支持Internet Explorer 8和更高版本(我们刚刚放弃了对IE7的支持)、最新的Firefox和最新的Chrome。此特定页面也应适用于iOS和Android智能手机。Internet Explorer 8可以接受稍微降级但仍可用的行为。

我重新测试了我的破碎字段集例子在不同的浏览器上。它实际上已经在这些浏览器中工作:

  • Internet Explorer 8、9和10
  • Android版Chrome

它在以下浏览器中中断:

  • 火狐浏览器
  • 火狐浏览器安卓版
  • Internet Explorer 7

因此,我唯一关心的是Firefox(在桌面和手机上),它是当前代码被破坏的浏览器。如果代码被修复,使其在Firefox中工作,而不会在任何其他浏览器中破坏它,这将解决我的问题。

站点HTML模板使用Internet Explorer条件注释来添加类,例如.ie8标准.oldie(旧)<html>元素。如果需要解决IE中的样式差异,可以在CSS中使用这些类。添加的类与这个旧版本的HTML5 Boilerplate.

7
  • 43
    祝贺你写得这么好 评论 2013年7月23日15:42
  • 你的简单例子:给出<字段集>(或div.包装器)无论需要什么宽度,以及选择{width:100%}.最大宽度似乎为元素提供了其父元素的%起初的宽度,则不缩放,而宽度与其父对象一起缩放。我认为这会满足你的要求(但我可能误解了)。在更复杂的提琴中,尝试给左列中的字段指定一个%宽度和一个最小像素宽度。然后给出右边的字段100-(左边的字段-%-width)%width。 评论 2013年7月23日15:51
  • 我只是有了另一个想法:如果你把场地的最小宽度设置为0怎么办?这本身可能无法解决问题,但可能值得尝试解决。我现在正在走另一条路,但如果不行,我也会试试看 评论 2013年7月24日16:46
  • 你需要标签和字段保持在同一行吗?对于小视口,它们会重叠。为什么不让它稍微有点反应,并在必要时打破一条新的路线? 评论 2013年7月24日18:24
  • 2

4个答案4

重置为默认值
356
+150

更新(2017年9月25日)

这个Firefox错误下面描述的是Firefox 53的修复版本,指向此答案的链接最终被从Bootstrap文档中删除.

此外,我向那些不得不阻止删除对Mozilla的支持的贡献者致以诚挚的歉意-moz文档部分原因是这个答案。

修复

在WebKit和Firefox 53+中,您只需设置最小宽度:0;在fieldset上覆盖默认值最小含量

不过,Firefox在字段集方面还是有点……奇怪。若要在早期版本中实现此功能,必须更改显示属性设置为以下值之一:

  • 表细胞 (推荐)
  • 表-柱
  • 表-列-组
  • 表格注脚组
  • 表格标题组
  • 桌子
  • 桌上型小组

其中,我推荐表细胞.两者桌子桌上型小组阻止您更改宽度,而表-柱表列组阻止你改变身高。

这将(在一定程度上)破坏IE中的渲染。因为只有Gecko需要它,所以您可以合理地使用@-moz文档-其中之一Mozilla的专有CSS扩展-要在其他浏览器中隐藏它:

@-moz-document url-前缀(){字段集{显示:table-cell;}}

(这里有一个jsFiddle演示.)


这可以解决问题,但如果你像我一样,你的反应就像…

什么。

那里这是一个原因,但它并不漂亮。

fieldset元素的默认表示很荒谬,基本上不可能在CSS中指定。想想看:字段集的边界在与图例元素重叠的地方消失了,但背景仍然可见!没有办法用任何其他元素组合来重现这一点。

最重要的是,实现对遗留行为做出了充分的让步。其中之一是字段集的最小宽度永远不会小于其内容的固有宽度。WebKit通过在默认样式表中指定它,为您提供了覆盖此行为的方法,但Gecko²更进一步在渲染引擎中强制执行.

但是,内部表元素构成特殊框架类型在壁虎。具有这些元素的标注约束显示值集是在单独的代码路径,完全绕过了对字段集强制实施的最小宽度。

阿加因这个bugFirefox 53已经修复,因此如果您只针对较新版本,则不需要进行此黑客攻击。

正在使用@-moz文档安全吗?

对于这个问题,是的。 @-moz文档在53之前的所有版本的Firefox中都可以正常工作,该错误在53之前都得到了修复。

这不是偶然。部分由于这个答案限制@-moz文档到用户/UA样式表取决于首先修复的底层fieldset错误。

除此之外,不使用@-moz文档在CSS中瞄准Firefox尽管有其他资源。³


¹值可以加前缀。据一位读者称,这在Android 4.1.2股票浏览器和其他旧版本中没有影响;我还没有时间验证这一点。

²本答案中指向壁虎来源的所有链接均指5065fdc12408变更集,于2013年7月29日承诺;您可能希望与Mozilla Central的最新修订版.

³参见示例。SO#953491:仅针对带有CSS的FirefoxCSS技巧:针对Firefox的CSS攻击获取高知名度网站上广泛引用的文章。

8
  • 5
    我刚刚注意到IE中的修复程序出现故障,但来到这里,发现您已经在解决方案中进行了编辑。谢谢!壁虎黑客解决方案在每个浏览器中对我来说都很好。 评论 2013年7月29日14:19
  • 在这个问题上我很恼火,但你的解决方案很完美——除了它似乎只在firefox中有效。对其他浏览器,特别是移动浏览器,有什么建议吗?我最大的问题是由于移动设备上的方向改变而调整大小。。。 评论 2013年10月12日10:38
  • 31
    这是一个绝对棒的答案-彻底、研究和简洁。谢谢。 评论 2013年12月10日12:13
  • 17
    当然,这绝对是一个极好的答案!引导程序官方文档此处的点 评论 2014年11月2日2:55
  • 1
    嗯,我从来都不知道野球。我今天在这里学到了一些东西。 评论 2017年1月6日12:22
11

iOS上的Safari问题及选定答案

我发现乔丹·格雷的回答特别有用。然而,它似乎并没有解决我在Safari iOS上的这个问题。

对我来说,问题很简单,如果其中的元素的最大宽度为%width,那么字段集就不能具有自动宽度。

修复问题

简单地将fieldset设置为容器的100%宽度似乎可以解决这个问题。

例子

字段集{最小宽度:0;宽度:100%;}

请参阅下面的工作示例-如果您删除字段集的%width或将其替换为auto,它将无法继续工作。

J小提琴|代码笔

1
  • 1
    这是对一般问题的一个很好的补充,我没有想过在iOS中测试它。:)我几乎认为这可能值得你作为一个新问题来问和自我回答。本周我会尝试做一些额外的测试,如果可行的话,我会链接到这个答案。 评论 2014年6月29日20:13

我已经为此挣扎了好几个小时,基本上,浏览器正在应用计算样式,您需要在CSS中覆盖这些样式。我忘记了设置的确切属性字段集元素与div公司s(也许最小宽度?).

我最好的建议是将元素更改为div公司,从检查器复制计算的样式,然后将元素更改回字段集并比较计算出的样式以找出原因。

希望能有所帮助。

更新:正在添加显示:表格居中在非Chrome浏览器中提供帮助。

  • 我比较了字段集div公司本页在Firebug中。这没有帮助。在Firebug中,唯一具有不同值的属性是宽度透视原点. The宽度数值不同,但字段集宽度汽车,就像div公司的。以及透视原点只是宽度默认为50%。 评论 2013年7月24日1:35
  • 然而,这一比较在Chrome Web Inspector中确实有所帮助。我一开门就发现了我的例子它在Chrome中工作!我已经添加了最小宽度:0;以我为例之后在Chrome中进行测试,但这似乎解决了Chrome的问题。Web Inspector告诉我Chrome的风格最小宽度:-webkit-min-content;正如我猜测的那样。所以现在我只需要在Firefox和其他我还没有测试过的浏览器中解决这个问题。 评论 2013年7月24日1:42
  • 很高兴有点帮助。我可以用“display:table-cell”在其他浏览器中解决我的问题。我认为这不是最好的解决方案,但希望这对你有用。
    – 博士生
    评论 2013年7月25日16:46
2

.fake-select{white-space:nowrap;}导致fieldset解释.fake-select文件元素的原始宽度,而不是强制宽度(即使溢出被隐藏)。

删除该规则,然后更改.fake-select文件最大宽度:100%到只是宽度:100%一切都适合。需要注意的是,您可以看到fake-select的所有内容,但我认为这并没有那么糟糕,而且现在它是水平的。

更新:使用以下小提琴中的当前规则(其中只包含真正的选择),字段集的子项被限制为正确的宽度。除删除的规则外.fake-select文件和修正意见(来自//评论/*评论*/,我注意到小提琴CSS的变化。

我现在更了解你的问题了,小提琴反映了一些进步。我为所有人设置默认规则<选择>s、 和储备.xx大对于那些你知道会比480px宽的(这只适用于你知道的宽度#视口,可以手动将类添加到太宽的类中。只需要一点测试)

证明

7
  • 无论你使用什么修复方法,都必须在实际的<选择>。实际站点只有<选择>s.要点假选择具有的布局规则<选择>而不是真正的<选择>,只是为了表明这种行为不是只发生在<选择>元素。因此,改变.fake-select文件不那么像<选择>无法达到目的。 评论 2013年7月24日15:04
  • 我更换了.fake-select文件带有<选择>(与已经存在的相同)进行演示。所有元素都被约束到父元素的宽度(除了当您单击它时,下拉选项,每个选项都显示在一行上,但我认为您无法控制它)。我还删除了的所有规则.fake选择当前的小提琴能满足您的需要吗? 评论 2013年7月24日15:14
  • 但事实并非如此。宽度:100%适用于页面上的长菜单,但不适用于短菜单。它将短菜单扩展到页面的整个宽度,但我希望短菜单保持其短宽度。如果有空间,菜单应为其自然宽度,但如果菜单太大,则为100%宽度。就是这样最大宽度应该这样做,但在这种情况下却没有这样做。 评论 2013年7月24日15:44
  • 我做了更多的改变,将“所有<选择>s“from”long<选择>s”,现在只处理背景宽度。 评论 2013年7月24日16:58
  • #视口也没有固定的宽度。这就是为什么我在页面上放置了“调整视口大小”按钮,这样无论视口的宽度如何,您都可以测试一切正常.fake-select文件是真实的替代品<选择>用于测试,#视口是真实视口的替代品。(“视口”基本上是一个浏览器窗口)。我包括在内#视口这样您就可以很容易地看到伸出视口的元素,而不必滚动查看它们。 评论 2013年7月24日18:13

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.