изменяет размер неправильно; кажется, что у него есть неустранимая " min-width: min-content`


у меня есть <select> где один из его <option>’s текстовые значения очень долго. Я хочу <select> чтобы изменить размер, чтобы он никогда не был шире своего родителя, даже если он должен отрезать отображаемый текст. max-width: 100% должны сделать это.

до изменения размера:

то, что я хочу после изменения размера:

но если ты загрузите этот пример jsFiddle и изменить размер ширины панели результатов быть меньше, чем <select>, вы можете видеть, что выбор внутри <fieldset> не удается масштабировать его ширину вниз.

что я на самом деле вижу после изменения размера:

на эквивалентная страница с <div> вместо <fieldset> совсем корректно. Вы можете видеть, что и Проверьте свои изменения более легко если у вас a <fieldset> и <div> рядом друг с другом на одном страница. И если вы удалить окружающие <fieldset> теги изменения размера работ. Элемент <fieldset> тег каким-то образом вызывает горизонтальное изменение размера, чтобы сломать.

The <fieldset> действует так, как будто есть правило CSS fieldset { min-width: min-content; }. (min-content означает, грубо говоря, наименьшую ширину, которая не вызывает переполнения ребенка.) Если я заменю <fieldset> С <div> С min-width: min-content, он выглядит точно так же. Но нет никакого правила с min-content в моем стили, в таблице стилей браузера по умолчанию или видимые в Инспекторе CSS Firebug. Я попытался переопределить каждый стиль, видимый на <fieldset> в Инспекторе CSS Firebug и в таблице стилей Firefox по умолчанию "формы".css, но это не помогло. В частности, переопределение min-width и width тоже ничего не делала.

код

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, что больше похоже на веб-страницу, которую я на самом деле пытаюсь исправить. Вы можете видеть из этого, что <select> is не проблема-встроенный блок div и не изменять. Хотя этот пример более сложный, я предполагаю, что исправление для простого случая выше также исправит этот более сложный случай.

[Edit: см. сведения о поддержке браузера ниже.]

одна любопытная вещь об этой проблеме является то, что если вы устанавливаете div.wrapper { width: 50%; } на <fieldset> останавливает изменение размера себя в точке, то полноразмерный <select> ударился бы о край видового экрана. Изменение размера происходит так, как будто <select> и width: 100%, хотя <select> кажется width: 50%.

если вы дать width: 50%, что не происходит; ширина просто правильно установить.

я не понимаю причину этой разницы. Но это может быть не актуально.

я также нашел очень похожий вопрос HTML fieldset позволяет детям расширяться бесконечно. Этот Аскер не мог найти решение и догадывается, что нет никакого решения, кроме удаления <fieldset>. Но мне интересно, если это действительно невозможно сделать <fieldset> отобразить справа, почему? Что в <fieldset> ' s spec или 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
  • Chrome
  • Chrome для Android

он ломается в этих браузерах:

  • Firefox
  • Firefox для Android
  • Internet Explorer 7

таким образом, единственный браузер, который я забочусь о том, что текущий код ломается, - это Firefox (как на рабочем столе, так и на мобильном телефоне). Если код был исправлен, то он работал в В Firefox, не нарушая его в любых других браузерах, что бы решить мою проблему.

шаблон HTML сайта использует условные комментарии Internet Explorer для добавления таких классов .ie8 и .oldie до <html> элемент. Вы можете использовать эти классы в своем CSS, если вам нужно обойти различия в стилях в IE. Добавлены классы такие же как и в это старая версия HTML5 Boilerplate.

4 207

4 ответа:

Обновление (25 Сентября 2017)

к моему великому облегчению, в ошибка в Firefox описанное ниже исправлено с Firefox 53, и ссылка на этот ответ, наконец, была удалено из документации Bootstrap.

исправления

в WebKit и Firefox 53+, вы просто установите min-width: 0; в наборе полей для переопределения значения по умолчанию min-content.1

тем не менее, Firefox немного... странно, когда дело доходит до полевых наборов. Сделать это работа в более ранних версиях, вы должны изменить display свойство набора полей для одного из следующих значений:

  • table-cell(рекомендуется)
  • table-column
  • table-column-group
  • table-footer-group
  • table-header-group
  • table-row
  • table-row-group

из них я рекомендую table-cell. Оба table-row и table-row-group предотвратить изменение ширины, в то время как table-column и table-column-group предотвратить вас от изменения высоты.

это будет (несколько разумно) перерыв рендеринга в IE. Так как только геккон нуждается в этом, вы можете оправданно использовать @-moz-document-один из собственные расширения CSS Mozilla-чтобы скрыть его от других браузерах:

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

