Текст переполняется во вложенных контейнерах flexbox - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь усечь содержимое первого 'message-title', как только оно достигнет края зеленого контейнера.Вместо этого это переполняется снаружи.Я думаю, что это, вероятно, причуда Flexbox - кто-нибудь пытался сделать что-то подобное?

Добавил соответствующий кодовый указатель внизу поста.

Разметка

<div class="container">
  <div class="message">
    <div class="message-content">
      <div class="message-header">
        Header
      </div>
      <div class="message-body">
        <div class="message-body__left">
          AV
        </div>
        <div class="message-body__right">
          <div class="message-main">
            <div class="message-type">

            </div>
            <div class="message-details">
              <div class="message-title">
                Test string Test string Test string Test string Test string Test string Test string Test string
              </div>
              <div class="message-subtitle">
                Blah blah
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="message">
    <div class="message-content">
      <div class="message-header">
        Header
      </div>
      <div class="message-body">
        <div class="message-body__left">
          AV
        </div>
        <div class="message-body__right">
          <div class="message-main">
            <div class="message-type">

            </div>
            <div class="message-details">
              <div class="message-title">
                Test string Test string
              </div>
              <div class="message-subtitle">
                Blah blah
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  <div class="message">
    <div class="message-content">
      <div class="message-header">
        Header
      </div>
      <div class="message-body">
        <div class="message-body__left">
          AV
        </div>
        <div class="message-body__right">
          <div class="message-main">
            <div class="message-type">

            </div>
            <div class="message-details">
              <div class="message-title">
                Test string
              </div>
              <div class="message-subtitle">
                Blah blah
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

CSS

* {
  min-width: 0;
  box-sizing: border-box;
}

.container {
  display: flex;
  flex-direction: column;
  padding: 1.5rem;
  max-width: 400px;
  background: red;
}

.message {
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  margin-bottom: 2rem;
}

.message-content {
  display: flex;
  flex-direction: column;
  margin-right: 20%;
  max-width: 80%;
  align-items: flex-start;
  background: green;
}

.message-header {
  display: flex;
}

.message-body {
  display: flex;
}

.message-body__left {
  display: inline-flex;
  flex-shrink: 0;
  margin-right: 0.5rem;
  background: teal;
  display: none;
}

.message-body__right {
  position: relative;
  background: #eff2f5;
  border-radius: 3px;
  word-wrap: break-word;
  white-space: normal;
}

.message-main {
  display: flex;
}

.message-type {
  position: relative;
  width: 3rem;
  height: 3rem;
  display: flex;
  flex-shrink: 0;
  background: blue;
}

.message-details {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.message-title {
  padding-bottom: 0.25rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.message-subtitle {
  display: flex;
  justify-content: space-between;
}

Соответствующий кодовый код здесь - https://codepen.io/anon/pen/VGgQdL

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Как указал @Viktor, white-space:nowrap вызывал вашу проблему.

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

Более того, простота выполнения приводит к простым решениям.Например, нет необходимости делать ничего особенного, чтобы синий прямоугольник занимал все вертикальное пространство из-за значения по умолчанию align-items, равного stretch, означающего, что дочерние элементы будут занимать все доступное пространство в cross-axis (Y вэтот случай).То же самое происходит с дочерними элементами flex-direction:column родителей, которые занимают все горизонтальное пространство.

Пожалуйста, смотрите код, приведенный ниже (префиксы поставщиков опущены для краткости):

.container{
  display:flex;
  flex-direction:column;
  box-sizing:border-box; 
  padding:1.5rem; 
  max-width:400px; 
  background:red;
}

.message:not(:last-child){
  margin-bottom:20px;
}

.message{
  display:flex;
  flex-direction:column;
}

.header{
  background:green;
}

.body{
  display:flex;
  flex-direction:row;
}

.type{
  flex-basis:20%;
  background:blue;
}

.subtitle{
  flex-grow:1;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  background:lightgray;
}
<div class="container">
  <div class="message">
	<div class="header">
		Header
	</div>
	<div class="body">
		<div class="type"></div>
		<div class="subtitle">
			Test string Test string Test string Test string Test string Test string Test string Test string Blah blah
		</div>
	</div>
  </div>
  <div class="message">
	<div class="header">
		Header 2
	</div>
	<div class="body">
		<div class="type"></div>
		<div class="subtitle">
			Test string2 Test string2 Test string2 Test string2 Test string Test string Test string Test string Blah blah
		</div>
	</div>
  </div>
</div>

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

0 голосов
/ 20 сентября 2018

white-space: nowrap в .message-title селектор вызывает проблему.

Редактировать 1.

Удаление display: flex из .message-content работает, потому что для overflow: hidden; text-overflow: ellipsis Для работы родительский контейнер должен иметь фиксированную ширину.При включенном .message-content { display: flex; } это не происходит, потому что ширина плавная.

Если вам абсолютно необходимо сохранить display: flex на родительском элементе, вы можете попробовать вручную добавить фиксированную ширину - .message-title: { max-width: 234px; } или width: 234px.Он работает так же, за исключением того, что он ломается при небольшом размере экрана.

* {
  min-width: 0;
  box-sizing: border-box;
}

.container {
  display: flex;
  flex-direction: column;
  padding: 1.5rem;
  max-width: 400px;
  background: red;
}

.message {
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  margin-bottom: 2rem;
}

.message-content {
  display: flex;
  flex-direction: column;
  margin-right: 20%;
  max-width: 80%;
  align-items: flex-start;
  background: green;
}

.message-header {
  display: flex;
}

.message-body {
  display: flex;
}

.message-body__left {
  display: inline-flex;
  flex-shrink: 0;
  margin-right: 0.5rem;
  background: teal;
  display: none;
}

.message-body__right {
  position: relative;
  background: #eff2f5;
  border-radius: 3px;
  word-wrap: break-word;
  white-space: normal;
}

.message-main {
  display: flex;
}

.message-type {
  position: relative;
  width: 3rem;
  height: 3rem;
  display: flex;
  flex-shrink: 0;
  background: blue;
}

.message-details {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.message-title {
  padding-bottom: 0.25rem;
  /* white-space: nowrap; */
  overflow: hidden;
  text-overflow: ellipsis;
}

.message-subtitle {
  display: flex;
  justify-content: space-between;
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<link rel="stylesheet" href="style.css">
	<title>Cover</title>
</head>
<body>
	<div class="container">
		<div class="message">
			<div class="message-content">
				<div class="message-header">
					Header
				</div>
				<div class="message-body">
					<div class="message-body__left">
						AV
					</div>
					<div class="message-body__right">
						<div class="message-main">
							<div class="message-type">
						
							</div>
							<div class="message-details">
								<div class="message-title">
									Test string Test string Test string Test string Test string Test string Test string Test string
								</div>
								<div class="message-subtitle">
									Blah blah
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div class="message">
			<div class="message-content">
				<div class="message-header">
					Header
				</div>
				<div class="message-body">
					<div class="message-body__left">
						AV
					</div>
					<div class="message-body__right">
						<div class="message-main">
							<div class="message-type">
						
							</div>
							<div class="message-details">
								<div class="message-title">
									Test string Test string
								</div>
								<div class="message-subtitle">
									Blah blah
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div class="message">
			<div class="message-content">
				<div class="message-header">
					Header
				</div>
				<div class="message-body">
					<div class="message-body__left">
						AV
					</div>
					<div class="message-body__right">
						<div class="message-main">
							<div class="message-type">
						
							</div>
							<div class="message-details">
								<div class="message-title">
									Test string
								</div>
								<div class="message-subtitle">
									Blah blah
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...