<fieldset>のサイズが正しくありません。削除できない `min-width:min-content`があるようです


221

問題

私が持っている<select>その場所の1 <option>のテキスト値が非常に長いです。私がしたい<select>、それがその表示されたテキストをカットする場合であっても、その親よりも幅が広いことはありませんので、サイズを変更します。max-width: 100%それを行う必要があります。

サイズ変更前:

サイズ変更前のページ、<code> select </ code>全体を表示

サイズ変更後に必要なもの:

サイズを変更した後、<code> select </ code>でコンテンツをクリッピングして希望するページ

ただし、このjsFiddleの例ロードし、結果パネルの幅をの幅よりも小さくなるようにサイズ変更する<select>と、内の選択が<fieldset>その幅を縮小できないことがわかります。

サイズ変更後に実際に表示されるもの:

サイズ変更後の現在のページ、スクロールバー

ただし、aの<div>代わりにaを使用<fieldset>した同等のページは適切にスケーリングされます。1つのページにとが隣接しいると、それを確認して変更をより簡単にテストできます。また、周囲のタグ削除すると、サイズ変更が機能します。タグは何とかブレークに水平方向のサイズ変更を引き起こしています。<fieldset><div><fieldset><fieldset>

<fieldset>CSSルールがあるかのように行為がありますfieldset { min-width: min-content; }。(min-content手段は、大体、最小幅オーバーフローに子供を起こさないこと。)私が交換した場合<fieldset><div>min-width: min-content、それはまったく同じに見えます。それでもmin-content、私のスタイル、ブラウザのデフォルトスタイルシート、またはFirebugのCSSインスペクタに表示されるルールはありません。<fieldset>FirebugのCSS InspectorとFirefoxのデフォルトのスタイルシートforms.cssに表示されるすべてのスタイルをオーバーライドしようとしましたが、それは役に立ちませんでした。特にオーバーライドしてmin-widthwidth何もしませんでした。

コード

フィールドセットのHTML:

<fieldset>
    <div class="wrapper">
        <select id="section" name="section">
            <option value="-1"></option>
            <option value="1501" selected="selected">Sphinx of black quartz, judge my vow. The quick brown fox jumps over the lazy dog.</option>
            <option value="1480">Subcontractor</option>
            <option value="3181">Valley</option>
            <option value="3180">Ventura</option>
            <option value="3220">Very Newest Section</option>
            <option value="1481">Visitor</option>
            <option value="3200">N/A</option>
        </select>
    </div>
</fieldset>

私のCSSは機能しているはずですが機能していません。

fieldset {
    /* hide fieldset-specific visual features: */
    margin: 0;
    padding: 0;
    border: none;
}

select {
    max-width: 100%;
}

widthプロパティをデフォルトにリセットしても何も起こりません。

fieldset {
    width: auto;
    min-width: 0;
    max-width: none;
}

が問題を修正しようとして失敗したさらなるCSS :

/* try lots of things to fix the width, with no success: */
fieldset {
    display: block;
    min-width: 0;
    max-width: 100%;
    width: 100%;
    text-overflow: clip;
}

div.wrapper {
    width: 100%;
}

select {
    overflow: hidden;
}

もっと詳しく

この問題は、このより包括的で複雑なjsFiddleの例でも発生します。これは、実際に修正しようとしているWebページにより似ています。<select>これで問題ないことがわかります–インラインブロックdivもサイズ変更に失敗します。この例はより複雑ですが、上記の単純なケースの修正により、このより複雑なケースも修正されると思います。

[編集:下記のブラウザサポートの詳細をご覧ください。]

この問題の1つの奇妙な点は、を設定div.wrapper { width: 50%; }した場合<fieldset>ストップがその時点でサイズ変更を停止し、フルサイズ<select>がビューポートの端に当たってしまうことです。かのようにサイズ変更が起こる<select>持っているwidth: 100%にもかかわらず、<select>それが持っているように見えますwidth: 50%

50%幅のラッパーdivでサイズ変更後

自分自身を指定した<select>width: 50%場合、その動作は発生しません。幅は単に正しく設定されています。

50%幅の選択でサイズ変更後

その違いの理由がわかりません。しかし、それは関係がないかもしれません。

