Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.12.2016, 23:59
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Выводим слова в данной области из массива
Добрый день уважаемые. Возник интерес реализовать такой эффект при помощи 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) Как сделать что б сгенерированный текст не попадал в область блока(ни одной буквой)?
Буду очень благодарен за пояснения
Ответить с цитированием
  #2 (permalink)  
Старый 28.12.2016, 00:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Black_Star,
Добавление непересекаемых блоков на страницу
Ответить с цитированием
  #3 (permalink)  
Старый 28.12.2016, 10:30
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Black_Star,
Сообщение от Black_Star
1)Почему у меня не создается новая строчка через каждый промежуток времени setInterval(createWord, 200);?
Создается, только все они одинаковые, т.к. все случайные параметры у вас задаются один раз, вне функции создания нового слова - посмотрите console.log
Ответить с цитированием
  #4 (permalink)  
Старый 28.12.2016, 10:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

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

<!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>
Ответить с цитированием
  #5 (permalink)  
Старый 28.12.2016, 10:55
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

Последний раз редактировалось Dilettante_Pro, 28.12.2016 в 11:03.
Ответить с цитированием
  #6 (permalink)  
Старый 28.12.2016, 14:02
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

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

<!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 в примере как-то всё очень хитро записано, да и оно не совсем то что мне надо
Ответить с цитированием
  #7 (permalink)  
Старый 28.12.2016, 15:09
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Black_Star
У ksa в примере как-то всё очень хитро записано
В каком примере?
У меня в этой теме нет примеров...
Ответить с цитированием
  #8 (permalink)  
Старый 28.12.2016, 15:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

ksa,
пост №2
Ответить с цитированием
  #9 (permalink)  
Старый 28.12.2016, 15:56
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от рони
пост №2
Вона че... 2013-тый год!
Сообщение от Black_Star
У ksa в примере как-то всё очень хитро записано
А чего там хитрого?
Сообщение от Black_Star
да и оно не совсем то что мне надо
- там есть генерация элементов
- генерация цвета
- случайное позиционирование в определенной области
- проверка на пересечение
Т.ч. достаточно много чего, что тебе пригодилось бы...
Ответить с цитированием
  #10 (permalink)  
Старый 28.12.2016, 16:02
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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



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

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