Почему маржа используется для липкого позиционирования - PullRequest
1 голос
/ 11 апреля 2019

См. Этот пример

.container {
  width: 500px;
  margin: auto;
}

.container section h2 {
  position: sticky;
  top: 0;
  bottom: 0;
  padding-top: calc(1em / 6 * 5);
  padding-bottom: calc(1em / 6 * 5);
  background-color: #fff;
}
<div class="container">
  <section>
    <h2>Lorem, ipsum dolor.</h2>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Commodi perferendis animi sint ducimus ullam earum aliquid consequatur dolores delectus. Ex unde mollitia placeat vitae incidunt voluptatibus qui earum deleniti cupiditate.</p>
    <p>Delectus tenetur alias numquam magni! Magnam perspiciatis ducimus vero facere, totam non odit accusamus nisi dicta deserunt distinctio minus rerum maiores magni, eligendi vitae, a omnis autem deleniti quaerat officiis.</p>
    <p>At iusto architecto aut laudantium nisi quod praesentium dolorem delectus repudiandae soluta enim consequatur porro, quam nemo cumque sint aspernatur laborum deleniti. Molestiae, dolor saepe quisquam suscipit quod aliquid dolore.</p>
    <p>Autem perspiciatis ipsam molestias inventore nulla? Nostrum voluptatibus unde autem est. Minus quam molestias ullam cupiditate laborum eius. Nulla unde repellat mollitia dolore aliquam aspernatur velit sit dolorem quibusdam repudiandae.</p>
    <p>Illum dicta inventore, adipisci veritatis nobis placeat ab quas nihil est, incidunt reprehenderit quibusdam odio non autem expedita ex quos dolorum? Et fuga facere obcaecati laborum fugiat praesentium, aliquid in.</p>
  </section>
  <section>
    <h2>Quisquam, consequuntur quibusdam.</h2>
    <p>Similique quas impedit est iure quisquam! Hic cumque illo ipsam, itaque fugiat, et commodi enim aliquam quos minima nihil quae sapiente vero amet magni. Ipsum sint maiores necessitatibus eos optio!</p>
    <p>Odit, assumenda. Non harum perspiciatis delectus sint, molestias nostrum laboriosam labore accusantium mollitia assumenda officia omnis rerum dolorum veritatis impedit sapiente, ea, reprehenderit voluptatem! Minus dolor aspernatur illo velit sit.</p>
    <p>Recusandae qui repellat debitis non aliquam ea quod quam, magnam ipsum placeat vitae? Ut, nisi eos consequatur voluptatibus sit nulla corporis omnis quae repellendus, voluptates sapiente, labore quibusdam deleniti molestias.</p>
    <p>Assumenda dolor ex, numquam reprehenderit ipsa, nihil aperiam reiciendis aliquam eaque et harum mollitia fugit amet repellendus! Suscipit, veritatis cum. Corporis saepe, adipisci officia numquam obcaecati voluptatem. Fugit, amet quia!</p>
    <p>Fugiat, quaerat harum id aliquam repellat dolor assumenda eos provident reprehenderit excepturi! Tempore nisi animi sequi repellat perferendis deserunt incidunt natus quae harum minima, fuga id repellendus? Amet, beatae accusamus?</p>
  </section>
  <section>
    <h2>Eos, harum nobis.</h2>
    <p>Delectus, eius provident vel hic veritatis quidem cumque unde ratione quia eaque non iusto. Ad veniam quidem molestias minima, labore, pariatur, tempore qui sequi quaerat suscipit itaque animi adipisci tempora!</p>
    <p>Atque dolor earum distinctio sit labore quae, animi pariatur quibusdam voluptatem velit. Quisquam ad, cum repellendus enim illo esse dolor qui perferendis voluptate in, beatae aspernatur at doloremque exercitationem assumenda.</p>
    <p>Sunt unde veritatis repudiandae culpa ipsum. Vero ipsam eveniet voluptatum quis, necessitatibus adipisci nisi, ad excepturi mollitia temporibus eaque repellendus blanditiis rerum itaque, consequatur ea eligendi ullam nam officia. Veniam.</p>
    <p>Nihil vitae aut magni, repellat itaque consequatur corporis praesentium libero aperiam quasi ea quaerat quisquam, repudiandae quis ipsam ratione totam quod? Quasi, debitis! Harum illo exercitationem totam debitis sunt nulla!</p>
    <p>Pariatur ex est hic nesciunt ullam et molestias ducimus consectetur, odio maxime voluptas quos magnam asperiores, quaerat totam facilis perspiciatis id ut facere nam doloremque quis dolores distinctio iure! Nobis.</p>
  </section>
  <section>
    <h2>Minima, magni minus.</h2>
    <p>Rem ullam doloribus voluptatem suscipit minima perspiciatis adipisci, iure dolorem? Voluptatibus vitae nulla repudiandae consequatur ut culpa rem magni quia fugiat provident quae explicabo recusandae non rerum, saepe porro. Dolorum?</p>
    <p>Mollitia amet neque architecto necessitatibus reiciendis earum esse veritatis, sunt magni repudiandae animi asperiores eligendi veniam non, nam quis, nobis aspernatur odit modi sapiente velit? Eum quis facere quidem esse!</p>
    <p>Ea omnis atque similique reiciendis, incidunt voluptatem aliquam totam qui temporibus velit distinctio corrupti excepturi, cupiditate fuga optio natus illo aut obcaecati minima sint, dolorum provident? Architecto nisi iure debitis.</p>
    <p>Odit impedit cum magnam pariatur corporis voluptatum numquam quae rerum qui nesciunt, architecto, voluptas culpa dolore doloremque. Eius vitae quasi corporis ipsum facilis voluptate. Beatae repellat molestiae eum autem nobis.</p>
    <p>Nulla consectetur, recusandae error dolorum ad enim vel placeat esse, voluptatum est, et dignissimos autem laudantium ut. Neque voluptate vitae quasi veniam dolore excepturi, atque exercitationem in nihil eius velit.</p>
  </section>
