Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Выводим слова в данной области из массива (https://javascript.ru/forum/jquery/66620-vyvodim-slova-v-dannojj-oblasti-iz-massiva.html)

Black_Star 27.12.2016 23:59

Выводим слова в данной области из массива
 
Добрый день уважаемые. Возник интерес реализовать такой эффект при помощи jQuery.
-Необходимо с периодичностью в 3сек генерировать в параграфы слова из массива, при этом каждое новое слово должно иметь свой цвет, свой размер и свое положение в пространстве окна браузера.
Условия:
1) Слова на экране браузера появляются в случайное время, но их должно быть не больше 10 Если одно слово появляется ( допустим opaciti 0 -> 1), то другое исчезает ( допустим opaciti 1 -> 0)
2) Слова которые создаются не должны попадать в область расположения блока. ( С этим у меня проблемы, не знаю как придумать правило проверки) Блок будет плавающим в пространстве через margin


Я начало кода набросал, а дальше меня застопорило.
<!DOCTYPE html>
<html lang="en">
<head>

	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

	<style type="text/css">
		body{
		position: relative;
		width: 100%;
		height: 100%;
	}

	.box{
		width: 200px;
		height: 200px;
		border: 1px solid #000;
		margin: 10% auto;
		text-align: center;		
	}

	.word{
		position: absolute;
		top: 20%;
		left: 20%;
		/*animation: wordLife 3s linear ;*/ /* подключить*/
		animation-fill-mode: forwards;
	}

@keyframes wordLife {
	0%{
		opacity: 0;
	}
	25%, 75%{
		
		opacity: 1;
	}

	100%{
		opacity: 0;
	}
}
	</style>
</head>

<body>
	<div class="box">block</div>
	<p class="word"></p>
	<script type="text/javascript">
		
		window.onload = function () {

		var arr = ["Test0", "sddfsdf", "Test2dfdf", "Test3dd", "Test4df", "Test5fsdf", "Test6sdf",];
		var len = arr.length - 1;

		var $box = $('.box'),
			boxW =$box.innerWidth(),
			boxH =$box.innerHeight(); 

        var $txt = $('p'),
            txtW = $txt.innerWidth(),
            txtH = $txt.innerHeight(); 

        var winW = $(window).width(),    
        	winH = $(window).height();


console.log(winW + " =w");
console.log(winH + " =h");

function randomInteger(min, max) {
    var rand = min - 0.5 + Math.random() * (max - min + 1)
    rand = Math.round(rand);
    return rand;
  };


  var randNum = randomInteger(0, len),
  	  randTextSize =  randomInteger(155, 400)/100,
  	  randR = randomInteger(0, 255),
  	  randG = randomInteger(0, 255),
  	  randB = randomInteger(0, 255),
  	  randTop = randomInteger(0, winH),
  	  radLeft = randomInteger(0, winW); 	

console.log( randR+ " =randR ");
console.log( randG+ " =randG ");
console.log( randB+ " =randB ");
console.log( randTextSize+ " =randTextSize ");


function createWord(){

	$txt.css({'fontSize' : randTextSize + 'em',
			   'color' : 'rgb( '+ randR + ',' + randG + ',' + randB +' )',
			   'top' :  randTop,
			   'left' : radLeft
			});
	$txt.text(arr[randNum]);

};
			
setInterval(createWord, 200);

}
	</script>
</body>
</html>

Вопрос
1)Почему у меня не создается новая строчка через каждый промежуток времени setInterval(createWord, 200);?
2) Почему у меня текст выбрасывает фиг знает куда, хотя я задаю значение top в промежутке от 0 до размеров окна браузера?
3) Как сделать что б сгенерированный текст не попадал в область блока(ни одной буквой)? :write:
Буду очень благодарен за пояснения

рони 28.12.2016 00:17

Black_Star,
http://javascript.ru/forum/misc/3512...tml#post230736

Dilettante_Pro 28.12.2016 10:30

Black_Star,
Цитата:

Сообщение от Black_Star
1)Почему у меня не создается новая строчка через каждый промежуток времени setInterval(createWord, 200);?

Создается, только все они одинаковые, т.к. все случайные параметры у вас задаются один раз, вне функции создания нового слова - посмотрите console.log

рони 28.12.2016 10:35

Цитата:

Сообщение от Dilettante_Pro
все случайные параметры у вас задаются один раз, вне функции создания нового слова

