Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задача по объекту images (https://javascript.ru/forum/misc/51480-zadacha-po-obektu-images.html)

Ara 08.11.2014 00:33

Задача по объекту images
 
Задача:
а)Вывести произвольное изображение на страницу.
б)Запросить у пользователя два числа: максимальное значение ширины и высоты картинки.
в)Затем с интервалом в 100мс изменять размер картинки по ширине и высоте на 1 px до тех пор, пока не получится максимальное значение заданное пользователем.
г)После достижения максимума по ширине и высоте начать уменьшать картинку до исходного размера, потом снова увеличивать, снова уменьшать и так далее.

У меня не получается выполнении второй функции:
Вот код:

<html>
<head>
<title>JavaScript</title>
</head>
<body>
<img src = "aa.jpg" name = "i">
<br>
<script language="javascript">
var w = Number(prompt("Введите ширину"));
var h = Number(prompt("Введите длину"));

var k2 = h; var z2 = w;
var id1 = setInterval (fun, 10);

var k=0;var z=0;
var id = setInterval (fun1, 10,h,w); 

function fun1 (h,w)	{
if (k<h) {document.images.i.height =k++; }
if (z<w) {document.images.i.width =z++; }
}

function fun () { 
if (k2>0) {document.images.i.height = k2--; }
if (z2>0) {document.images.i.width = z2--; }
}
</script>
</body>
</html>


рони 08.11.2014 00:56

Ara,
где начальные размеры картинки?

artemdemo 08.11.2014 14:21

Вложений: 1
Решение может быть и красивее, но дальше копать нет смысла с моей точки зрения.

Вот скрипт, он берет размер увеличения рандомально, но вы можете задавать их как хотите.

К ответу приложена картинка, которую я использовал.

Хм, только не обратил внимание на 4-й пункт - картинка должна постоянно увеличиваться и уменьшаться. Пропустил, впрочем дописывать пока не буду, если будут вопросы, напишите, можно будет доделать.

Доделал

<!DOCTYPE html>
<html>
<head lang="en">
	<meta charset="UTF-8">
	<title>Image resizing</title>
</head>
<body>

<img id="husky" src="husky.jpg">

</body>
<script type="text/javascript">

	window.addEventListener('load', go, false);

	function go() {
		var imgResizer = new ImageResizer();

		// Измените размер на нужный. 
		// Если 0, то программа будет брать случайное число
		imgResizer.toWidth = 0;
		imgResizer.toHeight = 0;

		imgResizer.init('husky');
	}

	function ImageResizer() {

		this.toWidth = 0;
		this.toHeight = 0;

		this.animationSteps = 20;
		this.animationDelay = 50;

		var self = this;
		var imgObj = null;
		var animInterval = null, stepsCounter = 0;
		var originalWidth = 0, originalHeight = 0;
		var _toWidth = 0, _toHeight = 0;
		var animationDirection = 'forward';

		/**
		 * Initialisation
		 * @param id (String) - id of the image that will resized
		 */
		this.init = function(id) {
			imgObj = document.getElementById( id );

			if ( ! imgObj ) return false;

			this.resizingAnim();
		};

		this.resizingAnim = function() {
			if ( ! stepsCounter ) {
				clearInterval( animInterval );
				if ( animationDirection == 'forward' ) {
					
					_toWidth = this.toWidth ? this.toWidth : Math.floor((Math.random() * imgObj.width + 300) + imgObj.width);
					_toHeight = this.toHeight ? this.toHeight : Math.floor((Math.random() * imgObj.height + 300) + imgObj.height);

					originalWidth = imgObj.width;
					originalHeight = imgObj.height;

					animationDirection = 'backward';

				} else {
					_toWidth = originalWidth;
					_toHeight = originalHeight;

					originalWidth = imgObj.width;
					originalHeight = imgObj.height;
				}

				stepsCounter = self.animationSteps;
				animInterval = setInterval( self.resizingAnim, self.animationDelay );
			} else {
				imgObj.width += ( _toWidth - originalWidth ) / self.animationSteps;
				imgObj.height += ( _toHeight - originalHeight ) / self.animationSteps;
				stepsCounter--;
			}
		}

	}

