Как динамически регулировать высоту контейнера при переносе гибких элементов в React с помощью CSS?

Я работаю над приложением React, в котором у меня есть контейнер (контейнер ответов) с несколькими кнопками (элементами ответа) внутри него. Эти кнопки размещаются с использованием flexbox (display: flex) с flex-wrap:wrap, что позволяет им переноситься на следующую строку при превышении ширины контейнера.

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

Как вы можете видеть на изображении, он почти перекрывает контейнер ниже (что нежелательно), я хочу сохранить постоянное пространство между контейнером ответов и контейнером с кнопками ниже.

Я думаю, что если мне удастся динамически регулировать высоту, я смогу установить что-то вроде margin-top в контейнере кнопок и таким образом сохранить постоянное пространство. Когда я делаю это сейчас, margin-top соответствует только первой строке с ответами, и таким образом следующие строки все равно перекрывают контейнер кнопок.

Вот упрощенная версия моего компонента React и CSS:

body, html, #root {
  margin: 0;
  padding: 0;
  height: 100%;
  /* width: 100%; */
}


.container {
  width: 786px;
  /* height: 244px; */
  min-height: 244px;
  position: absolute;
  top: 35%;
  left: 327px;
  }

.question {
  width: 583px;
  height: 88px;
  left: 102px;
  position: relative;
  margin-bottom: 16px;
  font-family: Grange;
  font-size: 40px;
  font-weight: 500;
  line-height: 44px;
  text-align: center;
  min-height: 88px;
  word-wrap: break-word;
  overflow-wrap: break-word;
  
}

.answers-container {
  width: 100%;
  height: 44px;
  top: 120px;
  gap: 10px;
  justify-content: center;
  /* width: fit-content; */
  display: flex;
  flex-wrap: wrap;
  max-width: 985px;
  margin-bottom: 50px;
  
}


.answer {
  border-radius: 8px;
  border: 1px solid #5bc1ed;
  justify-content: center;
  align-items: center;
  padding: 10px 20px;
  font-size: 16px;
  background-color: white;
  cursor: pointer;
  transition: background-color 0.3s;
  width: fit-content;
  min-width: 189px;
  text-align: left;
}

.answer:hover {
  background-color: #e0f7ff;
}

.answer-text {
  white-space: nowrap;
}

.answer-text {
  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 400;
  line-height: 16px;
  width: 129px;
  height: 16px;
  text-align: left;
  /* margin-left: 8px; */
  margin: 9px auto;
}

.next-back {
  width: 244px;
  height: 48px;
  top: 196px;
  left: 271px;
  gap: 20px;
  position: absolute;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  /* margin-top: 20px; */
}

.button-next {
  width: 189px;
  height: 48px;
  padding: 14px 40px 14px 40px;
  gap: 8px;
  border-radius: 8px;
  display: flex;
  /* margin-left: 100%; */
  background: #c3edff;
}

.button-text {
  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 500;
  line-height: 19.49px;
  text-align: center;
  width: 98px;
  display: flex;
  height: 19px;
}

.arrow-icon {
  width: 20px;
  height: 20px;
}

.arrow {
  width: 14.14px;
  height: 14.14px;
  top: -0px;
  left: 10px;
  gap: 0px;
  opacity: 0px;
  /* angle: -45 deg; */

}

.back-link {
  width: 35px;
  height: 19px;
  gap: 8px;
  border-radius: 8px;

  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 500;
  line-height: 19.49px;
  text-align: center;
  color: #677487;
  display: flex;
  justify-content: center;
  align-items: center;
  text-decoration: underline;
}
<div class = "container"><div class = "question">What benefit do you look for in your hair products?</div><div class = "answers-container"><button class = "answer"><span class = "answer-text">a. Anti-breakage</span></button><button class = "answer"><span class = "answer-text">b. Hydration</span></button><button class = "answer"><span class = "answer-text">c. Soothing dry scalp</span></button><button class = "answer"><span class = "answer-text">d. Repairs appearance of damaged hair</span></button><button class = "answer"><span class = "answer-text">e. Volume</span></button><button class = "answer"><span class = "answer-text">f. Curl and coil enhancing</span></button></div><div class = "next-back"><a href = "/second" class = "back-link">Back</a><button class = "button-next"><a href = "/fourth"><span class = "button-text">Next question</span></a><svg aria-hidden = "true" focusable = "false" data-prefix = "fas" data-icon = "arrow-right" class = "svg-inline--fa fa-arrow-right arrow-icon" role = "img" xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512"><path fill = "currentColor" d = "M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path></svg></button></div></div>

Что я пробовал:

  • Удаление фиксированной высоты из контейнера .ответов.
  • Обеспечение гибкой обертки: к контейнеру .ответов применяется обертка.
  • Обеспечение justify-content: center применяется к .ответам-контейнеру.
  • Проверка фиксированной высоты или других конфликтующих стилей родительских элементов.

Ожидаемое поведение:

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

Текущее поведение:

Высота контейнера ответов остается фиксированной, что приводит к переполнению кнопок.

Вопрос:

