Гибкий элемент переполняет контейнер из-за длинного слова даже после использования word-wrap

<div class="parent">
   <div class="child1">
     question
   </div>
  <div class="child2">
  somethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomething

<div class="parent">
  <div class="child1">
    question
  </div>
  <div class="child3">
   somethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomething
  </div>
</div>

CSS

.parent{
  width:100%;
  display:flex;
  flex-direction:row;
  flex-wrap:nowrap;
  padding:1em;
  background-color:red;
  box-sizing:border-box;
}
.child1{
  background-color:mistyrose;
  padding:1em;
}

.child2{
  background-color:powderblue;
  padding:.5em;
  word-wrap:break-word;
  max-width:500px;
}
.child3{
  background-color:powderblue;
  padding:.5em;
  word-wrap:break-word;

}

Основная проблема с указанным выше кодом - это переполнение child3, но если я дам max-width в child2, он не переполнит parent. В обоих случаях я использовал word-wrap: break-word;

Здесь вы можете проверить код http://jsfiddle.net/vbj10x4k/

Мне нужно знать, почему это происходит и как его решить, не используя max-width/width для фиксированных значений пикселей. Мне нужно, чтобы он был отзывчивым.

Ответ 1

Вместо установки максимальной ширины для вашего элемента flex используйте объявление min-width.

По умолчанию, если не задана минимальная ширина, предполагается минимальная ширина содержимого элемента, и ширина элемента гибкости никогда не будет меньше. Если установить минимальную ширину, например, 40%, элемент будет сжиматься максимум до 40% от гибкого родителя.

.child2, .child3 {
  min-width: 40%;
}

.parent{
  width:100%;
  display:flex;
  flex-direction:row;
  flex-wrap:nowrap;
  padding:1em;
  background-color:red;
  box-sizing:border-box;
}
.child1{
  background-color:mistyrose;
  padding:1em;
}
.child2{
  background-color:powderblue;
  padding:.5em;
  word-wrap: break-word;
  overflow-wrap: break-word;
  min-width: 40%;
}
.child3{
  background-color:lightyellow;
  padding:.5em;
  word-wrap: break-word;
  overflow-wrap: break-word;
  min-width: 40%;
}
<div class="parent">
  <div class="child1">
    question
  </div>
  <div class="child2">
   somethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomething

  </div>
  <div class="child3">
    Works well with long URLs: <a href="#"> https://thisisadamnlongurlcontainingneitherhyphensoradditionalperiods.com</a>
  </div>
</div>

Ответ 2

Вместо word-wrap:break-word используйте word-break:break-all

CSS

.child1{
  background-color:mistyrose;
  padding:1em;
  word-break:break-all;
}
.child2{
  background-color:powderblue;
  padding:.5em;
  max-width:500px;
  word-break:break-all;
}
.child3{
  background-color:powderblue;
  padding:.5em;
  word-break:break-all;

}

вот рабочая ссылка http://jsfiddle.net/yudi/vbj10x4k/3/

Ответ 3

Я использую такую комбинацию, и она работает для меня в Chrome, Safari и Firefox.

.myOverflowableText {
  word-break: break-word; /* Chrome, Safari */
  overflow-wrap: anywhere; /* Firefox */
}

На этом сайте говорится, что в Chrome & Safari поддерживается перерыв на слова https://caniuse.com/#feat=word-break.

Но я обнаружил, что решение Firefox должно быть overflow-wrap: anywhere на этом сайте: https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-wrap

Я еще не уверен насчет IE... Может быть, word-wrap: break-word; работает на IE?

Моя цель заключается в следующем:

Hello this is some |
text. I am writing |
some text.         |
Especially long    |
words go to the    |
next line like     |
this. This is a    |
veryveryveryveryve |
ryveryverylongword |
.                  |

Ответ 4

Благодаря ответу Гаурава Аггарвала я смог решить ту же проблему, используя свойство CSS:

word-break: break-word