1

You may have to hit the "Run code snippet" button twice for the demos to work as intended for some reason.

I'm experiencing an issue in Chrome version 75, whereby adding a padding to a header element prevents the last child in the main container from being rendered, even though it still exists on the page.

In the example below, once you scroll to the bottom of main notice how <p>z</p> is not visible or has not been rendered.

const
  main = document.querySelector('main'),
  header = document.querySelector('header')
let
  lastScroll = 0

main.onscroll = ()=>{
  if (main.scrollTop > lastScroll) {
    header.style.display = 'none'
  } else {
    header.style.display = ''
  }
  lastScroll = main.scrollTop
}
html, body {
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  flex-direction: column;
}
::-webkit-scrollbar {
  display: none;
}
header {
  padding: 12px;
  background: skyblue;
}
main {
  flex: 1;
  overflow-y: auto;
  box-sizing: border-box;
  border: solid red 3px;
}
p:last-child {
  background: green;
}
<header>HEADER</header>
<main>
    <p>a</p>
    <p>b</p>
    <p>c</p>
    <p>d</p>
    <p>e</p>
    <p>f</p>
    <p>g</p>
    <p>h</p>
    <p>i</p>
    <p>j</p>
    <p>k</p>
    <p>l</p>
    <p>m</p>
    <p>n</p>
    <p>o</p>
    <p>p</p>
    <p>q</p>
    <p>r</p>
    <p>s</p>
    <p>t</p>
    <p>u</p>
    <p>v</p>
    <p>w</p>
    <p>x</p>
    <p>y</p>
    <p>z</p>
  </main>

Now, if we remove the padding on header, the element begins being displayed or rendered again.

const
  main = document.querySelector('main'),
  header = document.querySelector('header')
let
  lastScroll = 0

main.onscroll = ()=>{
  if (main.scrollTop > lastScroll) {
    header.style.display = 'none'
  } else {
    header.style.display = ''
  }
  lastScroll = main.scrollTop
}
html, body {
  width: 100%;
  height: 100%;
  margin: 0;
  display: flex;
  flex-direction: column;
}
::-webkit-scrollbar {
  display: none;
}
header {
  background: skyblue;
}
main {
  flex: 1;
  overflow-y: auto;
  box-sizing: border-box;
  border: solid red 3px;
}
p:last-child {
  background: green;
}
<header>HEADER</header>
<main>
  <p>a</p>
  <p>b</p>
  <p>c</p>
  <p>d</p>
  <p>e</p>
  <p>f</p>
  <p>g</p>
  <p>h</p>
  <p>i</p>
  <p>j</p>
  <p>k</p>
  <p>l</p>
  <p>m</p>
  <p>n</p>
  <p>o</p>
  <p>p</p>
  <p>q</p>
  <p>r</p>
  <p>s</p>
  <p>t</p>
  <p>u</p>
  <p>v</p>
  <p>w</p>
  <p>x</p>
  <p>y</p>
  <p>z</p>
</main>

I assume this has something to do with how the implicit height of header is calculated, but it's just an assumption.

Also, I noticed a bizarre idiosyncrasy, whereby the problem would seemingly fix itself if the developer console was open.

Does anybody know what's going on here?

Community
  • 1
  • 1
oldboy
  • 5,729
  • 6
  • 38
  • 86
  • Comments are not for extended discussion; this conversation has been [moved to chat](https://chat.stackoverflow.com/rooms/194788/discussion-on-question-by-anthony-padding-prevents-element-from-rendering-flexb). – Samuel Liew Jun 12 '19 at 01:23

0 Answers0