また、非常によく似た質問のHTMLフィールドセットにより、子供たちが無制限に拡張できることがわかりました。質問者は解決策を見つけることができず、を削除する以外に解決策はない推測しまし<fieldset>。しかし、<fieldset>表示を正しくすることが本当に不可能であるなら、どうしてですか?(この質問の時点で<fieldset>仕様またはデフォルトのCSSの何がこの動作を引き起こしていますか?複数のブラウザがこのように機能するため、この特別な動作はおそらくどこかに文書化されています。

バックグラウンドの目標と要件

私がこれをしようとしている理由は、大きなフォームを持つ既存のページのモバイルスタイルを作成する一環としてです。フォームには複数のセクションがあり、その一部はで囲まれてい<fieldset>ます。スマートフォン(またはブラウザーウィンドウを小さくした場合)では、ページ<fieldset>のの部分がフォームの他の部分よりも幅広です。ほとんどのフォームは幅を<fieldset>適切に制限しますが、セクションの制限はありません。ユーザーはズームアウトするか、右にスクロールしてそのセクションをすべて表示する必要があります。

<fieldset>は、大きなアプリの多くのページで生成されるため、単にを削除することに注意します。CSSまたはJavaScriptのどのセレクターがそれに依存するのかはわかりません。

必要に応じてJavaScriptを使用できますが、JavaScriptソリューションは何もないよりはましです。しかし、JavaScriptがこれを行う唯一の方法である場合、CSSとHTMLだけを使用してこれを行うことができない理由についての説明を知りたいと思います。


編集:ブラウザーのサポート

このサイトでは、Internet Explorer 8以降(IE7のサポートを終了しました)、最新のFirefox、最新のChromeをサポートする必要があります。この特定のページは、iOSおよびAndroidスマートフォンでも機能します。わずかに低下しますが、まだ使用可能な動作はInternet Explorer 8で許容されます。

壊れたfieldsetを別のブラウザーで再テストしました。実際には、これらのブラウザーで既に機能しています。

  • Internet Explorer 8、9、および10
  • クロム
  • Android向けChrome

これらのブラウザでは機能しません。

  • Firefox
  • Android版Firefox
  • Internet Explorer 7

したがって、現在のコードが侵入することを気にする唯一のブラウザは、Firefox(デスクトップとモバイルの両方)です。コードが修正され、Firefoxで他のブラウザーでコードを壊すことなく機能した場合、問題は解決します。

サイトのHTMLテンプレートは、このようなクラスを追加するには、Internet Explorerの条件付きコメントを使用.ie8して.oldie<html>要素。IEのスタイルの違いを回避する必要がある場合は、CSSでこれらのクラスを使用できます。追加されたクラスは、この古いバージョンのHTML5ボイラープレートと同じです。


41
この優れた記事へのおめでとう
Alp

あなたの簡単な例:必要な幅を与える<fieldset>(またはdiv.wrapper)、そしてselect { width:100% }max-width要素に親の元の幅の数%を与えるように見え、その後はスケーリングされませんwidthが、親とともにスケーリングされます。私はそれであなたが望むことはできると思います(しかし私は誤解されているかもしれません)。より複雑なフィドルで、左側の列のフィールドに%-widthとmin-pixel-widthを指定してみてください。次に、右側のフィールドに100-(left-fields-%-width)%widthを指定します。
2013

もう1つ考えました。フィールドセットの最小幅を0に設定するとどうなるでしょうか。それだけではおそらく問題は解決しませんが、考えてみる価値はあります。今は別の方法で作業していますが、それがうまくいかない場合も試してみます
Trojan

同じ行にとどまるにはラベルとフィールドが必要ですか?小さなビューポートの場合、それらはオーバーラップします。応答性を高め、必要に応じて改行しないでください。
2013

回答:


346

アップデート(2017年9月25日)

Firefoxのバグは、 Firefoxの53のように固定されており、この回答へのリンクが最終的にされた以下のブートストラップのドキュメントから削除します

また、-moz-documentこの回答のためにサポートの削除をブロックする必要があったMozillaの貢献者に心からお詫びします。

修正

WebKitのとFirefox 53+で、あなただけの設定min-width: 0;のデフォルト値を上書きするフィールドセットにmin-content

それでも、Firefoxは少し…フィールドセットに関しては奇妙です。これを以前のバージョンで機能させるにdisplayは、フィールドセットのプロパティを次のいずれかの値に変更する必要があります。

  • table-cell (推奨)
  • table-column
  • table-column-group
  • table-footer-group
  • table-header-group
  • table-row
  • table-row-group

これらのうち、私はお勧めしtable-cellます。両方table-rowtable-row-groupしながら、幅を変更することを防ぐtable-columntable-column-group高さを変更することを防ぎます。

これは、IEでのレンダリングを(ある程度合理的に)中断します。唯一のGeckoはこれを必要とするので、あなたは正当に使用することができます@-moz-document-オンをMozillaの独自のCSSの拡張、他のブラウザからそれを隠す-to:

@-moz-document url-prefix() {
    fieldset {
        display: table-cell;
    }
}

(ここにjsFiddleのデモがあります。)


これで問題は解決しますが、あなたが私のような人なら、あなたの反応は次のようなものでした…

何。

理由あります、それはきれいではありません。

fieldset要素のデフォルトの表示は不合理であり、CSSで指定することは基本的に不可能です。考えてみてください。fieldsetの境界線は、legend要素が重なっているところで消えますが、背景は表示されたままです!他の要素の組み合わせでこれを再現する方法はありません。

さらに、実装にはレガシー動作への譲歩がたくさんあります。その1つは、フィールドセットの最小幅がコンテンツの固有の幅よりも小さくなることはありません。WebKitでは、デフォルトのスタイルシートでこの動作を指定することで、この動作をオーバーライドすることができますが、Gecko²はさらに一歩進んで、レンダリングエンジンでそれを強制します。

ただし、内部テーブル要素はGeckoの特別なフレームタイプを構成します。これらのdisplay値が設定された要素の寸法制約は、個別のコードパスで計算され、フィールドセットに課された強制最小幅を完全に回避します。

繰り返しますが、このバグはFirefox 53で修正されているため、新しいバージョンのみを対象とする場合は、このハックは必要ありません。

@-moz-document安全に使用していますか?

この1つの問題については、はい。 @-moz-document53までのすべてのバージョンのFirefoxで意図したとおりに動作し、このバグが修正されています。

これは偶然ではありません。この回答の一部が原因で、ユーザー/ UAスタイルシート限定@-moz-documentするバグは、最初に修正される根本的なフィールドセットのバグに依存するようになりました。

これ以外に、CSSFirefoxをターゲットにする@-moz-documentために使用しないでください。


¹値の前に付けることができます。ある読者によれば、これはAndroid 4.1.2 Stock Browserや他の古いバージョンでは効果がないとのことです。これを確認する時間がありませんでした。

²この回答のGeckoソースへのすべてのリンクは、2013年7月29日にコミットされた5065fdc12408チェンジセットを参照しています。メモとMozilla Centralの最新のリビジョンを比較することをお勧めします。

egたとえば、SO#953491:CSSCSSトリックを使用してFirefoxのみをターゲットにする:CSSは、注目度の高いサイトで広く参照されている記事について、Firefoxターゲットにハッキングします。


5
IEで修正が失敗したことに気づきましたが、ここに来て、そのソリューションですでに編集していることがわかりました。ありがとう!Geckoハックソリューションは、各ブラウザでうまく動作します。
Rory O'Kane 2013

この問題で髪を引っ張っていましたが、あなたの修正は完璧です-それはFirefoxでしか機能しないようです。他のブラウザー、特にモバイルブラウザーに対する提案はありますか?私の最大の問題は、モバイルデバイスでの向きの変更によるサイズ変更です...
Adriaan Nel 2013年

30
これは完全に素晴らしい答えです-徹底的で、研究され、簡潔です。ありがとう。
iamkeir 2013

16
もちろんそれは絶対に素晴らしい答えです!Bootstrapの公式ドキュメントはこちら
Ranhiru Jude Cooray '11 / 11/02

1
まあ、私はフィールドセットについてそれを知りませんでした。今日ここで何かを学びました。
超光速2017年

11

選択した回答のiOS上のSafariの問題

ジョーダングレイの回答が特に役に立ちました。ただし、私にとっては、Safari iOSでのこの問題は解決していないようです。

私にとっての問題は、要素内の最大幅が%幅である場合、フィールドセットに自動幅を設定できないことです。

問題を修正

フィールドセットをそのコンテナの100%の幅に設定するだけで、この問題を回避できるようです。

fieldset {
    min-width: 0; 
    width: 100%; 
}

実際の例については、以下を参照してください。フィールドセットの幅を削除するか、自動で置き換えると、機能しなくなります。

JSFiddle | Codepen


1
これは一般的な問題への素晴らしい追加です。iOSでテストすることは考えていませんでした。:)これもまた、新しい質問として尋ねて自己回答する価値があると思います。今週、追加のテストを行い、問題がなければ、この回答にリンクします。
ジョーダングレイ

