Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2017, 08:44
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Loading Image на JS
Создаём loading image средствами Javascript.

Демо на jsfiddle

<body></body>

<script>
(function () {

"use strict";

function _circle(top, left, size) {
	var circle = document.createElement("DIV");
	circle.style =	"width: " + size + "px; height: " + size + "px; border-radius: " + (size * 10) + "px; position: fixed;" +
			"background-color: #000000; top: " + top + "px; left: " + left + "px";
	document.body.appendChild(circle);
	return circle;
}

function _default(settings, defaultProps) {
	if (!settings) settings = {};
	for (var i in defaultProps) if ( !(i in settings) ) settings[i] = defaultProps[i];
	return settings;
}

function _fx(circle, from, to, speed ) {
	var start = +new Date();
	fx();
	function fx() {
		var m = (+new Date() - start) / speed;
		if (m > 1) m = 1; else setTimeout(fx, 17);
		circle.style.width = circle.style.height = (from + (to - from) * m) + "px";
	}
}

function _init(settings) {
	settings = _default(settings, {
		top : 100,
		left : 100,
		size : 10,
		speed : 200,
		circles : 8,
		dispersion : 2,
		by : 5
	});

	var circles = [];

	var j = 0;

	for (var i = 0; i < settings.circles; i++) {
		circles.push(_circle(	settings.top + Math.sin(i / settings.circles * 6.28) * settings.size * settings.dispersion,
					settings.left + Math.cos(i / settings.circles * 6.28) * settings.size * settings.dispersion,
					settings.size
		));
	}

	var timer = setInterval(function () {
		++j;
		_fx( circles[j % settings.circles], settings.size, settings.size + settings.by, settings.speed );
		_fx( circles[(j - 1) % settings.circles], settings.size + settings.by, settings.size, settings.speed );
	}, settings.speed);

	return {
		remove : function () {
			for (var i = 0; i < circles.length; i++) {
				document.body.removeChild(circles[i]);
			}
			clearInterval(timer);
		}
	};
}

window.LoadingImage = _init;

})();

LoadingImage({ top : 50, left : 50 });
</script>


Функция возвращает метод remove(), который удаляет все кружки и интервал анимации.

Также она принимает параметры (в скобках указаны параметры по умолчанию):

Код:
top, left (100, 100) - координаты куда вставлять
size (10) - размер кружков
speed (200) - скорость анимации
circles (8) - количество кружков
dispersion (2) - разброс
Например, если захочется сделать 16 кружков вместо 8, то dispersion лучше поставить 4, иначе кружки будут накладываться друг на друга. Чем больше dispersion, тем больше конечный loading image
by (5) - на сколько увеличивать кружок
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2017, 09:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

exec,
а почему бы не использовать requestAnimationFrame вместо setInterval?
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2017, 10:33
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

exec,

Прикольно, конечно, но сама идея в общем случае тупиковая - в любой момент дизайнер может придумать новую крутилку, которая не впишется в этот код. Так что лучше юзать старую добрую гифку, которую рисовальщик перерисует, если что

Хотя если ты сам себе дизайнер (манагер), то вполне.
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2017, 12:27
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Немного дописал код, главные изменения - теперь размер кружков меняется по цепочке (см. демо, параметр chain), а также можно менять opacity (параметр fade). Если fade больше нуля, у активных кружков opacity будет увеличиваться, если меньше нуля - то соответственно уменьшаться, в пример всё видно. Чтобы opacity не менялся вообще, fade следует поставить на 1.

