Переполнение не видно для центрированного гибкого элемента [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

141
задан Michael_B 31 October 2015 в 20:21
поделиться

6 ответов

Проблема

Flexbox делает центрирование очень простым.

Просто применяя align-items: center и justify-content: center к контейнеру flex, ваши (-ые) элементы (-ы) будут вертикально и

Однако существует проблема с этим методом, когда элемент гибкости больше, чем гибкий контейнер.

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

Для горизонтального переполнения левая часть становится недоступной (или правой секцией в языках RTL).

Вот пример с контейнером LTR, имеющим justify-content: center и три элемента гибкости:

См. нижнюю часть этого ответа для объяснение этого поведения.


Решение № 1

Чтобы исправить эту проблему, используйте автоматические поля flexbox вместо justify-content .

С полями auto переполненный элемент гибкости может быть вертикально и горизонтально центрирован, не теряя доступа к какой-либо его части.

[g2 8] Таким образом, вместо этого кода на контейнере flex:

#flex-container {
    align-items: center;
    justify-content: center;
}

Используйте этот код для элемента flex:

.flex-item {
    margin: auto;
}

Revised Demo


Решение № 2 (еще не реализовано в большинстве браузеров)

Добавьте значение safe в ваше ключевое слово правило выравнивания:

justify-content: safe center

или

align-self: safe center

Из спецификации модуля выравнивания CSS :

4.4. Выравнивание переполнения: ключевые слова safe и unsafe и ограничения безопасности прокрутки

Когда элемент [flex item] больше, чем [flex container], он будет переполняться. Некоторые режимы выравнивания, если они соблюдены в этой ситуации, могут привести к потере данных: например, если содержимое боковой панели центрировано, когда они переполняются, они могут отправлять часть своих полей за край начала окна просмотра, которые нельзя прокрутить до .

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

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

safe

Если размер [flex item] переполняет контейнер [flex], а [гибкий элемент] выравнивается так, как если бы режим выравнивания был [flex-start].

unsafe

Независимо от относительных размеров [гибкого элемента] и [гибкого контейнера] данное значение выравнивания соблюдается.

Примечание. Модуль выравнивания ящиков используется для нескольких моделей макета коробки, а не только для гибких. Таким образом, в вышеприведенном отрезке spec термины в скобках фактически говорят «объект выравнивания», «контейнер выравнивания» и «start». Я использовал термины, специфичные для Flex, чтобы сосредоточиться на этой конкретной проблеме.


Объяснение для ограничения прокрутки из MDN:

Flex соображения элемента

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

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

В будущей версии свойства выравнивания будут расширены, чтобы иметь также «безопасный» вариант.

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

Вместо использования свойств align- просто поместите поля auto на объекты гибкости, которые хотите центрировать.

Вместо свойств justify- поместите автоматические поля на внешние границы первого и последнего элементов гибкости в контейнере гибкого диска.

Поля auto будут «гибкими» и предполагают оставшееся пространство, центрируя элементы гибкости, когда есть оставшееся пространство, и переключение на нормальное выравнивание, когда нет.

Однако, если вы пытаетесь заменить justify-content центрированием на основе полей в многострочном flexbox, вам, вероятно, не повезло, так как вам нужно поставить поля на первом и последнем элементе гибкости на каждой строке. Если вы не сможете заранее предсказать, какие элементы попадут на какую строку, вы не можете надежно использовать центрирование на основе маркеров на главной оси, чтобы заменить свойство justify-content.

228
ответ дан Michael_B 18 August 2018 в 12:10
поделиться
  • 1
    Да, это лучшее решение, и спасибо за предоставленную дополнительную ценную информацию. – jejacks0n 2 November 2015 в 00:06
  • 2
    Следует отметить, что это не работает в IE11. Фон будет отключен. – Daniel 7 June 2017 в 08:02
  • 3
    @ Даниэль, я просто проверил код в IE11. Ничто не недоступно. На самом деле проблема, описанная в вопросе, даже не существует в IE11. Вы можете ссылаться на переполнение текста, происходящее только в IE11. Это еще одна проблема для другого вопроса. – Michael_B 7 June 2017 в 18:26
  • 4
    Чтобы устранить проблему в IE11: добавьте align-items: flex-start в контейнер flex и сохраните margin: auto для гибкого элемента. – Eugene Fidelin 31 July 2017 в 08:10
  • 5
    Если кто-либо еще в IE11 борется с высотой контейнера, не распространяющейся на всю высоту контента. Добавление flex: 0 0 auto к элементу flex фиксировало его для меня. – james.brndwgn 28 September 2017 в 08:07

