Почему гибкий дочерний элемент не сжимается на этой простой веб-странице тестового примера?

У меня была веб-страница, которая работала отлично, и размер дочернего элемента холста (шахматная доска с кроликом) изменялся, сохраняя при этом соотношение сторон 1:1 с помощью ResizeObserver, когда ширина окна браузера уменьшалась:

Затем я добавил элемент div «horizontalFlexContainer» вокруг всех элементов этой страницы, чтобы можно было добавить серое меню с четырьмя записями с левой стороны.

К сожалению, это привело к тому, что «verticalFlexContainer» отказывается сжиматься при уменьшении ширины браузера:

Вот мой проблемный keep-aspect-ratio.html с использованием main.css

Кто-нибудь может порекомендовать, что вдруг заставляет «сопротивление» сокращаться?

  const parentElement = document.getElementById("parent");
  const childElement = document.getElementById("child");

  const app = new PIXI.Application({
    backgroundColor: 0xccffcc,
    width: 800,
    height: 800,
    view: childElement,
  });

  const resizeObserver = new ResizeObserver((entries) => {
    for (let entry of entries) {
      const { width, height } = entry.contentRect;
      const minDimension = Math.min(width, height);

      // maintain the 1:1 aspect ratio of the child element
      childElement.style.width = `${minDimension}px`;
      childElement.style.height = `${minDimension}px`;
    }
  });

  resizeObserver.observe(parentElement);

  const background = new PIXI.Graphics();
  for (let i = 0; i < 8; i++) {
    for (let j = 0; j < 8; j++) {
      if ((i + j) % 2 == 0) {
        background.beginFill(0xccccff);
        background.drawRect(i * 100, j * 100, 100, 100);
        background.endFill();
      }
    }
  }
  app.stage.addChild(background);

  const texture = PIXI.Texture.from("https://pixijs.com/assets/bunny.png");
  const bunny = new PIXI.Sprite(texture);
  bunny.anchor.set(0.5);
  bunny.x = 50;
  bunny.y = 50;
  bunny.width = 100;
  bunny.height = 100;
  app.stage.addChild(bunny);
html,
body,
h3,
ul {
  margin: 0;
  padding: 0;
  text-align: center;
  overflow: hidden;
}

nav a.active {
  color: red;
}

div.horizontalFlexContainer {
  display: flex;
  justify-content: space-between;
  align-items: stretch;
}

div.verticalFlexContainer {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: stretch;
  height: 100vh;
}

/* the parent contains: just the canvas element, which observes the parent dimensions */
div.parent {
  border: 4px solid red;
  flex: 1;
  /* center the only child element: the canvas */
  display: flex;
  align-items: center;
  justify-content: center;
  /* prevent the canvas child disrupting the layout */
  overflow: hidden;
}

canvas.child {
  background-color: yellow;
  border: 4px green dotted;
  /* draw the border inside of the canvas element */
  box-sizing: border-box;
}

div.hint,
div.status {
  background: lightblue;
  font-style: italic;
  text-align: center;
}
<script src = "//cdn.jsdelivr.net/npm/pixi.js-legacy@7/dist/pixi-legacy.min.js"></script>

<div class = "horizontalFlexContainer">
  <div style = "background: lightgrey">
    <h3>Select a game!</h3>
    <nav>
      <ul>
        <li>Game 1</li>
        <li>Game 2</li>
        <li>Game 3</li>
        <li>Game 4</li>
      </ul>
    </nav>
  </div>
  <div style = "flex-grow: 1">
    <div class = "verticalFlexContainer">
      <div class = "status">Game #1 Score1:Score2</div>
      <div class = "parent" id = "parent">
        <canvas class = "child" id = "child"></canvas>
      </div>
      <div class = "hint">A game hint to do this and that...</div>
    </div>
  </div>
</div>

Это похоже на вариант использования соотношения сторон CSS. Подойдет ли это для вашей ситуации?

T.J. Crowder 28.04.2024 12:10

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

Alexander Farber 28.04.2024 12:13
Приемы 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
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

#child { max-width: 100% }:

const parentElement = document.getElementById("parent");
  const childElement = document.getElementById("child");

  const app = new PIXI.Application({
    backgroundColor: 0xccffcc,
    width: 800,
    height: 800,
    view: childElement,
  });

  const resizeObserver = new ResizeObserver((entries) => {
    for (let entry of entries) {
      const { width, height } = entry.contentRect;
      const minDimension = Math.min(width, height);

      // maintain the 1:1 aspect ratio of the child element
      childElement.style.width = `${minDimension}px`;
      childElement.style.height = `${minDimension}px`;
    }
  });

  resizeObserver.observe(parentElement);

  const background = new PIXI.Graphics();
  for (let i = 0; i < 8; i++) {
    for (let j = 0; j < 8; j++) {
      if ((i + j) % 2 == 0) {
        background.beginFill(0xccccff);
        background.drawRect(i * 100, j * 100, 100, 100);
        background.endFill();
      }
    }
  }
  app.stage.addChild(background);

  const texture = PIXI.Texture.from("https://pixijs.com/assets/bunny.png");
  const bunny = new PIXI.Sprite(texture);
  bunny.anchor.set(0.5);
  bunny.x = 50;
  bunny.y = 50;
  bunny.width = 100;
  bunny.height = 100;
  app.stage.addChild(bunny);
html,
body,
h3,
ul {
  margin: 0;
  padding: 0;
  text-align: center;
  overflow: hidden;
}

nav a.active {
  color: red;
}

div.horizontalFlexContainer {
  display: flex;
  justify-content: space-between;
  align-items: stretch;
}

div.verticalFlexContainer {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: stretch;
  height: 100vh;
}

/* the parent contains: just the canvas element, which observes the parent dimensions */
div.parent {
  border: 4px solid red;
  flex: 1;
  /* center the only child element: the canvas */
  display: flex;
  align-items: center;
  justify-content: center;
  /* prevent the canvas child disrupting the layout */
  overflow: hidden;
}

canvas.child {
  background-color: yellow;
  border: 4px green dotted;
  /* draw the border inside of the canvas element */
  box-sizing: border-box;
  max-width: 100%;
}

div.hint,
div.status {
  background: lightblue;
  font-style: italic;
  text-align: center;
}
<script src = "//cdn.jsdelivr.net/npm/pixi.js-legacy@7/dist/pixi-legacy.min.js"></script>

<div class = "horizontalFlexContainer">
  <div style = "background: lightgrey">
    <h3>Select a game!</h3>
    <nav>
      <ul>
        <li>Game 1</li>
        <li>Game 2</li>
        <li>Game 3</li>
        <li>Game 4</li>
      </ul>
    </nav>
  </div>
  <div style = "flex-grow: 1">
    <div class = "verticalFlexContainer">
      <div class = "status">Game #1 Score1:Score2</div>
      <div class = "parent" id = "parent">
        <canvas class = "child" id = "child"></canvas>
      </div>
      <div class = "hint">A game hint to do this and that...</div>
    </div>
  </div>
</div>

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