<body></body>
<script>
(function () {

"use strict";

function _default(settings, defaultProps) {
	if (!settings) settings = {};
	for (var i in defaultProps) if ( !(i in settings) ) settings[i] = defaultProps[i];
	return settings;
}

function _fx(circle, from, to, speed, opacityFrom, opacityTo ) {
	var start = +new Date();
	fx();
	function fx() {
		var m = (+new Date() - start) / speed;
		if (m > 1) m = 1; else setTimeout(fx, 17);
		circle.style.width = circle.style.height = (from + (to - from) * m) + "px";
		if (opacityFrom) circle.style.opacity = opacityFrom + (opacityTo - opacityFrom) * m;
	}
}

function _init(settings) {
	settings = _default(settings, {
		top : 100,
		left : 100,
		size : 10,
		speed : 200,
		circles : 8,
		dispersion : 2,
		by : 5,
		color : "#000000",
		chain : 1,
		fade : -0.5
	});

	var reverse = false;

	if (settings.fade < 0) {
		settings.fade = -settings.fade;
		reverse = true;
	}

	var x4 = reverse ? 1 : settings.fade;
	var x3 = reverse ? -1 : 1;
	var x2 = settings.size * settings.dispersion;
	var x1 = 2 * x2 + settings.size - 1;

	var circles = [];
	var wrap = document.createElement("DIV");
	wrap.style.cssText =	"position: absolute; top: " + (settings.top - x2) + "px; left: " +
				(settings.left - x2) + "px; width: " + x1 + "px; height:" + x1 + "px" ;

	var j = -1;

	for (var i = 0; i < settings.circles; i++) {
		var circle = document.createElement("DIV");
		circle.style.cssText =	"width: " + settings.size + "px; height: " + settings.size + "px; position: fixed;" +
					"background-color: " + settings.color + "; border-radius: " + (settings.size + settings.by) +
					"px; top: " + (settings.top + Math.sin(i / settings.circles * 6.28) * x2) + "px; left: " +
					(settings.left + Math.cos(i / settings.circles * 6.28) * x2) + "px; opacity: " +
					(reverse ? 1 : settings.fade);
		wrap.appendChild(circle);
		circles.push(circle);
	}

	document.body.appendChild(wrap);

	var timer = setInterval(function () {
		++j;
		_fx(
			circles[j % settings.circles],
			settings.size,
			settings.size + settings.by,
			settings.speed,
			x4,
			reverse ? settings.fade : 1 );
		for (var i = 1; i <= settings.chain; i++) {
			if ((j - i) % settings.circles < 0) continue;
			_fx(
				circles[(j - i) % settings.circles],
				settings.size + settings.by * (settings.chain - i + 1) / settings.chain,
				settings.size + settings.by * (settings.chain - i) / settings.chain,
				settings.speed,
				x4 + x3 * (1 - settings.fade) * (settings.chain - i + 1) / settings.chain,
				x4 + x3 * (1 - settings.fade) * (settings.chain - i) / settings.chain
			);
		}
	}, settings.speed);

	return {
		remove : function () {
			document.body.removeChild(wrap);
			clearInterval(timer);
		},
		image : wrap
	};
}

window.LoadingImage = _init;

})();

LoadingImage({ top : 50, left : 50, speed : 100, by : 10, color : "#007fff", size : 20, chain : 5, fade: -0.5 });

LoadingImage({ top : 50, left : 200, speed : 100, by : 10, color : "#007fff", size : 20, chain : 5, fade: 0.5 });

LoadingImage({ top: 50, left : 350, speed : 100, by : 8, color : "#007fff", size : 10, chain : 10, fade: 1, circles : 16, dispersion : 4 });
</script>
Ответить с цитированием
  #5 (permalink)  
Старый 21.03.2017, 05:27
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Окончательная версия, убраны некоторые баги, добавлен chainEasing, призванный управлять поведением элементов в цепочке.

Демо
Ответить с цитированием
  #6 (permalink)  
Старый 29.03.2017, 17:08
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

Прикольно, мне понравилось
Ответить с цитированием
  #7 (permalink)  
Старый 30.03.2017, 12:48
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Эмуляция Солнечной системы

Пасхалка: если кликнуть на Солнце, оно взорвётся (станет красным гигантом), а планеты сойдут с орбит.
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2017, 08:04
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

[][$=({}+(_=__=''))[++_|++_+_]+({}+__)[--_]+([][_]+__)[_]+(!_+__)[_-~_]+(!!_+'')[--_]+(!_+__)[++_]+(!!_+__)[++_]+({}+__)[_+ ++_]+(!!_+__)[+__]+({}+__)[_/_]+(!!_+__)[+!__]][$]((!--_+__)[--_]+(!++_+__)[_]+(!!++_+__)[_]+(!!--_+__)[--_]+(!!_+__)[--_]+(_[$]+__)[(++_+ ++_)*++_+ ++_+!![]+!![]]+(_[$]+__)[_*_])()
Ответить с цитированием
  #9 (permalink)  
Старый 03.04.2017, 22:57
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

Я читал, когда солнце станет красным гигантом планеты не улетят, сгорят на своих орбитах, и да планет пока 8.

Последний раз редактировалось psiklop, 03.04.2017 в 22:59.
Ответить с цитированием
  #10 (permalink)  
Старый 05.04.2017, 19:50
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

mtx.js 1.0

Пришла идея сделать jQuery-подобную библиотеку для работы с мат. объектами, начнём с матриц.

Тут же возникает вопрос: смещать ли нумерацию? Т.е. должен ли matrix[1][1] находить первый элемент первого столбца, а не второй элемент второго?

Последний раз редактировалось exec, 06.04.2017 в 11:49.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическая смена картинок через заданное время herotic Элементы интерфейса 45 15.05.2020 16:44
BackEnd/FrontEnd Developer (Native JS) Abab Работа 0 25.12.2016 10:56
js стиль render для react.js vflash Ваши сайты и скрипты 5 01.04.2016 22:57
Что нужно дописать в коде чтобы изображение менялось постоянно. vadim90k (X)HTML/CSS 22 09.07.2012 16:33
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28