"位置:粘;" 不工作的CSS和HTML

Har*_*oc1 130 html css

一旦我滚动到它,我想让导航栏坚持到顶部,但它不起作用,我不知道为什么.如果可以请求帮助,这是我的HTML和CSS代码:

.nav-selections {
        text-transform: uppercase;
        letter-spacing: 5px;
        font: 18px "lato",sans-serif;
        display: inline-block;
        text-decoration: none;
        color: white;
        padding: 18px;
        float: right;
        margin-left: 50px;
        transition: 1.5s;
    }

        .nav-selections:hover{
            transition: 1.5s;
            color: black;
        }

    ul {
        background-color: #B79b58;
        overflow: auto;
    }

    li {
        list-style-type: none;
    }
Run Code Online (Sandbox Code Playgroud)
<nav style="position: sticky; position: -webkit-sticky;">
        <ul align="left">
            <li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
            <li><a href="#/about" class="nav-selections">About</a></li>
            <li><a href="#/products" class="nav-selections">Products</a></li>
            <li><a href="#" class="nav-selections">Home</a></li>
        </ul>
    </nav>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ack 243

检查祖先元素是否有溢出集(例如overflow:hidden); 尝试切换它.你可能不得不高出你期望的DOM树=).

这可能会影响您position:sticky的后代元素.

  • 希望我可以多次投票!这比我想承认的更频繁地咬我. (22认同)
  • 如果您需要检查 `overflow:hidden`,您可以在浏览器控制台中运行此脚本来检查给定元素的所有父/祖先:https://gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7 (6认同)
  • 我错过了**"父元素"中的"s"** (5认同)
  • 我也错过了“ s” :(这就是问题所在。在许多地方,人们写道您应该只检查父母而不是所有父母。我通过检查是否调用`$(stickyElement).parents()。css( Web控制台中的“ overflow”,“ visible”)会有所帮助,然后我找到了导致问题的`overflow:hidden`样式的远处父母,希望我能仔细阅读此答案。 (4认同)
  • 这是正确的答案。但是,可能很难找到哪个父元素引起了问题。我编写了一个jquery脚本,以帮助识别已识别问题的父母的溢出属性(只需在您的控制台中运行它)。因为脚本只有几行,所以我添加了一个包含以下脚本的答案。 (2认同)

Mar*_*vin 140

粘性定位是相对定位和固定定位的混合.该元素被视为相对位置,直到它超过指定的阈值,此时它被视为固定位置.
...
您必须具有至少一个指定的阈值top,right,bottom,或left为粘稠定位像预期的那样.否则,它将与相对定位无法区分.[ 来源:MDN ]

因此,在您的示例中,您必须使用top属性定义最终应该保留的位置.

html, body {
  height: 200%;
}

nav {
  position: sticky;
  position: -webkit-sticky;
  top: 0; /* required */
}

.nav-selections {
  text-transform: uppercase;
  letter-spacing: 5px;
  font: 18px "lato", sans-serif;
  display: inline-block;
  text-decoration: none;
  color: white;
  padding: 18px;
  float: right;
  margin-left: 50px;
  transition: 1.5s;
}

.nav-selections:hover {
  transition: 1.5s;
  color: black;
}

ul {
  background-color: #B79b58;
  overflow: auto;
}

li {
  list-style-type: none;
}
Run Code Online (Sandbox Code Playgroud)
<nav>
  <ul align="left">
    <li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
    <li><a href="#/about" class="nav-selections">About</a></li>
    <li><a href="#/products" class="nav-selections">Products</a></li>
    <li><a href="#" class="nav-selections">Home</a></li>
  </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,这个答案不足以粘上去工作,父也不应该有溢出属性. (80认同)
  • 我认为诀窍是位置粘性只能应用于属于具有已知高度的可滚动父级的子级,(flexbox 中的直接子级具有从其他 flex-item 计算的已知高度) (2认同)

小智 80

我有同样的问题,我在这里找到答案.

如果您的元素没有按预期粘贴,首先要检查的是应用于容器的规则.

具体来说,查找父级上设置的任何溢出属性.您不能使用:overflow: hidden,overflow: scrolloverflow: autoposition: sticky元素的父元素上.

  • [API](https://developer.mozilla.org/en-US/docs/Web/CSS/position) 中的 `position: Sticky` 示例实际上是 `overflow: auto` 容器内的一个元素。难道“position:sticky”的全部意义不就是存在于滚动容器中吗?这个答案让我很困惑。 (13认同)
  • 您不仅应该检查最近的父容器,还应该检查所有父元素** s **。 (7认同)
  • 注意:不幸的是,对于垂直放置的粘性项目,“overflow-x”也会打破平衡。 (4认同)
  • 该链接也对我有帮助。我的问题是通过“...如果您没有使用溢出并且仍然遇到问题,则值得检查是否在父级上设置了高度...” (2认同)

小智 44

如果您遇到此问题并且您的粘性不起作用 - 尝试将父级设置为:

display: unset
Run Code Online (Sandbox Code Playgroud)

为我工作

  • 哦!这似乎是针对父元素具有有限高度的情况的解决方法(例如,导航栏容器或其他东西,而不是整个主体或页面容器) - 便利贴似乎不喜欢滚动到其之外父母(这完全是荒谬的!)现在每个人都需要足够幸运才能将父母设置为“显示:未设置”,这可能并不总是立即可行 (2认同)
  • 似乎也适用于“内容”、“初始”(?)和“内联” (2认同)
  • 假设这个“有效”,因为“overflow”属性不适用于内联元素(由于某种原因,当设置为“display:initial”(或“unset”)时,“div”元素就是“div”元素) (2认同)

Bad*_*ash 26

position: sticky另一个可能不起作用的非常常见的情况是,如果它的父级有display: flexdisplay: grid

在这种情况下发生的情况是粘性位置正在工作,但你看不到它,因为元素被完全拉伸。尝试使用降低其高度align-self: baseline,您会看到效果。


Sim*_*ver 25

我遇到的事情很少:

当你的粘性元素是一个组件(角等)

  • 如果'sticky'元素本身是具有自定义元素选择器的组件,例如名为的角度组件<app-menu-bar>,则需要将以下内容添加到组件的css中:

    :host { display: block; }   
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    app-menu-bar  { display: block; }   // (in the containing component's css)
    
    Run Code Online (Sandbox Code Playgroud)

    特别是iOS上的Safari似乎display:block甚至需要app-root角度应用程序的根元素,否则它将不会粘连.

  • 如果要创建一个组件,定义组件内部的CSS(影子DOM /封装样式),确保position: sticky被应用到"外"选择(例如,app-menu-bar在devtools应显示粘的位置),而不是一个顶级div 组件.使用Angular,可以使用:host组件的css中的选择器来实现.

    :host
    {
        position: sticky;
        display: block;   // this is the same as shown above
        top: 0;
        background: red;    
    }
    
    Run Code Online (Sandbox Code Playgroud)

其他

  • 如果粘性元素后面的元素具有纯色背景,则必须添加以下内容以阻止其在下方滑动:

    .sticky-element { z-index: 100; }
    .parent-of-sticky-element { position: relative; }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您的粘性元素必须是第一个(在您的内容之前),如果使用top,则在使用之后bottom.

  • overflow: hidden在你的包装元素上使用会有一些复杂的问题- 通常它会杀死里面的粘性元素.在这个问题中解释得更好

  • 当屏幕键盘可见时,移动浏览器可以禁用粘滞/固定定位项目.我不确定确切的规则(有没有人知道)但是当键盘可见时你正在看窗口中的某种"窗口",你将无法轻易地将事情坚持到实际可见的屏幕顶部.

  • 确保你有:

    position: sticky;

    并不是

    display: sticky;

  • 只需`display: block`就足够了 (3认同)

Ezr*_*ton 20

从其他方向攻击这个Q。

想象这是一个游戏Find the nearest scrolling ancestor

<!-- sticky not working -->
<h1 style="position: sticky; top:0;">Hello World</h1>
Run Code Online (Sandbox Code Playgroud)

问题:

  • 1/3:粘性节点?<h1>
  • 2/3:祖先?<body>
  • 3/3:<body>滚动?FALSE=>“没有效果”。

修复:“粘性正在工作”(<body>滚动?TRUE)。

body{
  min-height: 300vh;
}
Run Code Online (Sandbox Code Playgroud)
<!-- sticky working -->
<h1 style="position: sticky; top: 0;">Hello World</h1>
Run Code Online (Sandbox Code Playgroud)

考虑到这一点 - 这里有一些“你好世界”“著名”的“不工作”场景粘性:)大多数情况与这些情况中的一个或多个相关。

情况 1:缺少“顶部”(易于修复):

不工作:

/* not working example */
aside{
  position: sticky;
  background: lightgray;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<aside>
  <h2>sticky Aside</h2>
</aside>

<main>
  <h1>Article</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

修复(添加顶部):

aside{
  position: sticky;
  top: 0;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<aside>
  <h2>sticky Aside</h2>
</aside>

<main>
  <h1>Article</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

情况 2:粘性节点和溢出(易于修复):

#extra-wrapper我通过添加溢出设置“破坏”粘性条auto- 或hidden- 或visible- 但没有任何剪辑的内容。

“问题”现在是最近的滚动祖先(#extra-wrapper)“没有”任何滚动(没有滚动条拖动选项==“无滚动祖先”)。

不工作:

/* not working example */
#overflow-wrapper{
  overflow: scroll;
}

aside{
  position: sticky;
  background: lightgray;
  top: 0px;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="overflow-wrapper">
  <aside>
    <h2>sticky Aside</h2>
  </aside>

  <main>
    <h1>Article</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
    </p>
  </main>
</div>
Run Code Online (Sandbox Code Playgroud)

修复 - 剪辑内容(现在它们是“最近的滚动祖先”)。

在职的:

/* not working example */
#overflow-wrapper{
  overflow: scroll;
  max-height: 60vh; /* clip the content */
}

aside{
  position: sticky;
  background: lightgray;
  top: 0px;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="overflow-wrapper">
  <aside>
    <h2>sticky Aside</h2>
  </aside>

  <main>
    <h1>Article</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
    </p>
  </main>
</div>
Run Code Online (Sandbox Code Playgroud)

情况 3:与“错误/不滚动”节点相关的粘滞(很难修复)

同样,相对于其最近的滚动祖先的粘性偏移。

#extra-wrapper我通过添加到元素来“破坏”粘性sticky。为什么它不起作用?现在的高度#extra-wrapper==高度aside内容(盒模型)== “无滚动祖先” ==“无效果”。

不工作:

/* not working example */
aside{
  position: sticky;
  top: 0;
  background: lightgray;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="extra-wrapper">
  <aside>
    <h2>sticky Aside</h2>
  </aside>
</div>

<main>
  <h1>Article</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

这就是真正“发生”的事情(我添加了高度#extra-wrapper):

#extra-wrapper{
  background: lightgray;
  height: 40vh;
}
aside{
  position: sticky;
  top: 0;
}

main{
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="extra-wrapper">
  <aside>
    <h2>sticky Aside</h2>
  </aside>
</div>

<main>
  <h1>Article</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

修复:更改粘性节点:

#extra-wrapper{
  position: sticky;
  top: 0;
}
aside{

}

#layout{
  displ
}
main{
height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="extra-wrapper">
  <aside>
    <h2>sticky Aside</h2>
  </aside>
</div>

<main>
  <h1>Article</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

情况 4:显示:flexbox/Grid 布局 - 默认情况下甚至是列(很难修复)

您创建 Flex/Grid 布局并将其中一个列设置为sticky。默认情况下,列高度为偶数=“最近祖先”(包装器)的高度==列高度=无滚动效果。

不工作:

#extra-wrapper{
  position: sticky;
  top: 0;
  border: 1px solid red;
}
aside{

}

#layout{
  display: flex;
}
main{
height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="layout">
  <div id="extra-wrapper">
    <aside>
      <h2>sticky Aside</h2>
    </aside>
  </div>

  <main>
    <h1>Article</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
    </p>
  </main>
</div>
Run Code Online (Sandbox Code Playgroud)

修复:例如将粘性条放在一边max-height(现在列高度不均匀)。90vh

在职的:

#extra-wrapper{
  position: sticky;
  top: 0;
  border: 1px solid red;
  max-height: 90vh;
}
aside{

}

#layout{
  display: flex;
}
main{
height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<div id="layout">
  <div id="extra-wrapper">
    <aside>
      <h2>sticky Aside</h2>
    </aside>
  </div>

  <main>
    <h1>Article</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui dicta minus molestiae vel beatae natus eveniet ratione temporibus aperiam harum alias officiis assumenda officia quibusdam deleniti eos cupiditate dolore doloribus!
    </p>
  </main>
</div>
Run Code Online (Sandbox Code Playgroud)


dan*_*y74 18

这是MarsAndBack和Miftah Mizwar答案的延续.

他们的答案是对的.但是,很难确定问题的祖先.

为了使这非常简单,只需在浏览器控制台中运行此jQuery脚本,它将告诉您每个祖先的overflow属性的值.

$('.your-sticky-element').parents().filter(function() {
    console.log($(this));
    console.log($(this).css('overflow'));
    return $(this).css('overflow') === 'hidden';
});
Run Code Online (Sandbox Code Playgroud)

祖先没有overflow: visible改变其CSS的地方!

另外,如其他地方所述,请确保您的粘性元素在CSS中具有此功能:

.your-sticky-element {
    position: sticky;
    top: 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以运行不需要JQuery查找非"可见"溢出父级的代码片段:`var p = $ 0.parentElement; while(p!= null){var ov = getComputedStyle(p).overflow; if(ov!=='visible')console.warn(ov,p); else console.log(ov,p); p = p.parentElement; }``$ 0`是在开发人员工具中选择的[最后一个元素](https://developers.google.com/web/tools/chrome-devtools/console/utilities?utm_source=dcc&utm_medium=redirect&utm_campaign=2016q3#dom). (7认同)
  • 如果页面上没有jQuery,则可以在控制台中运行此小片段以添加它:`(async function(){let response = await fetch('https://code.jquery.com/jquery- 3.3.1.min.js');让脚本=等待response.text(); eval(script);})();` (3认同)
  • 那很有帮助。我能够快速识别出具有```overflow:invisible```值的父元素。 (2认同)

Zoh*_*Ali 9

Sticky如果您的父母使用 display ,则位置将不起作用flex。当我在一个解决方案中阅读此内容时

由于 flex box 元素默认拉伸,所有元素的高度相同,不能滚动。

因此,如果您display: flex;在父级上使用,则必须将其添加到粘性元素align-self: flex-start;并将高度设置为自动height: auto;

这是粘性元素类的样子

.stick-ontop {
  position: -webkit-sticky !important; // for safari
  position: sticky !important;
  top: 0;
  align-self: flex-start;
  height: auto;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

似乎要粘贴的导航栏不应该位于具有其他内容的任何 div 或部分内。在我将导航栏从导航栏与另一个顶栏共享的 div 中取出之前,没有任何解决方案对我有用。我以前用普通 div 包裹了顶栏和导航栏。


Uni*_*cco 7

我必须使用以下CSS使其正常工作:

.parent {
    display: flex;
    justify-content: space-around;
    align-items: flex-start;
    overflow: visible;
}

.sticky {
    position: sticky;
    position: -webkit-sticky;
    top: 0;
}
Run Code Online (Sandbox Code Playgroud)

如果以上都不起作用,那么...

遍历所有祖先并确保这些要素都没有overflow: hidden。您必须将其更改为overflow: visible

  • 显示:Flex 造就了它 (3认同)
  • 父 Flex 容器中的 `align-items: flex-start;` 是我缺少的东西 (2认同)

moh*_*d b 6

我知道已经太晚了。但我找到了一个解决方案,即使您在父元素中使用“overflow”或“display:flex”,“sticky”也会起作用

脚步:

  1. 为要设置粘性的元素创建一个父元素(确保创建的元素相对于 body 或全宽和全高父元素)。

  2. 将以下样式添加到父元素:

    { 位置:绝对;高度:100vmax;}

  3. 对于粘性元素,请确保添加高于页面中所有元素的 z-index。

就是这样!现在它必须起作用了。问候


des*_*ise 6

只是添加到此页面上的所有答案,如果您遇到position: sticky 无法工作的问题,那么您可以检查以下内容:

\n
    \n
  1. 浏览器支持
  2. \n
  3. 如果指定阈值 \xe2\x80\x94 即topleftbottom必须right 设置为除auto
  4. \n
  5. Safari/iOS v13 及以下版本的供应商前缀 \xe2\x80\x94 即position: -webkit-sticky
  6. \n
  7. overflow具有属性的祖先元素必须有高度
  8. \n
  9. 父元素必须指定高度(以便粘性元素具有可滚动的区域)
  10. \n
  11. 在弹性盒中,align-self如果粘性已设置align-self: autoalign-self: stretch已设置,则更改值
  12. \n
\n

我写了一篇关于此的博客文章,这对于有兴趣了解更多信息的人可能有用。

\n


G-C*_*Cyr 5

从我的评论:

position:sticky 需要一个coordonate 电话在哪里坚持

nav {
  position: sticky;
  top: 0;
}

.nav-selections {
  text-transform: uppercase;
  letter-spacing: 5px;
  font: 18px "lato", sans-serif;
  display: inline-block;
  text-decoration: none;
  color: white;
  padding: 18px;
  float: right;
  margin-left: 50px;
  transition: 1.5s;
}

.nav-selections:hover {
  transition: 1.5s;
  color: black;
}

ul {
  background-color: #B79b58;
  overflow: auto;
}

li {
  list-style-type: none;
}

body {
  height: 200vh;
}
Run Code Online (Sandbox Code Playgroud)
<nav>
  <ul align="left">
    <li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
    <li><a href="#/about" class="nav-selections">About</a></li>
    <li><a href="#/products" class="nav-selections">Products</a></li>
    <li><a href="#" class="nav-selections">Home</a></li>
  </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

除了 FF 和 Chrome 之外,还有 polyfill 可用于其他浏览器。这是一个实验规则,可以随时通过浏览器实现或不实现。Chrome 几年前添加了它然后又删除了它,它似乎又回来了……但是持续了多长时间?

最接近的是 position:relative + coordonates 在滚动到达粘滞点时更新,如果你想把它变成一个 javascript 脚本


小智 5

对我来说并不明显的有趣时刻:至少在 Chrome 70position: sticky中,如果您使用 DevTools 进行设置,则不会应用它。


小智 5

我知道这是一个旧帖子。但是,如果像我这样的人最近刚刚开始摆弄位置:粘性,这可能会很有用。

就我而言,我使用position:sticky作为网格项。它不起作用,问题是html元素上隐藏了溢出-x:。当我删除该属性后,它就工作得很好。将overflow-x:隐藏在body元素上似乎可以工作,但还不知道为什么。


小智 5

我知道这似乎已经得到了回答,但我遇到了一个特定的案例,我觉得大多数答案都没有抓住重点。

overflow:hidden回答覆盖90%的病例。这或多或少是“粘性导航”场景。

但是粘性行为最好在容器的高度内使用。想想您网站右栏中的时事通讯表格,它会随着页面向下滚动。如果您的粘性元素是容器的唯一子元素,则容器的大小完全相同,并且没有滚动空间。

您的容器必须是您希望元素在其中滚动的高度。在我的“右列”场景中,哪个是左列的高度。实现这一点的最佳方法是display:table-cell在列上使用。如果你不能,并且float:right像我一样被困住了,你将不得不猜测用 Javascript 计算它的左列高度。

  • “如果您的粘性元素是容器的唯一子元素,则容器的大小完全相同,并且没有滚动空间。” 金子!!!谢谢你! (3认同)

Nim*_*dar 5

1.如果元素的任何父元素上的溢出设置为隐藏、滚动或自动,则粘性位置很可能不起作用。

2.如果任何父元素设置了高度,则位置粘性可能无法正常工作。