Я создал простую функцию скольжения, которая должна заставить элемент появляться или исчезать в течение заданного времени.Функция занимает больше времени, чем ожидалось.
Моя формула для построения этой функции является: ms = 1 pixel/(initial size/duration)
, по сути вычисления, сколько миллисекунд должно пройти, прежде чем вычитанием 1px
из элемента height
или width
.
Моя математическая логика говорит, что функция должна быть заполнена в 1000ms
, но для меня время, которое требуется для завершения, выглядит значительно больше, не зная, сколько.
Почему требуется дольше, чем 1s
Заполнить и что может быть причиной этого?
Код:
/* ----- JavaScript ----- */
function slide(el, duration, direction) {
/* Default */
duration = duration || 1000, direction = direction || "vertical";
var
dim = (direction === "horizontal") ? "width" : "height",
/* Get how tall or wide el is in 'px' */
size = initSize = parseFloat(
getComputedStyle(el, null).getPropertyValue(dim) || el.style[dim]
),
/* Get the previous size, so as to restore el to it */
prevSize = el.style["prev" + dim] || 0,
/* Calculating how many ms should pass before subtracting 1px*/
ms = 1/(initSize/duration),
interval = setInterval(function() {
/* If el is visible */
if (initSize > prevSize && size > prevSize) el.style[dim] = --size + "px";
/* If el is not visible */
else if (prevSize > initSize && size <= prevSize) el.style[dim] = ++size + "px";
/* Clear the interval when 0 is reached and cache the previous size */
else {
console.log("oops")
el.style["prev" + dim] = initSize;
clearInterval(interval);
}
}, ms);
}
slide(document.getElementById("a"));
<!----- HTML ----->
<div id = "a" style = "width: 200px;height: 300px;background-color:black;"></div>
что значение 'ms'? чем меньше это, тем менее точным будет время - я бы посмотрел на 'requestAnimationFrame' и реорганизовал ваш код, чтобы вычесть определенное количество пикселей на анимационный кадр - другими словами, вычислить количество пикселей для вычитания в зависимости от сколько времени прошло с момента предыдущего кадра - заканчивается в более плавной согласованной анимации –
Ваша функция не * * завершена: она никогда не попадает в 'clearInterval()'. Проверьте консоль вашего браузера ...Кроме того, в отношении вашего комментария о том, что «время, которое требуется для завершения, выглядит значительно больше, не зная, сколько», почему бы вам не измерить его с помощью 'console.log (Date.now())' перед запуском и на укажите, что вы вызываете 'clearInterval()', или смотрите на использование ['console.time()'] (https://developer.mozilla.org/en-US/docs/Web/API/Console/time) ... – nnnnnn
@JaromandaX, если у нас есть элемент с ** 'height: 300px' ** и установленная продолжительность **' 300ms' **, ** 'ms' ** будет равна **' 1' ** * (1/(300px/300ms)) * –