:yes:
<!DOCTYPE html>
<html lang="en">
<head>

  <meta charset="UTF-8">
  <title>Document</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

  <style type="text/css">
    body{
    position: relative;
    width: 100%;
    height: 100%;
  }

  .box{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    margin: 10% auto;
    text-align: center;
  }

  .word{
    position: absolute;
    top: 20%;
    left: 20%;
    /*animation: wordLife 3s linear ;*/ /* подключить*/
    animation-fill-mode: forwards;
  }

@keyframes wordLife {
  0%{
    opacity: 0;
  }
  25%, 75%{

    opacity: 1;
  }

  100%{
    opacity: 0;
  }
}
  </style>
</head>

<body>
  <div class="box">block</div>
  <p class="word"></p>
  <script type="text/javascript">

    window.onload = function () {

    var arr = ["Test0", "sddfsdf", "Test2dfdf", "Test3dd", "Test4df", "Test5fsdf", "Test6sdf",];
    var len = arr.length - 1;

    var $box = $('.box'),
      boxW =$box.innerWidth(),
      boxH =$box.innerHeight();

        var $txt = $('p'),
            txtW = $txt.innerWidth(),
            txtH = $txt.innerHeight();

        var winW = $(window).width(),
        	winH = $(window).height();


console.log(winW + " =w");
console.log(winH + " =h");

function randomInteger(min, max) {
    var rand = min + Math.random() * (max - min + 1)
    rand = Math.round(rand);
    return rand;
  };

function createWord(){
  var randNum = randomInteger(0, len),
  	  randTextSize =  randomInteger(155, 400)/100,
  	  randR = randomInteger(0, 255),
  	  randG = randomInteger(0, 255),
  	  randB = randomInteger(0, 255),
  	  randTop = randomInteger(0, winH),
  	  radLeft = randomInteger(0, winW);

console.log( randR+ " =randR ");
console.log( randG+ " =randG ");
console.log( randB+ " =randB ");
console.log( randTextSize+ " =randTextSize ");




  $txt.clone().css({'fontSize' : randTextSize + 'em',
         'color' : 'rgb( '+ randR + ',' + randG + ',' + randB +' )',
         'top' :  randTop,
         'left' : radLeft
      }).text(arr[randNum]).appendTo('body');
};

setInterval(createWord, 200);

}
  </script>
</body>
</html>

Dilettante_Pro 28.12.2016 10:55

рони,
Процесс пошел:)
Но почему вы, а не Black_Star?
(я про клоны специально промолчал, чтобы ТС подумал)

Black_Star 28.12.2016 14:02

Спасибо за подсказки. :thanks:

<!DOCTYPE html>
<html lang="en">
<head>

	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
	<link rel="stylesheet" type="text/css" href="style.css">

<style type="text/css">
	body{
		position: relative;
		width: 100vw;
		height: 100vh;
	}

	.box{
		width: 200px;
		height: 200px;
		border: 1px solid #000;
		position: absolute;
		top: calc(50% - 200px);
		left: calc(50% - 200px);
		text-align: center;		
	}


	p{	display: block;
		margin: 0;
		padding: 0;
		width: 50px;
		height: 50px;
	}
	.word{
		position: absolute;
		animation: wordLife 7s linear ; /* подключить*/
		animation-fill-mode: forwards;
	}

@keyframes wordLife {
	0%{
		opacity: 0;
	}
	25%, 75%{
		
		opacity: 1;
	}

	100%{
		opacity: 0;
	}
}

</style>>

</head>

<body>
	<div class="box">block</div>
	<p class="word"></p>

	<script type="text/javascript">
		    window.onload = function () {
 
    var arr = ["Test0", "Test1", "Test2", "Test3", "Test4", "Test5", "Test6", "Test7", "Test8", "Test9", "Test10", "Test11", "Test12"];
    var len = arr.length - 1;
 
    var $box = $('.box'),
      boxW =$box.innerWidth(),
      boxH =$box.innerHeight();
 
        var $txt = $('p'),
 	    txtW = $txt.innerWidth(),
            txtH = $txt.innerHeight(),      
            elements = 30; // сколько элементов я хочу что б показывало в окне браузера
 
        var winW = $(window).width(),
            winH = $(window).height();
 
 

 
function randomInteger(min, max) {
    var rand = min + Math.random() * (max - min + 1)
    rand = Math.round(rand);
    return rand;
  };
 
function createWord(){

  var randNum = randomInteger(0, len),
      randTextSize =  randomInteger(155, 400)/100,
      randR = randomInteger(0, 255),
      randG = randomInteger(0, 255),
      randB = randomInteger(0, 255),


      randTop = randomInteger(0, (winH - txtH)),
      radLeft = randomInteger(0, (winW - txtW));
 

 var txtValue =  $txt.clone().css({'fontSize' : randTextSize + 'em',
         'color' : 'rgb( '+ randR + ',' + randG + ',' + randB +' )',
         'top' :  randTop,
         'left' : radLeft 
      })

 txtValue.text(arr[randNum]).appendTo('body');


console.log( txtW  + " = txtW ");
console.log( txtH + " = txtH");
};
 


function limitWords () {


if ($('p').length <  elements) {
			createWord()			
 	} else{
 		$('p').first().remove();
 	}

}
setInterval(limitWords, 500);
}
</script>
	
