изменяет размер неправильно; кажется, что у него есть неустранимая " 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 ответа:
Обновление (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, он не будет продолжать функционировать.
Я много часов боролся с этим, и в основном браузер применяет вычисленный стиль, который вам нужно переопределить в вашем CSS. Я забыл точное свойство, которое устанавливается на
fieldset
элементы противdiv
s (возможноmin-width
?).мой лучший совет был бы изменить свой элемент на
div
, скопируйте вычисленные стили из вашего инспектора, а затем измените свой элемент обратно наfieldset
и сравнить вычисленные стили, чтобы найти виновника.надеюсь, что помогает.
обновление: добавлять
display: table-cell
помогает в браузерах, отличных от Chrome.
.fake-select { white-space:nowrap; }
заставило набор полей интерпретировать.fake-select
элемент по его исходной ширине, а не по его принудительной ширине (даже если переполнение скрыто).удалите это правило и измените
.fake-select
' smax-width:100%
простоwidth:100%
и все подходит. Предостережение заключается в том, что вы видите все содержимое поддельного выбора, но я не думаю, что это все так плохо, и теперь он подходит горизонтально.обновление: с текущими правилами в следующей скрипке (который содержит только реальные выборки), дочерние элементы набора полей ограничены для коррекции ширины. Кроме удаления правил для
.fake-select
и исправление замечаний (с// comment
до/* comment */
, я заметил изменения в CSS скрипки.теперь я лучше понимаю вашу проблему, и скрипка отражает некоторый прогресс. Я установил правила по умолчанию для всех
<select>
s, и резерв.xxlarge
для тех, которые вы знаете, будет шире, чем 480px (и это работает только потому, что вы знаю ширина#viewport
, и может вручную добавить класс к тем, кто слишком широк. Просто требует немного тестирования)