3

私はこれに何時間も苦労してきましたが、基本的に、ブラウザーはCSSでオーバーライドする必要がある計算されたスタイルを適用しています。fieldset要素とdivs(おそらくmin-width?)に設定されている正確なプロパティを忘れています。

私の最善のアドバイスは、要素をに変更divし、インスペクターから計算されたスタイルをコピーしてから、要素を変更fieldsetして計算されたスタイルを比較し、原因を見つけることです。

お役に立てば幸いです。

更新:display: table-cell Chrome以外のブラウザでのヘルプの追加。


私は、のすべてのCSSプロパティと比較fieldsetしてdivこのページ Firebugのでは。それは助けにはならなかった。Firebugのでは、異なる値を有するプロパティのみであったwidthperspective-originwidth数値的に異なっていたが、fieldsetさんはwidthいたautoように、divS '。そして、これperspective-originは単なる関数ですwidth–デフォルトではその50%。
Rory O'Kane 2013

ただし、比較はChrome Web Inspectorである程度役立ちました。私の例を開いた直後に、Chromeで動作していることがわかりました!Chromeでテストしたmin-width: 0;、例にを追加しましたが、Chromeで問題が解決したようです。Webインスペクタは、私が仮説を立てたように、Chromeにはスタイルがあると教えてくれました。だから今私はFirefoxとおそらくまだテストしていない他のブラウザで問題を解決する必要があるだけです。min-width: -webkit-min-content;
Rory O'Kane 2013

