Как в сетке из 3 колонок, где 1 колонка занимает оставшуюся ширину, убрать горизонтальный скролл?

Ссылка скопирована
22 января 2026 1 ответ

Всем привет. Имеется сетка из 3 колонок: левая - фиксированная (300px), центральная - занимает оставшееся пространство, правая - фиксированная (200px). Внутри центральной колонки есть навигация, левая половина центральной колонки отдана под ссылку на предыдущую страницу, правая половина - под ссылку на следующую страницу. В текущей разметке появляется горизонтальный скролл, когда название ссылок достаточно длинное (обрезаю через text-overflow: ellipsis). Понимаю, что скорее всего flex-basis: 50% рассчитывается не по той ширине и если у второй колонки добавить max-width: calc(100% - 500px) проблема исчезнет. Это единственное решение? На это завязываться не очень удобно, так как правая панель может быть скрыта и при адаптиве ширине левой и правой колонок может меняться

Код

<div id="app">   <div style="display: flex">     <div style="flex: 0 0 300px; background-color: tomato">1</div>     <div style="flex: 1 1 auto; background-color: pink">       <div style="display: flex">         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Prev pageeeeeeeeeeeeeeeeeeeeee         </div>         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Next pageeeeeeeeeeeeeeeeeeeeee         </div>       </div>     </div>     <div style="flex: 0 0 200px; background-color: lightblue">3</div>   </div> </div>

<div id="app"> <div style="display: flex"> <div style="flex: 0 0 300px; background-color: tomato">1</div> <div style="flex: 1 1 auto; background-color: pink"> <div style="display: flex"> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Prev pageeeeeeeeeeeeeeeeeeeeee </div> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Next pageeeeeeeeeeeeeeeeeeeeee </div> </div> </div> <div style="flex: 0 0 200px; background-color: lightblue">3</div> </div> </div>

Проблема

Как в сетке из 3 колонок, где 1 колонка занимает оставшуюся ширину, убрать горизонтальный скролл?

Не совсем удобный фикс

Как в сетке из 3 колонок, где 1 колонка занимает оставшуюся ширину, убрать горизонтальный скролл?

Песочницаhttps://stackblitz.com/edit/js-rsw7xo?file=index.html

Дополнительно:

Есть вариант задействовать переменные

Условный код:

:root {   --left: 300px;   --right: 200px; }  .left {   width: var(--left) }  .right {   width: var(--right) } .center {   width: calc(100% - var(--left) - var(--right)); }

:root { --left: 300px; --right: 200px; } .left { width: var(--left) } .right { width: var(--right) } .center { width: calc(100% - var(--left) - var(--right)); }

Соответственно, когда левая колонка скрыта:

.layout {   --left: 0; }

.layout { --left: 0; }

  • отметил решением, но предложили вариант с min-width: 0 у центральной колонки (https://dfmcphee.com/flex-items-and-min-width-0/)

если флексы не принципиально, то есть вариант через грид:

<div id="app">   <div style="display: grid; grid: auto-flow / 300px minmax(0, 1fr) 200px">     <div style="background-color: tomato">1</div>     <div style="background-color: pink">       <div style="display: flex">         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Prev pageeeeeeeeeeeeeeeeeeeeee         </div>         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Next pageeeeeeeeeeeeeeeeeeeeee         </div>       </div>     </div>     <div style="background-color: lightblue">3</div>   </div> </div>

<div id="app"> <div style="display: grid; grid: auto-flow / 300px minmax(0, 1fr) 200px"> <div style="background-color: tomato">1</div> <div style="background-color: pink"> <div style="display: flex"> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Prev pageeeeeeeeeeeeeeeeeeeeee </div> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Next pageeeeeeeeeeeeeeeeeeeeee </div> </div> </div> <div style="background-color: lightblue">3</div> </div> </div>

Подсказали из тематической телеги (нужно добавить min-width: 0 у центральной колонки). Пока вроде устраивает, буду искать возможные проблемы.

Возможное обоснование - https://dfmcphee.com/flex-items-and-min-width-0/

<div id="app">   <div style="display: flex">     <div style="flex: 0 0 300px; background-color: tomato">1</div>     <div style="flex: 1 1 auto; background-color: pink; min-width: 0">       <div style="display: flex">         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Prev pageeeeeeeeeeeeeeeeeeeeee         </div>         <div           style="             flex-basis: 50%;             white-space: nowrap;             overflow-x: hidden;             text-overflow: ellipsis;           "         >           Next pageeeeeeeeeeeeeeeeeeeeee         </div>       </div>     </div>     <div style="flex: 0 0 200px; background-color: lightblue">3</div>   </div> </div>

<div id="app"> <div style="display: flex"> <div style="flex: 0 0 300px; background-color: tomato">1</div> <div style="flex: 1 1 auto; background-color: pink; min-width: 0"> <div style="display: flex"> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Prev pageeeeeeeeeeeeeeeeeeeeee </div> <div style=" flex-basis: 50%; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; " > Next pageeeeeeeeeeeeeeeeeeeeee </div> </div> </div> <div style="flex: 0 0 200px; background-color: lightblue">3</div> </div> </div>

  • кстати да, забыл про этот способ уменьшения размера элемента флекса
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Роман IT Ответ

Для того чтобы создать сетку из трех колонок, где одна колонка занимает оставшуюся ширину и избежать появления горизонтального скролла, можно использовать CSS свойства flexbox.

Пример кода на HTML и CSS:

<div class="container">
    <div class="column1">Column 1</div>
    <div class="column2">Column 2</div>
    <div class="column3">Column 3</div>
</div>

<div class="container"> <div class="column1">Column 1</div> <div class="column2">Column 2</div> <div class="column3">Column 3</div> </div>

.container {
    display: flex;
    flex-wrap: wrap;
}
 
.column1 {
    flex: 0 0 200px; /* фиксированная ширина первой колонки */
}
 
.column2 {
    flex: 1; /* вторая колонка занимает оставшуюся ширину */
}
 
.column3 {
    flex: 0 0 200px; /* фиксированная ширина третьей колонки */
}

.container { display: flex; flex-wrap: wrap; } .column1 { flex: 0 0 200px; /* фиксированная ширина первой колонки */ } .column2 { flex: 1; /* вторая колонка занимает оставшуюся ширину */ } .column3 { flex: 0 0 200px; /* фиксированная ширина третьей колонки */ }

В данном примере у нас есть контейнер с классом "container" и три дочерних элемента с классами "column1", "column2" и "column3". С помощью свойства "display: flex" мы создаем flex-контейнер, а свойство "flex: 1" для второй колонки позволяет ей занимать все оставшееся пространство.

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно