Показать сообщение отдельно
  #2 (permalink)  
Старый 02.02.2017, 03:59
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

Меня опять троллит джаваскрипт!

Animate.color = function ( elem, attr, to, time ) {
	// поскольку на вход могут подать название цвета ("pink") или hex-значение (#ff69b4)
	// преобразуем его в rgb(205, 105, 180), заставив браузер вычислить его
	var I = document.createElement( "DIV" );
	I.style.backgroundColor = to;
	document.body.appendChild( I );
	var colorEnd = getComputedStyle( I ).backgroundColor.match( /(\w{1,3})/g ); // получаем [205, 105, 180]
	document.body.removeChild( I ); // убираемся за собой
	var colorStart = getComputedStyle( elem )[attr].match( /(\w{1,3})/g ); // начальный цвет элемента

	var start = new Date().getTime();
	setTimeout( function () {
		var diff = new Date().getTime() - start;
		if ( diff < time ) { // alert(diff) даёт 10
			elem.style[attr] = "rgb(" + A( colorStart[0], colorEnd[0], diff/time ) + ", " + A( colorStart[1], colorEnd[1], diff/time ) + ", " + A( colorStart[2], colorEnd[2], diff/time ) + ")";
			setTimeout( arguments.callee, 10 ); // НО НОВЫЙ SETTIMEOUT ПРОСТО НЕ ВЫЗЫВАЕТСЯ, ХОТЬ ТЫ ТРЕСНИ
		}
	}, 10 );
};

function A ( x, y, z ) { // вспом. ф-я для выч. from + (to - from) * (diff / time)
	return +x + (+y - +x) * +z;
}


Вызывается так:

Animate.color( document.getElementById("foo"), "backgroundColor", "black", 1000 );


Причём есть аналогичная функция для изменения других параметров (ширина, высота и т.д.), там всё считается по той же формуле (from + (to - from) * (diff / time)) и работает как надо.

Последний раз редактировалось Diphenyl Oxalate, 02.02.2017 в 04:07.
Ответить с цитированием