Проблема с шириной контейнера CSS, не очень хорошо работает с «переполнением»?

Я считаю, что это мой первый пост здесь. Я время от времени работаю с HTML и CSS более 20 лет, но я немного нуб, когда дело касается современного HTML5 и CSS, поэтому я не знаю, то ли я что-то не понимаю, то ли это баг какой-то. (Вероятно, первое.)

Здесь у меня есть макет макета интерфейса. В общем, это должен быть полноэкранный интерфейс (без прокрутки), внутри которого мне нужна панель меню, которая растягивается по всему контейнеру и прокручивается по горизонтали.

<html>
    <style>
        .fullscreen { width: 100%; height:100%; position: absolute; top: 0px; left: 0px; margin: 0px; }
        .border { border: solid black 4px; padding: 8px; }
        .menuitem { display: inline-block; width: 300px; height: 300px; border: solid blue 1px; margin: 8px; }
    </style>
    <div class=fullscreen style = "display: flex;"> <!-- full screen container-->
        <div style = "padding: 8px; flex-grow: 1; display: flex;"> <!-- screen padding - doesn't play nice with fullscreen -->
            <div class=border style = "min-width: 100px; margin-right: 8px;"></div> <!-- left menu -->
            <div class=border style = "flex-grow: 1;"> <!-- right content container, grows to fill remaining space -->
                <div class=border style = "max-width: 100%;"> <!-- intermediate container for the scrolling view, should be as wide as permissible -->
                    <div style = "white-space: nowrap; overflow-x: auto; max-width: 100%;"> <!-- horizontally scrolling view -->
                        <!-- arbitrary contents of the scrolling view -->
                        <div class=menuitem></div>
                        <div class=menuitem></div>
                        <div class=menuitem></div>
                        <div class=menuitem></div>
                        <div class=menuitem></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</html>

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

Я пробовал различные комбинации вложенных контейнеров, ограничивая размеры до разных размеров и т. д.

Одно из наблюдений заключается в том, что это происходит только в том случае, если я устанавливаю для прокрутки максимальную ширину в процентах. Если я укажу количество пикселей, все будет работать так, как я ожидал. Для меня это указывает на то, что размер макета рассчитывается до того, как произойдет отсечение представления прокрутки. Я надеялся, что промежуточный контейнер (закомментированный в коде) поможет это исправить.

Точно так же, если я изменю представление прокрутки, чтобы иметь гораздо меньшую максимальную ширину в процентах (скажем, 10%), этот div действительно станет меньше, но, как ни странно, родительские контейнеры все равно будут вести себя так, как если бы присутствовала полная ширина.

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

Итак, я что-то неправильно понимаю в концепции процентной ширины? Или, возможно, есть простой атрибут CSS, который решит эту проблему?

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

Mrigayan 09.06.2024 16:50

Как оказалось, да, это спасение от этой и других проблем, с которыми я столкнулся. 👍

Ed M 10.06.2024 03:37
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
2
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

введите сюда описание изображения

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <style>
        body, html {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
        }
        .fullscreen { 
            display: flex;
            width: 100%; 
            height: 100%; 
            position: absolute; 
            top: 0; 
            left: 0; 
            margin: 0; 
            padding: 8px; /* Adjusted to include the padding in fullscreen */
            box-sizing: border-box; /* Ensures padding is included in the width/height */
        }
        .border { 
            border: solid black 4px; 
            padding: 8px; 
            box-sizing: border-box; 
        }
        .menuitem { 
            display: inline-block; 
            width: 300px; 
            height: 300px; 
            border: solid blue 1px; 
            margin: 8px; 
        }
        .left-menu {
            min-width: 100px; 
            margin-right: 8px; 
        }
        .right-content {
            flex-grow: 1; 
            display: flex;
            flex-direction: column;
        }
        .scrolling-view {
            flex-grow: 1;
            white-space: nowrap; 
            overflow-x: auto; 
        }
    </style>
</head>
<body>
    <div class = "fullscreen"> <!-- full screen container-->
        <div class = "left-menu border"></div> <!-- left menu -->
        <div class = "right-content border"> <!-- right content container, grows to fill remaining space -->
            <div class = "scrolling-view border"> <!-- horizontally scrolling view -->
                <!-- arbitrary contents of the scrolling view -->
                <div class = "menuitem"></div>
                <div class = "menuitem"></div>
                <div class = "menuitem"></div>
                <div class = "menuitem"></div>
                <div class = "menuitem"></div>
            </div>
        </div>
    </div>
</body>
</html>

Попробуй этот код, братан!

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

Mrigayan 09.06.2024 17:07

Если вы пытаетесь получить результат согласно верхнему снимку экрана, примените его к контейнеру, представленному ниже <!-- right content container, grows to fill remaining space -->

div.border { 
    width: 85vw;
}