Согласно MDN, теперь значение safe может быть предоставлено таким свойствам, как align-items и justify-content . Это описано следующим образом:

Если размер элемента переполняет контейнер выравнивания, элемент выравнивается, как если бы режим выравнивания был start.

Таким образом, он может быть использован следующим образом.

.rule
{
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: safe center;
}

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

1
ответ дан Chris Talman 18 August 2018 в 12:10
поделиться
  • 1
    7 июня 2018 года и до сих пор не реализованы в хроме. – TechJS 7 June 2018 в 15:26

Мне удалось снять это с помощью всего лишь 3 контейнеров. Хитрость заключается в том, чтобы отделить контейнер flexbox от контейнера, который контролирует прокрутку. Наконец, поместите все в корневой контейнер, чтобы сосредоточить все это. Вот основные стили для создания эффекта:

CSS:

.root {
  display: flex;
  justify-content: center;
  align-items: center;
}

.scroll-container {
  margin: auto;
  max-height: 100%;
  overflow: auto;
}

.flex-container {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

HTML:

<div class="root">
  <div class="scroll-container">
    <div class="flex-container">
      <p>Lorem ipsum dolor sit amet.</p>
    </div>
  </div>
</div>

Здесь я создал демо: https://jsfiddle.net/r5jxtgba/14/

8
ответ дан Community 18 August 2018 в 12:10
поделиться
  • 1
    thx для подсказок прокрутки-контейнера, я обыскал с двух дней для исправления моего содержимого прокрутки ***** !!! – artSx 9 February 2018 в 18:34
  • 2
    max-height:100% решил мою проблему. – jerone 4 June 2018 в 08:00
  • 3
    помните, не давайте flex: 1 1 auto в scroll-container. Я делал это по привычке и попадал в проблему. – TechJS 7 June 2018 в 15:24

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

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

http://caniuse.com/#feat=intrinsic-width

Добавление min-height: min-content в область flexbox устраняет проблему в Chrome, а с префиксами поставщиков также исправляются Opera и Safari, хотя Firefox остается неразрешенным.

min-height: -moz-min-content; // not implemented
min-height: -webkit-min-content // works for opera and safari
min-height: min-content // works for chrome

для идей по Firefox и других потенциальных решений.

13
ответ дан jejacks0n 18 August 2018 в 12:10
поделиться
  • 1
    Я просто хотел сказать, что он уже работает для меня в Firefox. Таким образом, решение с минимальным содержанием было идеальным. – pudgereyem 11 April 2017 в 09:52
  • 2
    @pudgereyem Я предполагаю, что они это реализовали. Другое решение с margin: auto останавливает flex-basis от работы для меня, тогда как этот ответ решает обе проблемы. – Martin Dawson 11 February 2018 в 17:04
  • 3
    Действительно блестящее решение. Меня не волнует Edge или IE, так что это отлично работает для меня! – Ohgodwhy 9 May 2018 в 15:22

Я думаю, что нашел решение. Он работает с множеством текста и небольшим текстом . Вам не нужно указывать ширину чего-либо, и он должен работать в IE8.

.wrap1 {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.5);
  overflow-y: auto;
}
.wrap2 {
  display: table;
  width: 100%;
  height: 100%;
  text-align: center;
}
.wrap3 {
  vertical-align: middle;
  display: table-cell;
}
.wrap4 {
  margin: 10px;
}
.dialog {
  text-align: left;
  background-color: white;
  padding: 5px;
  border-radius: 3px;
  margin: auto;
  display: inline-block;
  box-shadow: 2px 2px 4px rgba(0, 0, 0, .5);
}
<div class="wrap1">
  <div class="wrap2">
    <div class="wrap3">
      <div class="wrap4">
        <div class="dialog">
          <p>Lorem ipsum dolor sit amet.</p>
        </div>
      </div>
    </div>
  </div>
</div>

3
ответ дан mpen 18 August 2018 в 12:10
поделиться
0
ответ дан Nadeesh Peiris 30 October 2018 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: