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>