Проблема
У мене є те, <select>
де одне його <option>
текстове значення дуже довге. Я хочу, <select>
щоб розмір змінився, щоб він ніколи не був ширшим за його батьківський, навіть якщо він повинен вирізати відображений текст. max-width: 100%
повинен це зробити.
Перед зміною розміру:
Що я хочу після зміни розміру:
Але якщо ви завантажите цей приклад jsFiddle і зміните ширину панелі Result, щоб бути меншою, ніж ширину <select>
, ви можете побачити, що вибір всередині <fieldset>
не вдається зменшити його ширину вниз.
Що я насправді бачу після зміни розміру:
Однак, еквівалентна сторінка <div>
замість значень "" "<fieldset>
робить масштаб належним чином. Ви можете бачити це і легше перевірити свої зміни, якщо на одній сторінці є один <fieldset>
і один <div>
поруч . І якщо ви видалите навколишні <fieldset>
теги , зміна розміру працює. <fieldset>
Тег яким - то чином викликає горизонтальне зміна розміру ламатися.
Ці <fieldset>
дії, як якщо є правило CSS fieldset { min-width: min-content; }
. ( min-content
Засоби, грубо кажучи, найменша ширина , яка не викликає дитини до переповнення.) Якщо я замінити <fieldset>
з <div>
зmin-width: min-content
, це виглядає точно так же. Однак min-content
у моїх стилях, у таблиці стилів браузера за замовчуванням немає правила , яке не відображається в CSS Inspector Firebug. Я намагався змінити кожен стиль, помітний <fieldset>
у CSS Inspector Firebug та у стилі таблиць стилів Firefox form.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>
проблема не в цьому - вбудований блок div
також не змінює розмір. Хоча цей приклад є складнішим, я припускаю, що виправлення простого випадку вище також виправить цей складніший випадок.
[Редагувати: див. Інформацію про підтримку веб-переглядача нижче.]
Цікава річ у цій проблемі полягає в тому, що якщо ви встановитеdiv.wrapper { width: 50%; }
, <fieldset>
зупинки змінюють розмір себе в точці, то повнорозмірний розмір <select>
би потрапив на край вікна перегляду. Змінення розміру відбувається так, ніби <select>
має width: 100%
, хоч і <select>
виглядає так, як воно має width: 50%
.
Якщо ви даєте <select>
себеwidth: 50%
, така поведінка не відбувається; ширина просто правильно встановлена.
Я не розумію причини такої різниці. Але це може не бути актуальним.
Я також виявив, що дуже подібне запитання HTML fieldset дозволяє дітям розширюватися на невизначений час . Запитуючий не зміг знайти рішення і здогадується, що немає рішення, крім видалення <fieldset>
. Але мені цікаво, якщо дійсно неможливо зробити <fieldset>
дисплей правильним, чому це так? Що в <fieldset>
«S специфікації або по замовчуванням 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 для Android
Це перерви в цих браузерах:
- Firefox
- Firefox для Android
- Internet Explorer 7
Таким чином, єдиний браузер, який мене хвилює, про те, що поточний код вривається, - це Firefox (як на робочому столі, так і на мобільному пристрої). Якщо код було виправлено, щоб він працював у Firefox, не порушуючи його в інших браузерах, це вирішило б мою проблему.
Шаблон HTML сайту використовує умовні коментарі Internet Explorer для додавання таких класів .ie8
і .oldie
до <html>
елемента. Ви можете використовувати ці класи у своєму CSS, якщо вам потрібно подолати відмінності стилів у IE. Додані класи такі ж, як у цій старій версії HTML5 Boilerplate .
<fieldset>
(або div.wrapper
) будь-яку ширину, яку вона потребує, і select { width:100% }
. max-width
як видається, надає елементу деякий% від початкової ширини свого батька , а потім не масштабує, тоді як width
робить масштаб зі своїм батьківським. Я думаю, що це зробить те, що ти хочеш (але я міг неправильно зрозуміти). У вашій складнішій скрипці спробуйте надати полям у лівому стовпчику% -широку та міні-піксель-ширину. Потім введіть поля праворуч 100 - (ліві поля -% - ширина)% ширини.