</body>
</html>


Осталось непонятными два вопроса.
1) Как ограничить поле вывода слов размером экрана браузера. ( randTop = randomInteger(0, (winH - txtH)) работает как-то не правильно)
2) Как сделать так что б слова не наплывали поверх блока.
У ksa в примере как-то всё очень хитро записано, да и оно не совсем то что мне надо

ksa 28.12.2016 15:09

Цитата:

Сообщение от Black_Star
У ksa в примере как-то всё очень хитро записано

В каком примере? :blink:
У меня в этой теме нет примеров... :no:

рони 28.12.2016 15:35

ksa,
пост №2

ksa 28.12.2016 15:56

Цитата:

Сообщение от рони
пост №2

Вона че... 2013-тый год! :D
Цитата:

Сообщение от Black_Star
У ksa в примере как-то всё очень хитро записано

А чего там хитрого? :blink:
Цитата:

Сообщение от Black_Star
да и оно не совсем то что мне надо

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

Dilettante_Pro 28.12.2016 16:02

Black_Star,
Цитата:

Сообщение от Black_Star
У ksa в примере как-то всё очень хитро записано,

Не так уж и хитро, тем более, что у него ситуация там несколько проще - все создаваемые элементы заранее известного размера.
Вы пытаетесь использовать txtH и txtW - но эти переменные у вас определяются один раз и соответствуют значениям, прописанным в стиле для p, тогда как реальные размеры каждого слова разные.
И что в этой ситуации плохо - новые слова получают значения innerWidth() и innerHeight() после включения в DOM.
Как выкручиваться - ???

Black_Star 28.12.2016 18:45

Цитата:

Сообщение от Dilettante_Pro
Как выкручиваться - ???

:-? Не знаю.
Я уже понял, что задавать фиксированные размеры width и height было глуповато . Что до примера ksa , то я не вижу как его тут применить? У него получается что создаваемые блоки не пересекаются друг с другом. У меня они просто не должны пересекаться с одним блоком .box, и создаваться во всем остальном пространстве

ksa 29.12.2016 11:01

Цитата:

Сообщение от Black_Star
У него получается что создаваемые блоки не пересекаются друг с другом. У меня они просто не должны пересекаться с одним блоком .box

А друг с другом могут пересекаться?

Dilettante_Pro 29.12.2016 12:30

ksa,
Цитата:

Сообщение от ksa
А друг с другом могут пересекаться?

А можете сделать при таком условии?

Dilettante_Pro 29.12.2016 13:00

Black_Star,
вариант решения проблемы динамических размеров: создавать слова и включать в DOM невидимыми, показывать только прошедшие проверку на непересекаемость
Или вообще не проверять - блок вынести вперед

ksa 29.12.2016 13:37

Цитата:

Сообщение от Dilettante_Pro
А можете сделать при таком условии?

Дык я при любых условиях могу сделать... :D
Просто вопрос смысла делать что-то бесплатно. Всегда есть некий компромисс между "интересно", "бесплатно" и "времязатратно"... В данном случае не так интересно, чтобы делать бесплатно задачку, которая займет достаточно много времени...
Наверное денек на нее уйдет, по моим прикидкам. А это 8 часов... Даже если брать по 1000р за час, вряд ли ТС оплатит кому-либо 8т.р. за рабочий макет по его нуждам. :D

Black_Star 03.01.2017 13:07

Всем спасибо за подсказки. :thanks:
Придумал как решить данный вопрос разбив данный интервал на области видимости.
http://codepen.io/BlackStar1991/pen/bgGeqQ

Кому понадобится идея, такова.
1) Если случайное число по вертикале меньше чем верхняя точка блока или больше чем нижняя точка выводите текст как есть. (Учитывая размер шрифта)
2) Если по вертекали значение попадает в область блока (куда попадать не должно было) то пересчитывай горизонталь по формуле
RandomNumber = rand()%(100-(y-x));
if RandomNumber > x then RadomNumer +=(y-x);
Вообщем оно работает. :)
Есть конечно небольшие косяки, но результат меня устраивает :p


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