看这个例子
.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>
上他们应该的元素。但是...... h1 并没有覆盖所有静态 <p>
粘性下方的元素 <h2>
. 'non-overlapping' 的量正好是底部边距(0.83em
至少在 FF 和 Chrome 上是这样)。
据我所知,我只能通过分配 margin-bottom: 0
来防止这个问题。到 <h2>
.但我不想要那样,因为那样我就失去了 margin 崩溃与以下 <p>
元素。 (是的,我知道,我可以以某种方式解决这个问题,但我拒绝这样做)
<h2>
已经折叠了 margin-top
与部分(如果有定义),只要该元素不是'粘性',但它具有非折叠margin-bottom
,如果滚动,则它是粘性的。
margin-collapse,当 不粘时
当 是粘性的
时没有 margin-collapse
- 为什么会这样?
- 规范中是这样的吗?
- 谁决定的?
- 这对我现在想不出的任何情况都有用吗?
- 有没有不涉及设置
margin-bottom
的解决方法?的<h2>
归零?
最佳答案
是的,它在规范中:https://www.w3.org/TR/css-position-3/#sticky-pos .
相关部分如下:
When computing containement of the stickily positioned element within its containing block, margins on the stickily positioned element are taken into account.
这在某种程度上是合乎逻辑的,因为我们的粘性元素将表现为相对的,它的边距会影响包含 block 的高度,因此也应该考虑到这一点。
考虑粘性元素是包含 block 内唯一元素的示例
.wrapper {
border:2px solid;
}
.wrapper > div {
position:sticky;
top:0;
height:50px;
margin-bottom:150vh;
background:red;
}
<div class="wrapper">
<div></div>
</div>
在这种情况下应该没有粘性行为,因为我们的元素(及其边距)已经接触到包含 block 的边缘。
这就是说,一种解决方法是在视觉上增加元素的空间,同时保持其他元素之间的距离相同。为此,我们添加了一个具有特定高度的隐藏元素,并使用负边距进行校正。
这是一个例子:
.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>
您应该只注意涉及最后一个子元素的边距折叠的复杂情况,因为添加这个额外的元素会禁用它。您可能需要增加更多负边距。
关于css - 为什么 margin 用于粘性定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55629815/