少し助かりました。他のブラウザでも「display:table-cell」を使用して問題を解決できました。それが最善の解決策ではないと思いますが、うまくいけばうまくいきます。
phdj 2013

2

.fake-select { white-space:nowrap; }.fake-select(オーバーフローが非表示になっている場合でも)フィールドセットに強制的な幅ではなく、元の幅で要素を解釈させる。

そのルールを削除し、変更.fake-selectmax-width:100%だけにwidth:100%、すべてのフィット。注意点として、フェイクセレクトのすべてのコンテンツが表示されますが、これはそれほど悪いことではなく、水平方向に収まります。

更新:次のフィドル(実際の選択のみを含む)の現在のルールでは、フィールドセットの子は正しい幅に制限されています。ルールを削除する以外.fake-selectから(とコメントを修正// commentする/* comment */、私はフィドルのCSSの変化を指摘しました。

私はあなたの問題をよりよく理解し、フィドルはいくつかの進歩を反映しています。すべてのにデフォルトのルールを設定し、480pxより広くなることがわかっているものを<select>予約.xxlargeします(これが機能するの、の幅がわかっていて、幅が#viewport広すぎるクラスに手動でクラスを追加できるためです。少しのテストが必要です。 )

証明


どのような修正を使用しても、実際の問題に取り組む必要があります<select>。実際のサイトには<select>s しかありません。のポイントはfake-select<select>実際には<select>でなくてものレイアウトルールを設定することでした。これは、この動作が<select>要素でのみ発生するブラウザのバグではないことを示すためです。したがって、スタイルを変更し.fake-select<select>敗北のようなものにしないと、目的が無効になります。
Rory O'Kane 2013

私は、.fake-select箱を<select>(既存のものと同じ)に置き換えて、デモを行いました。要素はすべて親の幅に制限されています(それをクリックしてオプションをドロップダウンする場合を除きます。オプションはそれぞれ1行に表示されますが、制御することはできないと思います)。のすべてのルールも削除しました.fake-select。現在のバイオリンはあなたが必要とすることをしますか?
トロイの木馬

ありません。width: 100%ページ上の長いメニューでは機能しますが、短いメニューでは正しく機能しません。短いメニューをページの幅いっぱいに拡大しますが、短いメニューでは短い幅を維持したいと思っています。余裕がある場合、メニューは自然な幅にする必要がありますが、親に対して大きすぎる場合は100%の幅にする必要があります。これmax-widthが本来のことですが、この場合は失敗します。
Rory O'Kane 2013

「すべて<select>のs」を「長い<select>s」から分離し、背景の幅を処理するように変更しました。
トロイの木馬

#viewport固定幅もありません。そのため、ページに[ビューポートのサイズ変更]ボタンを配置しました。ビューポートの幅に関係なく、すべてが機能することをテストできます。テスト.fake-select用のリアルの代わりになるのと同じように<select>#viewportは実際のビューポートの代わりになります。(「ビューポート」は基本的にブラウザウィンドウです)。#viewportスクロールする必要がなく、ビューポートから突き出ている要素を簡単に確認できるように、ページに含めました。
Rory O'Kane 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.