</script>

</html>

рони 08.11.2014 14:50

artemdemo,
если уж делать пример, то запускаемый.
[HTML run][/HTML]

MallSerg 08.11.2014 15:03

Цитата:

Сообщение от Ara
У меня не получается выполнении второй функции:

Неверно (функция выполняется и работает как и задумывалось)
Проблема в том что ты не видишь результата выполнения второй функции в браузере

так как задача учебная могу намекнуть что проблема в асинхронной работе событий(setInterval ) в JavaScript

т.е. идущие подряд
var id1 = setInterval (fun, 10);
var id = setInterval (fun1, 10,h,w);
работают не так как ты задумал

ссылка на похожую тему

artemdemo 08.11.2014 16:09

Цитата:

Сообщение от рони (Сообщение 339770)
artemdemo,
если уж делать пример, то запускаемый.
[HTML run][/HTML]

А что не запускается в моем примере?

рони 08.11.2014 16:55

Цитата:

Сообщение от artemdemo
А что не запускается в моем примере?

кнопы run нету.

Ara 08.11.2014 18:14

Цитата:

Сообщение от рони (Сообщение 339701)
Ara,
где начальные размеры картинки?

просто любую картинку использовать не зависимо от того какого она размера.

Ara 08.11.2014 18:18

Цитата:

Сообщение от artemdemo (Сообщение 339765)
Решение может быть и красивее, но дальше копать нет смысла с моей точки зрения.

Вот скрипт, он берет размер увеличения рандомально, но вы можете задавать их как хотите.

К ответу приложена картинка, которую я использовал.

Хм, только не обратил внимание на 4-й пункт - картинка должна постоянно увеличиваться и уменьшаться. Пропустил, впрочем дописывать пока не буду, если будут вопросы, напишите, можно будет доделать.

Доделал

<!DOCTYPE html>
<html>
<head lang="en">
	<meta charset="UTF-8">
	<title>Image resizing</title>
</head>
<body>

<img id="husky" src="husky.jpg">

</body>
<script type="text/javascript">

	window.addEventListener('load', go, false);

	function go() {
		var imgResizer = new ImageResizer();

		// Измените размер на нужный. 
		// Если 0, то программа будет брать случайное число
		imgResizer.toWidth = 0;
		imgResizer.toHeight = 0;

		imgResizer.init('husky');
	}

	function ImageResizer() {

		this.toWidth = 0;
		this.toHeight = 0;

		this.animationSteps = 20;
		this.animationDelay = 50;

		var self = this;
		var imgObj = null;
		var animInterval = null, stepsCounter = 0;
		var originalWidth = 0, originalHeight = 0;
		var _toWidth = 0, _toHeight = 0;
		var animationDirection = 'forward';

		/**
		 * Initialisation
		 * @param id (String) - id of the image that will resized
		 */
		this.init = function(id) {
			imgObj = document.getElementById( id );

			if ( ! imgObj ) return false;

			this.resizingAnim();
		};

		this.resizingAnim = function() {
			if ( ! stepsCounter ) {
				clearInterval( animInterval );
				if ( animationDirection == 'forward' ) {
					
					_toWidth = this.toWidth ? this.toWidth : Math.floor((Math.random() * imgObj.width + 300) + imgObj.width);
					_toHeight = this.toHeight ? this.toHeight : Math.floor((Math.random() * imgObj.height + 300) + imgObj.height);

					originalWidth = imgObj.width;
					originalHeight = imgObj.height;

					animationDirection = 'backward';

				} else {
					_toWidth = originalWidth;
					_toHeight = originalHeight;

					originalWidth = imgObj.width;
					originalHeight = imgObj.height;
				}

				stepsCounter = self.animationSteps;
				animInterval = setInterval( self.resizingAnim, self.animationDelay );
			} else {
				imgObj.width += ( _toWidth - originalWidth ) / self.animationSteps;
				imgObj.height += ( _toHeight - originalHeight ) / self.animationSteps;
				stepsCounter--;
			}
		}

	}

