Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.05.2015, 16:35
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Разместить блоки на случайных координатах экрана.
Здравствуйте.
Развиваю "пазл". В результате работы моей программы, получаю длинную линейку с блоками изображений. Хочу расположить их на случайных координатах окна браузера. Проблемы с кодом ниже:
function getXPositionOfElement() {//Получить случайные координаты x окна браузера.
        var x_position = Math.floor(Math.random() * window.innerWidth);
	    return x_position;
    }
	
	function getYPositionOfElement() {//Получить случайные координаты y окна браузера.
        var y_position = Math.floor(Math.random() * window.innerHeight);
	    return y_position;
    }
	
	function putPazzleInRandomXYCoordinats(){//Поместить в случайные координаты (см. функция getXPositionOfElement()) элементы массива в цикле.
	    for(var k=0; k<100; k++){
			getXPositionOfElement();
			getYPositionOfElement();
			$("div.block"+k).offset({ top: y_position, left: x_position });
			alert(y_position);//не работает даже с getXPositionOfElement()
		}
	}

Ссылка на остальной код https://github.com/VaAlina/puzzle

P.S. Я вовремя не проверила, как правильно писать слово "puzzle", поэтому, теперь в именах всех переменных ошибка. В редакторе заменить не получается (код перестаёт работать). Приношу свои извинения.

Последний раз редактировалось Blondinka, 05.05.2015 в 16:37.
Ответить с цитированием
  #2 (permalink)  
Старый 05.05.2015, 19:33
Аватар для Sigizmund2012
Профессор
Отправить личное сообщение для Sigizmund2012 Посмотреть профиль Найти все сообщения от Sigizmund2012
 
Регистрация: 16.07.2014
Сообщений: 258

for(var k=0; k<100; k++){
13	            getXPositionOfElement();
14	            getYPositionOfElement();
15	            $("div.block"+k).offset({ top: y_position, left: x_position });
16	            alert(y_position);//не работает даже с getXPositionOfElement()
17	        }

Эти 2 функции вызываются и возвращают значения в никуда, попробуйте так:
for(var k=0; k<100; k++){
	            $("div.block"+k).offset({ top: getYPositionOfElement(), left: getXPositionOfElement() });
	            alert(y_position);	        }
Ответить с цитированием
  #3 (permalink)  
Старый 05.05.2015, 19:57
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Sigizmund2012, спасибо. Я изменила свою функцию, как вы предложили. Затем подставила главную строку в другой цикл.
$(".block"+currentCell).offset({ top: getYPositionOfElement(), left: getXPositionOfElement() });

Работает. Размещает случайные блоки на случайных координатах. Не все, но я это исправлю. Код на GitHub обновила.
Ответить с цитированием
  #4 (permalink)  
Старый 05.05.2015, 23:15
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Моя программа генерирует блоки-невидимки. Всего таких блоков 100. Но отображаются 0-10 штук. Кто-нибудь догадывается почему?
Ответить с цитированием
  #5 (permalink)  
Старый 05.05.2015, 23:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,039

Blondinka,
1. relative
2. порядок вставки на страницу
3. zIndex
Ответить с цитированием
  #6 (permalink)  
Старый 05.05.2015, 23:59
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

рони,
1. Меняла на absolute, но ничего не улучшилось (в плане отображения).
2. Элементу, который создаётся в цикле, присваивается случайное положение на мониторе в том же цикле.
for(var currentCell=0; currentCell<cellAmount; currentCell++){//Пока, текущая ячейка меньше общего количества ячеек.
                ...
		$(".block"+currentCell).css({'position': 'relative','top' : verticalIndent+"px",'left' : horizontalIndent+"px"});//Присвоить текущему элементу уникальную позицию. Если в этой строке применить "position: absolute;" - блоков с изображениями будет еще меньше.
		$(".block"+currentCell).offset({ top: getYPositionOfElement(), left: getXPositionOfElement() });//Задать координаты.
		verticalIndent = verticalIndent-cellSize;
	}
Или, что вы хотите сказать?
3. Так-же, установила z-index: 1000, с тем же результатом. Блоку #pazzleHolder (div, который должен содержать все мелкие элементы, тот что с черной границей) присвоила z-index: 0.

Эта же программа, но без случайно расположенных блоков - http://mangal.biz/test/04_05_backup_v2/
Если долго перемещать блоки, то можно собрать картинку , но это не удобно, потому что нужно постоянно скролить вниз. Интересно, почему?
Ответить с цитированием
  #7 (permalink)  
Старый 06.05.2015, 00:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,039

Blondinka,
зачем вам пазл? где-то идёт конкурс ?
Ответить с цитированием
  #8 (permalink)  
Старый 06.05.2015, 00:30
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

рони, хочу стать программистом. Придумываю себе задания.
А что за конкурс?
Ответить с цитированием
  #9 (permalink)  
Старый 06.05.2015, 00:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,039

Blondinka,
вам ненужно что-либо делать с классом картинок $(".block"+currentCell). вы их прячите тем самым внутри .pazzlePartHolder -- рандомизировать надо как раз этот класс.(над кодом можно ещё работать)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
body{
background-color: #eee;
}

.pazzlePartHolder{
width: 50px;
height: 50px;
overflow: hidden;
 position: absolute;
}

.topOfTheRow{
float: left;
display: inline-block;
display: inline;
}

#pazzleHolder{
margin-left: 25%;
border: 2px solid black;
width: 600px;
height: 600px;
}
</style>
<title>Pazzle</title>
</head>
<body>

<input type="button" value="start new game" onclick ="location.reload();" />
<input type="button" value="display random element position" onclick ="putPazzleInRandomXYCoordinats()" />

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
<script>$(document).ready(function(){
//Переменную cellSize не менять!!! Не присваивать ей ноль.
var cellSize = 50, //Размер ячейки.
    imgSize = 500, //Размер изображения.
	rowAmountConst = imgSize/cellSize, //Количество колонок. Будет задано одинаковое количество колонок и рядов.
	rowAmount = 0,//Количество колонок для счётчика, чтоб не менять основную переменную.
	currentRow = 0,//Текущий ряд.
	cellAmount = rowAmountConst*10, //Общее количество ячеек.
	horizontalIndent = 0,//Горизонтальный отступ.
	verticalIndent = 0;//Вертикальный отступ.
	//$(".pazzlePartHolder").css({"width":cellSize+"px", "height":cellSize+"px"});//Функция работает некорректно.
    $("body").append("<div id='pazzleHolder'>");//Открыть div, содержащий весь пазл.
    for(var currentCell=0; currentCell<cellAmount; currentCell++){//Пока, текущая ячейка меньше общего количества ячеек.
	    $("div#pazzleHolder").append("<div id="+currentCell+" class='pazzlePartHolder draggable'></div>");//Добавить блок, содержащий часть пазла.
        $("div#"+currentCell).append("<img src='http://mangal.biz/test/04_05_backup_v2/wallpaper.jpg' class='"+"block"+currentCell+"' alt='img' />");//В этот блок добавить img и присвоить уникальный класс "block"+i+.
		if(currentCell==0){//Если отображается первая ячейка, то задать ей нулевое смещение вверх.
		    $(".block"+currentCell).css({'position': 'relative','top' : 0+"px",'left' : 0+"px", 'padding':'0px'});
		}else if(currentCell==cellAmount)break;//Если цикл добрался до последней ячейки - завершить итерации.
		if(currentCell==rowAmount){
		    rowAmount+=rowAmountConst;//Если текущая ячейка равна концу ряда, то увеличить её на количество ячеек в ряду. Чтоб можно было сравнивать с крайними числами (например: 3, 6, 9, 12, 16).
			horizontalIndent=horizontalIndent-cellSize;//Сдвинуть координаты отступа (смещения) left.
			verticalIndent = 0;//...и top. Сдвинуть координаты в начало следующего столбца.
			$(currentCell).addClass("topOfTheRow");//Присвоить класс текущему элементу, благодаря чему, в стилях можно будет задать display: inline-block;, для данного класса.
		}
		$(".block"+currentCell).css({'position': 'relative','top' : verticalIndent+"px",'left' : horizontalIndent+"px"});//Присвоить текущему элементу уникальную позицию.
	//	$(".block"+currentCell).offset({ top: getYPositionOfElement(), left: getXPositionOfElement() });
		verticalIndent = verticalIndent-cellSize;
	}
	//$("body").append("</div>");


	for(var currentCell=0; currentCell<cellAmount; currentCell++){
	   //	$(".block"+currentCell).offset({ top: getYPositionOfElement(), left: getXPositionOfElement() });
	}
    $(".pazzlePartHolder").each(function(indx, element){
          $(this).css({top: getYPositionOfElement(), left: getXPositionOfElement()})

          });

	$( ".draggable" ).draggable();
});

	function getXPositionOfElement() {//Получить случайные координаты x окна браузера.
        var x_position = Math.floor(Math.random() * $(window).width());
	    return x_position;
    }

	function getYPositionOfElement() {//Получить случайные координаты y окна браузера.
        var y_position = Math.floor(Math.random() * $(window).height());
	    return y_position;
    }
	</script>
</body>

</html>

Последний раз редактировалось рони, 26.09.2018 в 15:42.
Ответить с цитированием
  #10 (permalink)  
Старый 06.05.2015, 01:08
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

рони, спасибо. Работает.
Ответить с цитированием
Ответ



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

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