Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 31.01.2016, 15:54
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Наверное так .
box.onmouseout = function() {
  el.classList.remove('blue');
  a.classList.add('blue');
}

Последний раз редактировалось Teamur, 31.01.2016 в 16:03.
Ответить с цитированием
  #22 (permalink)  
Старый 31.01.2016, 17:03
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Код легко оптимизируется, однако лень.

<div id='box'>
  <div id='e1' class='el'>1</div>
  <div class='el'>2</div>
  <div class='el'>3</div>
  <div class='el'>4</div>
  <div class='el'>5</div>
  <div class='el'>6</div>
  <div class='el'>7</div>
  <div class='el'>8</div>
  <div class='el'>9</div>
  <div class='el'>X</div>
</div>
<style>
  body {
    display: flex;
    margin: 0;
    height: 100vh;
    background: #56bddc;
  }
  #box {
    display: flex;
    margin: auto;
    box-shadow: 0 0 5px hsla(0, 0%, 0%, .25);
  }
  .el {
    width: 60px;
    line-height: 60px;
    font-family: consolas;
    font-size: 30px;
    text-align: center;
    cursor: pointer;
    background: #fff;
    -webkit-user-select: none;
    -moz-user-select: none;
  }
  .mark { background: #fece9a; }
  .blue { background: blue;  }
</style>

<script>
	
	var CSSClass = {};
	CSSClass.is = function(e,c){
		var classes = e.className;
		return e.className.search("\\b" + c +"\\b") != -1;
	}
	CSSClass.add = function(e,c)
	{
		if (CSSClass.is(e,c)) return;
		if (e.className) c = ' ' + c;
		e.className += c;	
	}
	CSSClass.remove = function(e,c)
	{
		e.className = e.className.replace(new RegExp("\\b" + c+"\\b\\s*", "g"), '');	
	}
	
	function positionChild(node)
	{
		var pos = 1;
		for (var x = node.parentNode.firstChild; x != null; x = x.nextSibling, pos++  )
		{
			if ( x.id == node.id && x.nodeType == 1 ) { return pos; break; }	
		}
	}
		
	function byPass(startDiv,endDiv)
	{
		for ( var x = startDiv; x != endDiv.nextSibling  ;  x = x.nextSibling )
		{
			CSSClass.add(x,'mark');
			CSSClass.remove(x,'blue');
		}		
	}
	
	function init()
	{
		var div = document.getElementById('box');
		for (var x = div.firstChild; x != null; x = x.nextSibling)
		{
			x.className = 'el';	
			x.id = '';
		}
	}
	
	function stopped()
	{
		start = false;
		end = true;	
	}
	
	
	var start, end;
	var startDiv, endDiv;
	
	document.getElementById('box').onclick = function(e){
		var e = e || event;
		var target = e.target;
		if (!start) 
		{
			init(); 
			start = true; 
			end = false; 
			target.id = 'start';
			CSSClass.add(target,'mark');
			startDiv = document.getElementById('start');
		} 
		else
		{
			var startChildPosition, endChildPosition;
			if (!end) 
			{ 
				end = true;
				if (target.id == 'start')
				{
					CSSClass.add(target, 'mark');
				}
				else
				{ 
					target.id = 'end';
					startDiv = document.getElementById('start');
					endDiv = document.getElementById('end');
					startChildPosition = positionChild(startDiv);
					endChildPosition = positionChild(endDiv);
					if (startChildPosition < endChildPosition) byPass(startDiv,endDiv);
					else byPass(endDiv,startDiv);
				}
			} 
			 
		stopped();
		}
	}
	
	document.getElementById('box').onmouseover = function(e){
		var e = e || event;	
		var target = e.target;
		if (start)
		{
			if (target.id != 'start')
			{ 
				target.id = 'currNode';
				if ( positionChild(target) > positionChild(startDiv) )
				{
					for (var x = startDiv.nextSibling; x != target.nextSibling; x = x.nextSibling)
					{
						CSSClass.add(x,'blue');	
					}
				}
				else
				{
					for (var x = startDiv.previousSibling; x != target.previousSibling; 
						x = x.previousSibling)
					{
						CSSClass.add(x,'blue');	
					}	
				}
				target.id = '';
			}
		}
	}
	document.getElementById('box').onmouseout = function(e){
		var e = e || event;	
		var target = e.target;
		if (start && !end)
		{
                    for (var x = target.parentNode.firstChild; x != null; x = x.nextSibling)
				{
					if (x.id != 'start') CSSClass.remove(x,'blue');	
				}			
                    if (target.id != 'start')
			{ 
				if( CSSClass.is(target,'blue'))
				{
				 CSSClass.remove(target,'blue');
				}
			}
		}
	}

</script>

Последний раз редактировалось destus, 31.01.2016 в 18:02.
Ответить с цитированием
  #23 (permalink)  
Старый 31.01.2016, 17:39
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

destus,
Спасибо за усилия. Спасибо за гиперскрипт. Пойду-ка пройдусь, надо положить за интернет...))))
Ответить с цитированием
  #24 (permalink)  