Хорошо, спасибо! Примерно такой результат мне нужен. Однако, если я правильно понимаю, у него есть два небольших недостатка. Во-первых, он не совсем доходит до правого края; Я бы предпочел решение, которое гарантирует, что оно будет точно на одном уровне с отступом. Кроме того, я не уверен, что результаты будут такими же, если размер дисплея изменится, поскольку величина левого столбца и заполнения не обязательно зависит от размера области просмотра.

Ed M 09.06.2024 18:29

@EdM Если вы хотите правильно выровнять все компоненты с использованием vw и vh, вам необходимо заменить все % на vw или vh. Кроме того, да, вы получите тот же результат на любом дисплее, что и в отношении области просмотра, вы можете попробовать различные размеры экрана в элементе проверки. Если вы получили ответ, примите его, он будет отмечен зеленой галочкой😊

Mrigayan 09.06.2024 20:40
Ответ принят как подходящий

Есть много вещей, которые я бы изменил в вашем коде. Позвольте мне сначала исправить ваш код, а затем я объясню, что не так.

<html>
<head>
<style>
  .fullscreen { width: 100vw; height: 100vh; overflow: hidden; display: flex; }
  
  .border { border: solid black 4px; padding: 8px; }
  
  .menuitem { display: inline-block; width: 300px; height: 300px; border: solid blue 1px; margin: 8px; }
  
  * {
    box-sizing: border-box;
  }

  body {
    margin:0;
  }

  .outer-container {
    display: grid;
  }

  .inner-container {
    white-space: nowrap; overflow-x: auto; max-width: 100%;
  }
</style>
</head>
  <body>
    <div class = "fullscreen"> <!-- full screen container-->
        <div style = "flex-grow: 1; display: flex; gap: 8px; margin: 8px"> <!-- screen padding - doesn't play nice with fullscreen -->
            <div class = "border" style = "min-width: 100px;"></div> <!-- left menu -->
            <div class = "border" style = "flex-grow: 1;"> <!-- right content container, grows to fill remaining space -->
                <div class = "border outer-container"> <!-- intermediate container for the scrolling view, should be as wide as permissible -->
                    <div class = "inner-container"> <!-- horizontally scrolling view -->
                        <!-- arbitrary contents of the scrolling view -->
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                        <div class = "menuitem"></div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </body>
</html>

Прежде всего, я бы использовал абсолютное позиционирование, поскольку вы перемещаете его на другую ось Z, которая в данном случае не нужна. Затем используйте единицы измерения vw/vh, если вы хотите всегда иметь полную ширину и высоту устройства (особенно высота может быть необычной). Используйте gap вместо margin, чтобы создать пробелы между контейнерами во флексбоксе (вы уже использовали display: flex, поэтому можете использовать gap).

Наконец, главное, что решает вашу проблему: display: grid. Разница между flex и grid простыми словами заключается в том, как они вычисляют пространство для элементов. Элемент с display: grid задает правила того, как должны быть нарисованы дети и как должны рассчитываться их размеры, с флексбоксом все наоборот. Дети берут то, что им нужно, поэтому максимальная ширина в данном случае означает 100% необходимой вам ширины. В общем, чтобы все работало так, как вы хотите, вам нужно указать любую ширину, которая прекращает расчет, поэтому px тоже работали — их число ограничено.

Большое спасибо, что нашли время исправить это! Ваше объяснение знакомит с несколькими новыми для меня терминами, которые мне придется изучить дальше, а именно: сетка, зазор и размер коробки. Я попробую и отвечу снова, как только лучше пойму, что делает каждый из них. А пока кое-что: какой элемент должен использовать абсолютное позиционирование и что вы имели в виду под другой осью z?

Ed M 09.06.2024 18:34

Только что вернулся, чтобы еще раз сказать спасибо за вашу информацию! Я прочитал «сетку» дисплея, и кажется, что это очень поможет в дальнейшем. (Я только недавно услышал о «flex», поэтому не был полностью уверен в его правильном применении.) Border-box также является отличной вещью, которую стоит изучить; В мое время для достижения этой цели нам приходилось использовать вложенные элементы div с дополнениями из-за несоответствий между браузерами. Рад, что с тех пор они решили эту проблему!

Ed M 09.06.2024 19:53

Да, я бы сказал, что сейчас это намного проще, я знаю, о чем вы говорите;) Абсолютное позиционирование выходит за рамки обычного двухмерного потока веб-страниц, и вы можете использовать z-index для размещения элементов в трехмерном измерении (выше или ниже других слои). Его нужно использовать с умом. Его можно использовать, когда внутренний элемент должен быть помещен в контейнер с отключением от своих братьев и сестер (т. е. значок крестика для закрытия всплывающего окна), в этом случае родительский элемент должен иметь позицию: относительная.

bemol 10.06.2024 16:13

Другие вопросы по теме