Как я могу гарантировать, что высота контейнера ответов динамически регулируется в зависимости от его содержимого (кнопок) в приложении React с использованием CSS? Какие изменения мне следует внести в мой компонент CSS или React, чтобы добиться такого поведения?

что такое container стили? имеет ли он статическую высоту?

Yaya 24.06.2024 21:09

Да, у него статичная высота: .container { width: 786px; высота: 244 пикселей; позиция: абсолютная; верх: 35%; слева: 327 пикселей; }

user25658615 24.06.2024 21:16

Конечно! С удовольствием! Я добавил это.

user25658615 24.06.2024 21:20

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

imhvost 24.06.2024 22:13

Сделал, но стили не применяются, не знаю почему. Я новичок в SO.

user25658615 24.06.2024 22:21

@BatKolio Стили не применяются, поскольку вы использовали синтаксис JSX в качестве HTML. Вы можете изменить HTML на фактический HTML, сгенерированный вашим JSX, открыв код в браузере и используя источник представления, чтобы скопировать и вставить визуализированный HTML. Или вы можете изменить JS-часть вашего фрагмента и использовать React со своими компонентами.

Emiel Zuurbier 24.06.2024 23:35

@EmielZuurbier, Спасибо! Теперь я сделал это!

user25658615 24.06.2024 23:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Большинство проблем, с которыми вы сталкиваетесь, вызваны явной установкой свойств height. Если высота не задана, высота будет определяться дочерними элементами или содержимым элемента. Не устанавливать высоту — это то, что вам нужно для правильного масштабирования элемента .answers-container.

Кроме того, будьте осторожны с position: absolute. CSS по умолчанию использует «поток документов», который позволяет вам позиционировать элементы относительно друг друга, учитывая отступы, поля и т. д. Абсолютное позиционирование элементов приведет к удалению элементов из указанного потока.

body,
html,
#root {
  margin: 0;
  padding: 0;
  height: 100%;
}

.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 25px;
  width: 786px;
  /* height: 244px; */
  min-height: 244px;
  position: absolute;
  top: 35%;
  left: 327px;
}

.question {
  width: 583px;
  font-family: Grange;
  font-size: 40px;
  font-weight: 500;
  line-height: 44px;
  text-align: center;
  min-height: 88px;
  word-wrap: break-word;
  overflow-wrap: break-word;
}

.answers-container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  width: 100%;
  gap: 10px;
  max-width: 985px;
}

.answer {
  border-radius: 8px;
  border: 1px solid #5bc1ed;
  justify-content: center;
  align-items: center;
  padding: 10px 20px;
  font-size: 16px;
  background-color: white;
  cursor: pointer;
  transition: background-color 0.3s;
  width: fit-content;
  min-width: 189px;
  text-align: left;
}

.answer:hover {
  background-color: #e0f7ff;
}

.answer-text {
  white-space: nowrap;
}

.answer-text {
  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 400;
  line-height: 16px;
  width: 129px;
  height: 16px;
  text-align: left;
  margin: 9px auto;
}

.next-back {
  width: 244px;
  height: 48px;
  top: 196px;
  left: 271px;
  gap: 20px;
  display: flex;
  justify-content: flex-end;
  align-items: center;
}

.button-next {
  width: 189px;
  height: 48px;
  padding: 14px 40px 14px 40px;
  gap: 8px;
  border-radius: 8px;
  display: flex;
  background: #c3edff;
}

.button-text {
  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 500;
  line-height: 19.49px;
  text-align: center;
  width: 98px;
  display: flex;
  height: 19px;
}

.arrow-icon {
  width: 20px;
  height: 20px;
}

.arrow {
  width: 14.14px;
  height: 14.14px;
  top: -0px;
  left: 10px;
  gap: 0px;
  opacity: 0px;
  /* angle: -45 deg; */
}

.back-link {
  width: 35px;
  height: 19px;
  gap: 8px;
  border-radius: 8px;
  font-family: Proxima Nova;
  font-size: 16px;
  font-weight: 500;
  line-height: 19.49px;
  text-align: center;
  color: #677487;
  display: flex;
  justify-content: center;
  align-items: center;
  text-decoration: underline;
}
<div class = "container">
  <div class = "question">What benefit do you look for in your hair products?</div>
  <div class = "answers-container"><button class = "answer"><span class = "answer-text">a. Anti-breakage</span></button><button class = "answer"><span class = "answer-text">b. Hydration</span></button><button class = "answer"><span class = "answer-text">c. Soothing dry scalp</span></button>
    <button
      class = "answer"><span class = "answer-text">d. Repairs appearance of damaged hair</span></button><button class = "answer"><span class = "answer-text">e. Volume</span></button><button class = "answer"><span class = "answer-text">f. Curl and coil enhancing</span></button></div>
  <div
    class = "next-back"><a href = "/second" class = "back-link">Back</a><button class = "button-next"><a href = "/fourth"><span class = "button-text">Next question</span></a><svg aria-hidden = "true" focusable = "false" data-prefix = "fas" data-icon = "arrow-right" class = "svg-inline--fa fa-arrow-right arrow-icon" role = "img" xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512"><path fill = "currentColor" d = "M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z"></path></svg></button></div>
</div>

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