Старый 31.01.2016, 17:44
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

При выведении курсора за контейнер, вся синева исчезает кроме того элемента по которому кликнули первым, то есть, если нужно выделить интервал от 2 до 7, это значит что если кликнуть по 2-му элементу - он станет синим. Потом если сдвинуть курсор до элемента 7, находясь в контейнере, а затем спустить курсор вниз за пределы контейнера, синька должна исчезнуть со всего диапазона, кроме элемента 2, так как он был кликнут первым. Вот такая расшифровка у меня... )))))
Ответить с цитированием
  #25 (permalink)  
Старый 31.01.2016, 18:02
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Сообщение от Teamur Посмотреть сообщение
При выведении курсора за контейнер, вся синева исчезает кроме того элемента по которому кликнули первым, то есть, если нужно выделить интервал от 2 до 7, это значит что если кликнуть по 2-му элементу - он станет синим. Потом если сдвинуть курсор до элемента 7, находясь в контейнере, а затем спустить курсор вниз за пределы контейнера, синька должна исчезнуть со всего диапазона, кроме элемента 2, так как он был кликнут первым. Вот такая расшифровка у меня... )))))
Ну так это легко лечится. Запустите скрипт из моего поста выше.
Ответить с цитированием
  #26 (permalink)  
Старый 31.01.2016, 18:46
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

destus,
Во, то что надо! Вы всё правильно поняли. Молодец! )
Осталось одно лишь - сократить! Будем разбираться как работает.
Ответить с цитированием
  #27 (permalink)  
Старый 31.01.2016, 19:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,125

Сообщение от destus
синька должна исчезнуть со всего диапазона, кроме элемента 2
что - то этого не наблюдаю
Ответить с цитированием
  #28 (permalink)  
Старый 31.01.2016, 19:12
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Господа, давайте элементу a (первый кликнутый) присвоим например красный цвет, а конечному элементу b - зеленый. А сам интервал будет синим. К тому же в стилях можно будет задать любые цвета по желанию. Можно взять цвета помягче, чтобы не резало глаза. Начальный элемент выделения (a) - pink, конечный (b) - lightgreen, а промежуток - #ccc, например. Промежуток обзовем range.

Вешаем на детей контейнера box обработчики клика:

var el = document.querySelectorAll('.el');
for (var i = 0; i < el.length; i++) {
el[i].addEventListener('click', selectRange);
}

selectRange() {
var a, b, range;
1) Получить номер элемента a и записать его в переменную
2) Добавить обработчик наведения на элементы, а затем сразу же динамически получать номер элемента при наведении, записывать его в переменную b.
3) пройтись циклом from a to b
}

Вот что я знаю и могу на Javascript. Всё, ребята. Поэтому и сижу, жду ответа, как сказал рони.
Надеюсь что все закончится хорошо. ))))

Последний раз редактировалось Teamur, 31.01.2016 в 19:29.
Ответить с цитированием
  #29 (permalink)  
Старый 31.01.2016, 19:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,125

Teamur,
даёшь градиент!!!
Ответить с цитированием
  #30 (permalink)  
Старый 31.01.2016, 19:34
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Эх была ни была, градиенты, тени, скругления.
А если серьезно, обойдемся и без них. Ведь простое всегда можно усложнить, а вот наоборот - невсегда...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jq выбор элементов межу двумя другими diakon Общие вопросы Javascript 9 10.09.2013 14:58