Is it expected behaviour that whenever you hover on whatever element in the section of the grid-template-rows that has overflow and auto height moves scroll position to the bottom of the overflown container (body in this case)?
The most visible scroll breaking effect is when you are doing circles between 2 li elements and trying to scroll either up or down on snippet #1.
When I remove :hover on li the scroll doesn't break.
.container{
display: grid;
grid-template-rows: 10vh auto 8vh;
width: 400px;
height: 300px;
background: rgba(0,0,0.2);
}
.header{
background: lightblue;
}
.body{
background: white;
overflow: auto;
}
.footer{
background: lightgreen;
}
li{
height: 30px;
background: rgba(0,0,0,.5);
opacity: 1;
}
li:nth-child(even){
background: rgba(0,0,0,.2);
}
li:hover{
opacity: .1;
}
<div class="container">
<div class="header">header</div>
<div class="body">body
<ul>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
</ul>
</div>
<div class="footer">footer</div>
</div>
On the other hand if you hardcode the middle value to be i.e 40vh instead of auto scroll works as intended.
.container{
display: grid;
grid-template-rows: 10vh 40vh 8vh;
width: 400px;
height: 300px;
background: rgba(0,0,0.2);
}
.header{
background: lightblue;
}
.body{
background: white;
overflow: auto;
}
.footer{
background: lightgreen;
}
li{
height: 30px;
background: rgba(0,0,0,.5);
opacity: 1;
}
li:nth-child(even){
background: rgba(0,0,0,.2);
}
li:hover{
opacity: .1;
}
<div class="container">
<div class="header">header</div>
<div class="body">body
<ul>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
<li>foo</li>
</ul>
</div>
<div class="footer">footer</div>
</div>