I'm trying to display some sort of timeline and my goal is to get it smoothly refreshed.
I managed to get something better than absolute positionning using css transform property but I'm not very happy because there is some flickering (especially when the background is dark).
var background = document.querySelector('#background');
var position = document.querySelector('#position');
var transform = document.querySelector('#transform');
var backgroundColor, borderColor
background.addEventListener('change', e => {
backgroundColor = e.target.checked ? '#333333' : 'white'
position.style.backgroundColor = backgroundColor
transform.style.backgroundColor = backgroundColor
});
let current = 0
let step = 30
for (let i = 0; i < 300; i++) {
for (let j = 0; j < 2; j++) {
var element = document.createElement('div')
element.style.position = 'absolute'
element.style.height = '50px'
element.style.width = step + 'px'
if(j) {
element.style.left = current + 'px'
} else {
element.style.left = 0 + 'px'
element.style.transform = 'translateX(' + current + 'px)'
}
element.style['border-left'] = '1px gray solid'
if (j)
position.appendChild(element)
else
transform.appendChild(element)
}
current += step
}
setInterval(refresh, 50);
let init = 0
function refresh() {
init -= 0.2
let current = init
for (var i = 0; i < position.children.length; i++) {
var c = position.children[i];
c.style.left = current + 'px'
current += step
}
current = init
for (var i = 0; i < transform.children.length; i++) {
var c = transform.children[i];
c.style.transform = 'translateX(' + current + 'px)'
current += step
}
}
<html>
<body>
<div>
<input type="checkbox" id="background" label="Dark">
<label>Dark</label>
</div>
<span>Using css position<span>
<div id="position" style="width:100%;height:50px;margin-bottom:1em;"></div>
<span>Using css transform<span>
<div id="transform" style="width:100%;height:50px;"></div>
</body>
</html>
Is there a better way to do this?