Проблема
У меня есть <select>, где одно из его текстовых значений <option> очень велико. Я хочу изменить размер <select>, чтобы он никогда не был шире его родительского элемента, даже если он должен отключить отображаемый текст. max-width: 100% должен сделать это.
Перед изменением размера:
 
Что я хочу после изменения размера:
 
Но если вы  загрузите этот пример jsFiddle и измените размер ширины панелей результатов меньше, чем на <select>, вы можете видеть, что выбор внутри <fieldset> не позволяет уменьшить его ширину.
Что я действительно вижу после изменения размера:
 
Однако  эквивалентная страница с <div> вместо <fieldset> действительно масштабируется должным образом. Вы можете видеть, что  легче проверить свои изменения, если у вас  a <fieldset> и a <div> рядом друг с другом на одной странице. И если вы удаляете окружающие теги <fieldset>, то выполняется изменение размера. Тег <fieldset> каким-то образом вызывает разрыв горизонтального изменения размера.
Действия <fieldset> выглядят так, как будто существует правило CSS fieldset { min-width: min-content; }. (min-content означает грубую наименьшую ширину, которая не приводит к переполнению дочернего элемента.) Если я заменил <fieldset> на  <div> с min-width: min-content, он выглядит точно так же. Тем не менее, нет правила с min-content в моих стилях, в таблице стилей по умолчанию в браузере или в Firebugs CSS Inspector. Я попытался переопределить каждый стиль, видимый в <fieldset> в Firebugs CSS Inspector и в таблице стилей по умолчанию Firefox forms.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, который должен работать, но isnt:
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, который больше похож на веб-страницу Im, фактически пытающуюся исправить. Вы можете видеть из этого, что <select> не проблема - встроенный блок div также не может изменять размер. Хотя этот пример более сложный, я предполагаю, что исправление для простого вышеизложенного случая также устранит этот более сложный случай.
[Изменить: см. ниже сведения о поддержке браузера.]
Любознательная вещь об этой проблеме заключается в том, что если вы установили div.wrapper { width: 50%; }, <fieldset> перестает изменять размер в точке, тогда полная -size <select> ударил бы край окна просмотра. Изменение размера происходит так, как будто <select> имеет width: 100%, хотя <select> выглядит как width: 50%.
 
Если  предоставить <select> сам width: 50%, это поведение не происходит; ширина просто устанавливается правильно.
 
Я не понимаю причину этой разницы. Но это может быть не актуально.
Я также нашел очень похожий вопрос HTML-поле позволяет детям неограниченно расширяться. Ответчик не смог найти решение и догадывается, что нет решения, кроме удаления <fieldset>. Но Im интересно, если действительно невозможно сделать отображение <fieldset> правильным, почему? Что в <fieldset> s spec или CSS по умолчанию вызывает такое поведение? Это особое поведение, вероятно, где-то задокументировано, так как работают несколько браузеров.
Основная цель и требования
Причина, по которой я пытаюсь сделать это, - это часть написания мобильных стилей для существующей страницы с большой формой. Форма имеет несколько разделов, и одна ее часть завернута в <fieldset>. На смартфоне (или, если вы сделаете окно браузера маленьким), часть страницы с <fieldset> намного шире, чем остальная часть формы. Большая часть формы ограничивает его ширину просто тонкой, но раздел с <fieldset> не делает этого, заставляя пользователя уменьшать масштаб или прокручивать вправо, чтобы увидеть весь этот раздел.
Не забудьте просто удалить <fieldset>, поскольку он создан на многих страницах большого приложения, и я не уверен, что на нем могут зависеть селекторы в CSS или JavaScript.
Я могу использовать JavaScript, если мне нужно, и решение для JavaScript лучше, чем ничего. Но если JavaScript - единственный способ сделать это, Id будет любопытно услышать объяснение, почему это невозможно, используя только 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.