Как заполнить оставшуюся ширину элементом ввода, но без обёртки?
Деляю менюшку, наполнил ряд кнопками, между которыми расположил <select>, которым хочу заполнить оставшуюся ширину. Использую на родительском элементеdisplay: table; width: 100%;, на дочерних - display:table-cell;width:fit-content;, конкретно на <select> - width: 100%.
Проблема в том, что width: 100% на <div> (когда ставил эксперименты) заполняет оставшуюся ширину, но когда этот трюк попытался применить к <select> - элемент стал заполнять вообще всё, вытесняя остальное. Почему так происходит, и какими css-правилами добиться, чтобы ширина <select> вела себя нормально?
Есть хак - обернуть в , но мне это не подходит, потому что меню генерируется процедурно - а выделять во что-то отдельное - разводить мусор в проекте
Код с <div>, проблемой и хаком под спойлером
<!DOCTYPE html> <html lang="ru" style="height:100%;"> <head> <meta charset="utf-8"> <title>Полигон</title> <!-- <link href="stypes.css" rel="stylesheet"> <script src="script.js"></script> --> <!--<script type="module" src="/static/vue.js"></script>--> <style> </style> </head> <body style="height:100%;margin:0;"> <div>My fixed content</div> <div> <div style="width:fit-content;float:left;background-color:lightgray;" >setraw </div> <div style="float:left;max-width:100%;background-color:lightyellow" >Select-remaining </div> <div style="width:fit-content;float:left;background-color:lightblue" >vsplit </div> </div> <div style="display:table;width:100%;"> <div style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </div> <div style="display:table-cell;width:100%;background-color:lightyellow" >Select-remaining many1 many2 many3 many4 many5 many6 many7 many8 </div> <div style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </div> </div> <div style="display:table;width:100%;"> <button style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </button> <select style="display:table-cell;width:100%;background-color:lightyellow" > <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> <button style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </button> </div> <div style="display:table;width:100%;"> <button style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </button> <span style="display:table-cell;width:100%;background-color:lightyellow" > <select style="width:100%"> <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> </span> <button style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </button> </div> </body> <script> </script> </html> |
<!DOCTYPE html> <html lang="ru" style="height:100%;"> <head> <meta charset="utf-8"> <title>Полигон</title> <!-- <link href="stypes.css" rel="stylesheet"> <script src="script.js"></script> --> <!--<script type="module" src="/static/vue.js"></script>--> <style> </style> </head> <body style="height:100%;margin:0;"> <div>My fixed content</div> <div> <div style="width:fit-content;float:left;background-color:lightgray;" >setraw </div> <div style="float:left;max-width:100%;background-color:lightyellow" >Select-remaining </div> <div style="width:fit-content;float:left;background-color:lightblue" >vsplit </div> </div> <div style="display:table;width:100%;"> <div style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </div> <div style="display:table-cell;width:100%;background-color:lightyellow" >Select-remaining many1 many2 many3 many4 many5 many6 many7 many8 </div> <div style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </div> </div> <div style="display:table;width:100%;"> <button style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </button> <select style="display:table-cell;width:100%;background-color:lightyellow" > <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> <button style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </button> </div> <div style="display:table;width:100%;"> <button style="display:table-cell;width:fit-content;background-color:lightgray;" >setraw </button> <span style="display:table-cell;width:100%;background-color:lightyellow" > <select style="width:100%"> <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> </span> <button style="display:table-cell;width:fit-content;background-color:lightblue" >vsplit </button> </div> </body> <script> </script> </html>
Дополнительно:
float? table? это случайно не для почты вёрстка? во всём остальном давно уже работает display: flex на контейнер и flex-grow: 1 для нужного ребёнка
IvanU7n в комментарии подсказал, что flex умеет всё, что нужно, и на рендеринге это похоже на правду. Там есть те же fill-content и flex-grow:1 (вместо width: 100%), просто в отличие от table-cell это работает даже на <select>
Ответ
<!DOCTYPE html> <html lang="ru" style="height:100%;"> <head> <meta charset="utf-8"> <title>Полигон</title> <!-- <link href="stypes.css" rel="stylesheet"> <script src="script.js"></script> --> <!--<script type="module" src="/static/vue.js"></script>--> <style> </style> </head> <body style="height:100%;margin:0;"> <div style="display:flex;flex-direction:row;flex-wrap:nowrap;width:100%;"> <button style="flex:0 1 fit-content;background-color:lightgray;" >setraw </button> <select style="flex-grow:1;background-color:lightyellow" > <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> <button style="flex:0 1 fit-content;background-color:lightblue" >vsplit </button> </div> </body> <script> </script> </html> |
<!DOCTYPE html> <html lang="ru" style="height:100%;"> <head> <meta charset="utf-8"> <title>Полигон</title> <!-- <link href="stypes.css" rel="stylesheet"> <script src="script.js"></script> --> <!--<script type="module" src="/static/vue.js"></script>--> <style> </style> </head> <body style="height:100%;margin:0;"> <div style="display:flex;flex-direction:row;flex-wrap:nowrap;width:100%;"> <button style="flex:0 1 fit-content;background-color:lightgray;" >setraw </button> <select style="flex-grow:1;background-color:lightyellow" > <optgroup> <option>Select-remaining</option> <option>many1</option> <option>many2</option> <option>many3</option> </optgroup> </select> <button style="flex:0 1 fit-content;background-color:lightblue" >vsplit </button> </div> </body> <script> </script> </html>
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для заполнения оставшейся ширины элемента ввода без обёртки можно использовать свойство CSS `flex-grow`.
Прежде всего, у вас должен быть контейнер, в котором находится элемент ввода. Например, это может быть `
<div> </div>
В данном примере мы создали `
Таким образом, элемент ввода будет заполнять всю доступную ширину контейнера, не требуя дополнительной обёртки. Этот метод позволяет создавать гибкие и адаптивные макеты без лишних элементов в HTML.