В моем решении я добавил несколько CSS для обработки перехода, и для того, чтобы он был плавным в случае быстрого скольжения пользователя, я установил тайм-аут, который изменяет sr c на новое изображение, и сбрасывается каждый раз, когда происходит изменение (поэтому можно запланировать только одно изменение). Когда изображение загружается, мы возвращаем его обратно.
var slider = document.getElementById("myRange");
var output = document.getElementById("value");
var img = document.getElementById("img");
var loadOutTimeout;
var loadHandler = function(e) {
img.classList.remove("fade-out");
img.classList.add("fade-in");
}
img.addEventListener("load", loadHandler);
output.innerHTML = slider.value;
slider.oninput = function() {
output.innerHTML = this.value;
img.classList.remove("fade-in");
img.classList.add("fade-out");
var imgVal = this.value;
clearTimeout(loadOutTimeout);
loadOutTimeout = setTimeout(function() {
img.setAttribute("src", "https://loremflickr.com/320/240/" + imgVal);
}, 200);
}
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.fade-in {
animation: fade-in 0.2s ease;
animation-fill-mode: forwards;
}
.fade-out {
animation: fade-out 0.2s ease;
animation-fill-mode: forwards;
}
<div class="slidecontainer">
<input type="range" min="1" max="5" value="1" class="slider" id="myRange">
<p>Value: <span id="value"></span></p>
<img src="https://loremflickr.com/320/240/1" alt="" id="img">
</div>