</div>

Если вы прокрутите вниз, вы увидите, что все элементы <h2> привязаны к содержащим элементам <section>, как и следовало бы. Но & hellip; h1 не перекрывает все статические элементы <p> ниже закрепленного <h2>. Сумма «не перекрывающихся» - это как раз нижняя граница (0.83em по крайней мере для FF и Chrome).

image over

because of margin-bottom if

">

Насколько я могу судить, я могу предотвратить эту проблему, назначив margin-bottom: 0 на <h2>. Но я не хочу этого, потому что тогда я теряю разрушение полей со следующими <p> элементами. (Да, я знаю, я мог бы как-то обойти это, но я отказываюсь)

У <h2> сворачивается margin-top с разделом (если он есть), если элемент не является «липким» , но у него не сворачивается margin-bottom, если прокручивается, чтобы он был липким.

Падение маржи, когда НЕ является липким

image is NOT sticky">

Нет разрыва полей, когда СЛИШКОМ

image IS sticky">

  1. Почему это происходит?
  2. Это так в спецификации?
  3. Кто решил это?
  4. Это полезно в любом случае, о котором я сейчас не могу думать?
  5. Есть ли обходной путь, который не включает установку margin-bottom из <h2> в ноль?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Да, это в спецификации здесь: https://www.w3.org/TR/css-position-3/#sticky-pos.

Вот соответствующая часть:

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

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

Рассмотрим пример, в котором липкий элемент является единственным элементом внутри содержащего блока

.wrapper {
  border:2px solid;
}

.wrapper > div {
  position:sticky;
  top:0;
  height:50px;
  margin-bottom:150vh;
  background:red;
}
<div class="wrapper">
  <div></div>
</div>

В этом случае не должно быть залипания, потому что наш элемент (с его полем) уже касается края содержащего блока.


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

Вот пример:

.container {
  width: 500px;
  margin: auto;
}

.container section h2 {
  position: sticky;
  top: 0;
  bottom: 0;
  padding-top: calc(1em / 6 * 5);
  padding-bottom: calc(1em / 6 * 5);
  background-color: #fff;
}

