【问题标题】:position: sticky adds some space around element in Chromeposition: sticky 在 Chrome 中的元素周围添加了一些空间
【发布时间】:2017-08-05 21:27:29
【问题描述】:

说明

我有一个<header> 元素,它使用position: sticky 在用户滚动过去时粘在页面顶部。不知何故,在 Chrome 中,所述元素没有按预期显示,而是在元素的顶部和左侧添加了一些空间。我设法从我的 CSS 文件中分离出代码以重现该错误并在 Chrome(Android 和 Windows 7 桌面版)中成功重现它。有谁知道为什么会发生这种情况以及是否有解决方案?

代码示例(也可作为 Codepen 提供)

body {
  margin: 0;
}

header {
  display: block;
  height: 44px;
  background: #263238;
  color: #fafafa;
  padding: 2px 8px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.18), 0 2px 3px rgba(0, 0, 0, 0.26);
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
}

header.sticky {
  position: -webkit-sticky;
  position: sticky;
  z-index: 1101;
  top: 0;
}
<p>Blah blah</p>

<header class="sticky"> 
  <button>Home</button> 
  <button>About</button>
</header>

<!-- some spacing to allow users to scroll the page -->
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

错误和预期行为的屏幕截图

下图显示了&lt;header&gt; 元素在所有浏览器上的外观。目前,Chrome 似乎无法正确显示(见下图)。

这张图片展示了 &lt;header&gt; 元素在 Chrome 中的样子。请注意元素左侧和顶部的小空间。

注意事项

  • 据我所知,我的 CSS 的其余部分并没有真正影响元素的样式,正如您从 Codepen 和提供的 sn-p 中看到的那样。
  • 由于这个错误出现在我的 CSS 框架中,为了避免自我宣传,项目的名称和徽标已从屏幕截图中删除。
  • 提供前面的注释,我更喜欢纯 CSS 解决方案(不使用 Javascript 或更改 HTML)来解决问题,除非没有。
  • 我可以在 Android 5.0.2 上的 Chrome 56.0.2924.87 和 Windows 7(64 位)上的 Chrome 57.0.2987.98(64 位)中成功重现该错误。

【问题讨论】:

  • 无法在 Chrome 中重现问题...根本没有边距!
  • @andreas 我可以在我的两个设备上复制,如前所述。您使用的是什么版本的 Chrome 以及什么平台?
  • Win10 上的 Chrome 57.0.2987.98
  • 您的代码在 Windows 10 上的 Chrome、Firefox 和 Opera 中按预期工作。它在 Internet Explorer 11 上也严重失败。所有浏览器上的最新版本。
  • 在使用position:sticky之前先检查一下caniuse.com/#search=position%3A%20sticky,它并不兼容所有浏览器。

标签: html css google-chrome sticky


【解决方案1】:

我有同样的问题。这是我修复它的方法。

overflow: hidden 添加到body 将禁用滚动。所以,我只加了overflow-x: hidden

html,body{
  overflow-x: hidden;
  margin: 0;
  padding: 0;
}

我希望它可以帮助其他人。

【讨论】:

    【解决方案2】:

    现在我明白你想说什么了,box:shadow 在这种情况下是邪恶的。我假设你不能删除它,所以我在body css 中添加了overflow:hidden。 看看下面的sn-p。

    body {
      margin: 0;
      overflow:hidden;
      background: red
    }
    
    header {
      display: block;
      height: 44px;
      background: #263238;
      color: #fafafa;
      padding: 2px 8px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.18), 0 2px 3px rgba(0, 0, 0, 0.26);
      white-space: nowrap;
      overflow-x: auto;
      overflow-y: hidden;
    }
    
    header.sticky {
      position: -webkit-sticky;
      position: sticky;
      z-index: 1101;
      top: 0;
    }
    <p>Blah blah</p>
    
    <header class="sticky"> 
      <button>Home</button> 
      <button>About</button>
    </header>
    
    <!-- some spacing to allow users to scroll the page -->
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

    【讨论】:

    • 哇,这似乎确实解决了这个问题。 overflow: hidden;如果添加到body中会不会引起任何并发症?
    • 任何超出视口区域的内容都不会在屏幕上显示,因为这会禁用滚动条,我希望您使用的是响应式设计,所以这无关紧要。
    • 我正在使用响应式设计,所以我希望这不会真正破坏任何东西。非常感谢您帮我解决这个问题!
    【解决方案3】:

    将不支持的position: sticky 替换为position: fixed; width: 100%; 并在所有浏览器上试用。正如@aje 提到的,在使用实验性/新 css3 样式之前总是检查浏览器兼容性。

    【讨论】:

    • 问题不在于浏览器支持,因为我可以在完全支持position: sticky 的 Chrome 57 中重现它。使用position: fixed 不会真正以最佳方式处理这种情况,因为标题不会按预期运行,而只会按预期显示。
    • sticky 替换为 fixed 并不能解决使用 sticky 的问题,我确信否决者将其用作论据。