Ширина CSS и поля не совпадают с медиа-запросом - PullRequest
2 голосов
/ 01 октября 2019

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

Я получил это, работая с комбинацией max-width и медиазапрос, чтобы установить поля на определенный порог. Я попытался сложить вместе max-width и фиксированные margin-left и margin-right, но это не удалось.

Итак, я решил использовать приведенное ниже решение, где у меня есть max-width в сочетании с margin-left: auto; margin-right: auto и отдельно у меня есть медиа-запрос, в котором я задаю margin-left: 2em; margin-right; 2em.

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

Я ожидаю, что с max-width: 55em; для моего контента и медиа-запросом, который набирает (max-width: 59em) и поля на любомсторона 2em, что должен быть плавный переход с текстом, никогда не касающимся границы окна.

С версией ниже, я добираюсь до точки перехода, где текст касается края окна длядиапазон размера до того, как поля вступят в силу, и текст отводится от края. Я полагал, что 55 + 4 = 59, и поэтому в 59 я получаю 4em общее количество границ, и текст должен отступить от края в этой точке, поскольку я изменяю размер моего окна меньше;этого не происходит.

.container {
  margin-left: auto;
  margin-right: auto;
  max-width: 55em;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}

@media screen and (max-width: 59em) {
  .container {
    margin-left: 2em;
    margin-right: 2em;
  }
}

.container {
  margin-left: auto;
  margin-right: auto;
  max-width: 55em;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}

@media screen and (max-width: 59em) {
  .container {
    margin-left: 2em;
    margin-right: 2em;
  }
}
<div class="container">
  <div class="content">
    <article>
      Here is a nice long paragraph which should
      certainly hit the wrap limit.
      It should do this because it is a long paragraph,
      with more words and characters than fit in the
      maximum width configured for this page.
      I have written multiple sentences in a row, to
      ensure that this will take ample screen space horizontally.
      I am good at writing like this.
    </article>
  </div>
</div>

Значение, которое работает, как я намереваюсь, ниже, и вы можете увидеть версию здесь . Здесь у меня все тоже самое, кроме медиазапроса: (max-width: 80em). Я попал сюда чисто путем угадывания и проверки. Если я изменю размеры моего окна вниз, я вижу плавный переход, при котором текст никогда не приближается к границе окна или не касается ее.

.container {
  margin-left: auto;
  margin-right: auto;
  max-width: 55em;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}

@media screen and (max-width: 80em) {
  .container {
    margin-left: 2em;
    margin-right: 2em;
  }
}

.container {
  margin-left: auto;
  margin-right: auto;
  max-width: 55em;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}

@media screen and (max-width: 80em) {
  .container {
    margin-left: 2em;
    margin-right: 2em;
  }
}
<div class="container">
  <div class="content">
    <article>
      Here is a nice long paragraph which should
      certainly hit the wrap limit.
      It should do this because it is a long paragraph,
      with more words and characters than fit in the
      maximum width configured for this page.
      I have written multiple sentences in a row, to
      ensure that this will take ample screen space horizontally.
      I am good at writing like this.
    </article>
  </div>
</div>

Итак, мой вопрос один, несколько или все из нижеприведенного:

  1. Что я здесь не так делаю?
  2. Какая математика дает 80-4 = 55?
  3. Как достичь этой цели вместо этого?

Редактировать: Добавление некоторыхGIFS, потому что я плохо объяснил это.

Здесь плохо: обратите внимание, что есть период времени, когда я изменяю размер, когда текст сталкивается с границей окна. Я не хочу этогоЯ ожидаю, что поля 2x2em, которые входят в ширину 59em, должны начать действовать. Вместо этого, во время изменения размера есть период (или некоторая совокупность окон определенного размера), когда текст ударяется о границу окна.

bad margin behavior

И вот хороший вариант. Это медиа-запрос с max-width: 80em. Это поведение, которое я хочу. Посмотрите, как текст никогда не попадает на границу окна, просто плавно начинает отступать от него. 80em - это магическое число (по крайней мере, для меня, когда я смотрю из нескольких браузеров на моем рабочем столе - я не знаю, является ли это проблемой для меня). Меньше, и я получаю текст, приближающийся к границе, и затем он привязывается к моим полям 2em. Больше, и он выровнен по левому краю, а не по центру.

good margin behavior

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

А как же ...

* {
  box-sizing: border-box;
  /* https://www.paulirish.com/2012/box-sizing-border-box-ftw/ */
}

.container {
  width: 100%;
  max-width: 800px;
  margin-left: auto;
  margin-right: auto;
  padding: 20px;
  border: 1px solid red;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}

@media screen and (min-width: 900px) {
  .container {
    /* something else */
  }
}
<section class="container">
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eum, doloremque iste sequi est autem officia asperiores, illo, vero reiciendis incidunt provident itaque laborum quidem! Aut nisi eaque a itaque numquam.</p>
</section>

Возможно, это проблема с рамкой ....

https://www.paulirish.com/2012/box-sizing-border-box-ftw/

2 голосов
/ 01 октября 2019
  1. Что я здесь не так делаю?

  2. Какая математика дает 80-4 = 55?

Основная проблема заключается в том, что медиа-запрос использует стиль документа, а не класс container. Это означает, что 1em в запросе отличается от 1em в container div. Например, этот фрагмент использует тот же стиль для текста, который используется в документе, поэтому он работает. Обратите внимание, что я также установил поле body в 0, потому что поле тела также включено в медиа-запрос. Это решение, как я уверен, вы согласитесь, не является желаемым результатом.

Не очень хорошая версия

.container {
  margin-left: auto;
  margin-right: auto;
  max-width: 55em;
  text-align: justify;
}

@media screen and (max-width: 59em) {
  .container {
    margin-left: 2em;
    margin-right: 2em;
  }
}

body {
  margin: 0;
}
<div class="container">
  <div class="content">
    <article>
      Here is a nice long paragraph which should
      certainly hit the wrap limit.
      It should do this because it is a long paragraph,
      with more words and characters than fit in the
      maximum width configured for this page.
      I have written multiple sentences in a row, to
      ensure that this will take ample screen space horizontally.
      I am good at writing like this.
    </article>
  </div>
</div>
Как достичь этой цели?

Вместо этого я бы порекомендовал flexbox. Установите стиль класса container равным

display: flex;
justify-content: center;

и переместите другой стиль в класс content. Установите поле класса content равным auto 2em. (см. фрагмент ниже)

Хорошая версия Flexbox

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

.content {
  margin: auto 2em;
  max-width: 55em;
  font-family: monospace;
  font-size: 16pt;
  line-height: 1.3;
  text-align: justify;
}
<div class="container">
  <div class="content">
    <article>
      Here is a nice long paragraph which should
      certainly hit the wrap limit.
      It should do this because it is a long paragraph,
      with more words and characters than fit in the
      maximum width configured for this page.
      I have written multiple sentences in a row, to
      ensure that this will take ample screen space horizontally.
      I am good at writing like this.
    </article>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...