.container section {
  margin-bottom:calc(1.5 * -0.83em);
}
.container section:after {
  content:"";
  display:block;
  font-size: 1.5em;
  height:0.83em;
}
<div class="container">
  <section>
    <h2>Lorem, ipsum dolor.</h2>
    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Commodi perferendis animi sint ducimus ullam earum aliquid consequatur dolores delectus. Ex unde mollitia placeat vitae incidunt voluptatibus qui earum deleniti cupiditate.</p>
    <p>Delectus tenetur alias numquam magni! Magnam perspiciatis ducimus vero facere, totam non odit accusamus nisi dicta deserunt distinctio minus rerum maiores magni, eligendi vitae, a omnis autem deleniti quaerat officiis.</p>
    <p>At iusto architecto aut laudantium nisi quod praesentium dolorem delectus repudiandae soluta enim consequatur porro, quam nemo cumque sint aspernatur laborum deleniti. Molestiae, dolor saepe quisquam suscipit quod aliquid dolore.</p>
    <p>Autem perspiciatis ipsam molestias inventore nulla? Nostrum voluptatibus unde autem est. Minus quam molestias ullam cupiditate laborum eius. Nulla unde repellat mollitia dolore aliquam aspernatur velit sit dolorem quibusdam repudiandae.</p>
    <p>Illum dicta inventore, adipisci veritatis nobis placeat ab quas nihil est, incidunt reprehenderit quibusdam odio non autem expedita ex quos dolorum? Et fuga facere obcaecati laborum fugiat praesentium, aliquid in.</p>
  </section>
  <section>
    <h2>Quisquam, consequuntur quibusdam.</h2>
    <p>Similique quas impedit est iure quisquam! Hic cumque illo ipsam, itaque fugiat, et commodi enim aliquam quos minima nihil quae sapiente vero amet magni. Ipsum sint maiores necessitatibus eos optio!</p>
    <p>Odit, assumenda. Non harum perspiciatis delectus sint, molestias nostrum laboriosam labore accusantium mollitia assumenda officia omnis rerum dolorum veritatis impedit sapiente, ea, reprehenderit voluptatem! Minus dolor aspernatur illo velit sit.</p>
    <p>Recusandae qui repellat debitis non aliquam ea quod quam, magnam ipsum placeat vitae? Ut, nisi eos consequatur voluptatibus sit nulla corporis omnis quae repellendus, voluptates sapiente, labore quibusdam deleniti molestias.</p>
    <p>Assumenda dolor ex, numquam reprehenderit ipsa, nihil aperiam reiciendis aliquam eaque et harum mollitia fugit amet repellendus! Suscipit, veritatis cum. Corporis saepe, adipisci officia numquam obcaecati voluptatem. Fugit, amet quia!</p>
    <p>Fugiat, quaerat harum id aliquam repellat dolor assumenda eos provident reprehenderit excepturi! Tempore nisi animi sequi repellat perferendis deserunt incidunt natus quae harum minima, fuga id repellendus? Amet, beatae accusamus?</p>
  </section>
  <section>
    <h2>Eos, harum nobis.</h2>
    <p>Delectus, eius provident vel hic veritatis quidem cumque unde ratione quia eaque non iusto. Ad veniam quidem molestias minima, labore, pariatur, tempore qui sequi quaerat suscipit itaque animi adipisci tempora!</p>
    <p>Atque dolor earum distinctio sit labore quae, animi pariatur quibusdam voluptatem velit. Quisquam ad, cum repellendus enim illo esse dolor qui perferendis voluptate in, beatae aspernatur at doloremque exercitationem assumenda.</p>
    <p>Sunt unde veritatis repudiandae culpa ipsum. Vero ipsam eveniet voluptatum quis, necessitatibus adipisci nisi, ad excepturi mollitia temporibus eaque repellendus blanditiis rerum itaque, consequatur ea eligendi ullam nam officia. Veniam.</p>
    <p>Nihil vitae aut magni, repellat itaque consequatur corporis praesentium libero aperiam quasi ea quaerat quisquam, repudiandae quis ipsam ratione totam quod? Quasi, debitis! Harum illo exercitationem totam debitis sunt nulla!</p>
    <p>Pariatur ex est hic nesciunt ullam et molestias ducimus consectetur, odio maxime voluptas quos magnam asperiores, quaerat totam facilis perspiciatis id ut facere nam doloremque quis dolores distinctio iure! Nobis.</p>
  </section>
  <section>
    <h2>Minima, magni minus.</h2>
    <p>Rem ullam doloribus voluptatem suscipit minima perspiciatis adipisci, iure dolorem? Voluptatibus vitae nulla repudiandae consequatur ut culpa rem magni quia fugiat provident quae explicabo recusandae non rerum, saepe porro. Dolorum?</p>
    <p>Mollitia amet neque architecto necessitatibus reiciendis earum esse veritatis, sunt magni repudiandae animi asperiores eligendi veniam non, nam quis, nobis aspernatur odit modi sapiente velit? Eum quis facere quidem esse!</p>
    <p>Ea omnis atque similique reiciendis, incidunt voluptatem aliquam totam qui temporibus velit distinctio corrupti excepturi, cupiditate fuga optio natus illo aut obcaecati minima sint, dolorum provident? Architecto nisi iure debitis.</p>
    <p>Odit impedit cum magnam pariatur corporis voluptatum numquam quae rerum qui nesciunt, architecto, voluptas culpa dolore doloremque. Eius vitae quasi corporis ipsum facilis voluptate. Beatae repellat molestiae eum autem nobis.</p>
    <p>Nulla consectetur, recusandae error dolorum ad enim vel placeat esse, voluptatum est, et dignissimos autem laudantium ut. Neque voluptate vitae quasi veniam dolore excepturi, atque exercitationem in nihil eius velit.</p>
  </section>
</div>

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

0 голосов
/ 11 апреля 2019

Посмотрите на мой скриншот, чтобы понять, почему ваши h2 не идут выше вашей последней строки.

Здесь синим цветом вы можете видеть вас <section>

enter image description here

А вот твой h2

enter image description here

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

РЕДАКТИРОВАТЬ: Если вам нужно абсолютно это место под h2, вы можете поставить margin-top на первое <p> после h2 ...

h2 + p:first-of-type{
  margin-top:10px;
}
...