</script>

</html>

все бы хорошо, но вы использовали некоторые свойства с которыми я еще не знаком. а задача как раз была сделать именно с теми то знаком. Поэтому я и написал код который у меня получился)

Ara 08.11.2014 18:21

Цитата:

Сообщение от MallSerg (Сообщение 339774)
Неверно (функция выполняется и работает как и задумывалось)
Проблема в том что ты не видишь результата выполнения второй функции в браузере

так как задача учебная могу намекнуть что проблема в асинхронной работе событий(setInterval ) в JavaScript

т.е. идущие подряд
var id1 = setInterval (fun, 10);
var id = setInterval (fun1, 10,h,w);
работают не так как ты задумал

ссылка на похожую тему

Спасибо конечно. Но в том и проблема, знаю что нужно использовать булевскую переменные true и false но не знаю как

Ara 08.11.2014 18:22

Цитата:

Сообщение от рони (Сообщение 339806)
кнопы run нету.

нужно без кнопки :-?

MallSerg 08.11.2014 18:24

Цитата:

Сообщение от Ara
нужно использовать булевскую переменные true и false но не знаю

Наверно ее нужно использовать для чего та ?
может для условного ветвления ? т.е. если истина тогда нужно выполнить один код если ложь то другой?
нарисуй логику на бумажке что и как должно работать =)

рони 08.11.2014 18:29

Цитата:

Сообщение от Ara
нужно без кнопки

вы расслабтесь и прочитайте 4 пост пока не просветлеет :)

Ara 08.11.2014 18:42

Цитата:

Сообщение от рони (Сообщение 339830)
вы расслабтесь и прочитайте 4 пост пока не просветлеет :)

понял про что вы))

Ara 08.11.2014 18:43

Цитата:

Сообщение от MallSerg (Сообщение 339826)
Наверно ее нужно использовать для чего та ?
может для условного ветвления ? т.е. если истина тогда нужно выполнить один код если ложь то другой?
нарисуй логику на бумажке что и как должно работать =)

Когда она false, выезжать, а когда true, заезжать обратно. Когда достигнут максимум там или там, меняйте эту булевскую переменную на противоположное значение.
вот только не знаю как к моему коду добавить это

рони 08.11.2014 18:50

Цитата:

Сообщение от Ara
понял про что вы))

ок! :)

Ara 08.11.2014 23:45

Я очень надеюсь что кто нибудь из вас поможет все таки. До сих пор не могу его доделать

рони 09.11.2014 00:55

Ara,
:-?
<!DOCTYPE HTML>
<html>
<head>
<title>JavaScript</title>
<meta charset="utf-8">
</head>
<body>
<img src = "http://javascript.ru/forum/images/ca_serenity/misc/logo.gif" name = "i"  >
<br>
<script language="javascript">
var w = +prompt("Введите ширину", 400) || 400,
    h = +prompt("Введите высоту", 200) || 200,
    img = document.images.i,
    hh = img.height,
    ww = img.width,
    k = hh,
    z = ww,
    i = setInterval(funMax, 100);
h < hh && (h = hh+50);
w < ww && (w = ww+100);

function funMax() {
    k < h && (img.height = k++);
    z < w && (img.width = z++);
    k == h && z == w && (window.clearInterval(i), i = setInterval(funMin, 100))
}

function funMin() {
    k > hh && (img.height = k--);
    z > ww && (img.width = z--);
    k == hh && z == ww && (window.clearInterval(i), i = setInterval(funMax, 100))
};
</script>
</body>
</html>

Ara 09.11.2014 01:23

Спасибо вам большое


Часовой пояс GMT +3, время: 17:34.