Editing a sticky input element in Chrome causes the page to scroll to the top
I have managed to make it work, but it's probably not the best solution.
- Add add either
overflow: auto
oroverflow: hidden
to the class withposition: sticky
. - Remove the
placeholder
from<input>
.
I'm not sure why adding overflow
or removing the placeholder
makes it work, maybe someone can help explain this.
.container { height: 5000px;}.heading{ background: #ccc; height: 50px; line-height: 50px; margin-top: 10px; font-size: 30px; padding-left: 10px; position: -webkit-sticky; position: sticky; top: 0px; overflow: auto;}
<h1>Lorem Ipsum</h1><div class="container"> <div class="heading"> <input> </div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div></div>
You'll have to do some validation of the key - probably best with a regex check to confirm acceptable characters, but you can call a javascript function from the keypress, update the value of the input, and return false:
var e = document.getElementById('input');e.onkeypress = myFunction;function myFunction(t) { document.getElementById('input').value += t.key; return false;}
.container { height: 1000px;}.heading{ background: #ccc; height: 50px; line-height: 50px; margin-top: 10px; font-size: 30px; padding-left: 10px; position: -webkit-sticky; position: sticky; top: 0px;}
<h1>Lorem Ipsum</h1><div class="container"> <div class="heading"> <input id="input" placeholder="Edit this while scrolling..."> </div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div> <div>Lorem Ipsum</div></div>