(здесь демо jsFiddle.)


это исправляет ситуацию, но если вы хоть немного похожи на меня, ваша реакция была что-то вроде...

что.

здесь и причина, но это не красиво.

представление по умолчанию элемента fieldset абсурдно и по существу невозможно указать в CSS. Подумайте об этом: граница набора полей исчезает там, где она перекрывается элементом легенды, но фон остается видимым! Нет никакого способа воспроизвести это с любой другой комбинацией элементов.

в довершение, реализация полна уступок унаследованному поведению. Один из них заключается в том, что минимальная ширина набора полей никогда не меньше внутренней ширины его содержимого. WebKit дает вам возможность переопределить это поведение, указав его в таблице стилей по умолчанию, но Gecko2 идет дальше и применяет его в движок.

однако, внутренние элементы таблицы составляют специальный каркас типа в Гекко. Размерные ограничения для элементов с этими display набор значений вычисляется в отдельный путь код, полностью обходя принудительную минимальную ширину, наложенную на наборы полей.

раз -ошибка для этого был исправлен с Firefox 53, так что вам не нужен этот хак, Если вы только ориентируетесь на более новые версии.

использует @-moz-document безопасная?

для этого одного вопроса, да.@-moz-document работает по назначению во всех версиях Firefox до 53, где эта ошибка исправлена.

это не случайно. Отчасти из-за этого ответа, ошибка в limit @-moz-document для таблиц стилей пользователя/UA был сделан зависимым от основной ошибки набора полей, которая была исправлена в первую очередь.

помимо этого, я не рекомендую использовать @-moz-document исключительно для таргетинга Firefox в вашем CSS, несмотря на другие ресурсы.3


1 значение может иметь префикс. По словам одного читателя, это не имеет никакого эффекта в Android 4.1.2 Stock Браузер и, возможно, другие старые версии; у меня не было времени, чтобы проверить это.

2 Все ссылки на источник геккона в этом ответе относятся к 5065fdc12408 набор изменений, совершено 29 July июля 2013 года; вы можете сравнить заметки ссамая последняя редакция от Mozilla Central.

3 см., например, Итак #953491: таргетинг только на Firefox с CSS и CSS трюки: CSS хаки таргетинг Firefox для широко упоминаемых статей на громких сайтах.

Safari на iOS проблема с выбранным ответом

Я нашел ответ от Джордана Грея, чтобы быть особенно полезным. Однако это, похоже, не решило эту проблему на Safari iOS для меня.

проблема для меня просто в том, что набор полей не может иметь автоматическую ширину, если элемент внутри имеет максимальную ширину в % ширины.

решение проблемы

просто установите fieldset, чтобы иметь 100% ширину его контейнера, кажется обойти эту проблему.

пример

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

пожалуйста, обратитесь к приведенным ниже примерам работы - если вы удалите % width из набора полей или замените его на auto, он не будет продолжать функционировать.

JSFiddle/Codepen

Я много часов боролся с этим, и в основном браузер применяет вычисленный стиль, который вам нужно переопределить в вашем CSS. Я забыл точное свойство, которое устанавливается на fieldset элементы против divs (возможно min-width?).

мой лучший совет был бы изменить свой элемент на div, скопируйте вычисленные стили из вашего инспектора, а затем измените свой элемент обратно на fieldset и сравнить вычисленные стили, чтобы найти виновника.

надеюсь, что помогает.

обновление: добавлять display: table-cell помогает в браузерах, отличных от Chrome.

.fake-select { white-space:nowrap; } заставило набор полей интерпретировать .fake-select элемент по его исходной ширине, а не по его принудительной ширине (даже если переполнение скрыто).

удалите это правило и измените .fake-select ' s max-width:100% просто width:100% и все подходит. Предостережение заключается в том, что вы видите все содержимое поддельного выбора, но я не думаю, что это все так плохо, и теперь он подходит горизонтально.

обновление: с текущими правилами в следующей скрипке (который содержит только реальные выборки), дочерние элементы набора полей ограничены для коррекции ширины. Кроме удаления правил для .fake-select и исправление замечаний (с // comment до /* comment */, я заметил изменения в CSS скрипки.

теперь я лучше понимаю вашу проблему, и скрипка отражает некоторый прогресс. Я установил правила по умолчанию для всех <select> s, и резерв .xxlarge для тех, которые вы знаете, будет шире, чем 480px (и это работает только потому, что вы знаю ширина #viewport, и может вручную добавить класс к тем, кто слишком широк. Просто требует немного тестирования)

доказательство