Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336

Поможем! Динамическая ПОДСВЕТКА элементов МЕЖДУ двумя другими в контейнере

24.01.2016, 20:56. Показов 2690. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как динамически подсвечивать ВСЕ элементы от Первого кликнутого элемента до Второго кликнутого?

Есть контейнер с элементами
1) Клик по любому элементу -> он получает два класса: marked и start.
marked - подсвечивает, start - указывает, что это первый граничный блок.
2) далее, как только курсор покидает элемент, начинается выделение ВСЕХ элементов вслед за курсором.
Например, кликнули на 2-й элемент, навели на 6-й -> подсветятся все элементы между ними (a именно: 3,4,5)
3) второй клик (на конечном элементе) - также подсвечивает его и он получает класс end (второй граничный блок).
4) в итоге будет МОНОЛИТНАЯ полоса подсвеченных элементов между start и end элементами.

Покороче:
Клик на элементе -> динамическая подсветка ПРОМЕЖУТКА между начальным элементом и тем элементом, под которым находится курсор -> клик по конченому элементу приводит к, так сказать, закреплению цепочки выделения.

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!doctype html>
<meta charset='utf-8'>
<title>Динамическое выделение элементов между граничными блоками</title>
<div id='parent' class='flex'>
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
<style>
 
#parent {
  margin: auto;
  width: 320px;
  cursor: default;
}
#parent > div {
  width: 40px;
  height: 40px;
  line-height: 40px;
  text-align: center;
}
#parent > div:nth-child(odd) {
  background: #ddd;
}
#parent > div:nth-child(2n) {
  background: #eee;
}
#parent > div:hover {
  background: hsl(31, 99%, 85%) !important;
}
.marked {
  background: hsl(31, 99%, 80%) !important;
}
 
.flex {
  display: flex;
}
</style>
 
<script>
var children = document.querySelectorAll('#parent > div');
for (var i = 0; i < children.length; i++) {
  children[i].addEventListener('click', function() {
    children.classList.toggle('marked', 'start');
    marker();
  });
}
</script>
Пригодится скрипт для получения номера элемента при наведении
JavaScript
1
2
3
4
5
6
7
8
var parent = document.getElementsByClassName('tabs_calendar')[0];
    parent.onmouseover = function (e) {
        var e = e || event;
        var target = e.target;
        for (var i = 0; i < parent.children.length; i++) {
            if (parent.children[i] == target) return console.log(i);
        }
  }
Ребята выручайте, очень нужно сделать! Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2016, 20:56
Ответы с готовыми решениями:

Находится ли дата между двумя другими датами
казалось бы задача вроде несложная, но что-то никак не могу понять в чём ошибка... имеется структура _DATE struct _DATE { int day;...

Проверить, находится ли слово между двумя другими
Нужно проверить, находится ли слово между двумя другими, т.е. например есть массив слов array('test','test2', 'hello'); Есть строка...

Вставить динамически созданный TableRow между двумя другими
Динамически создаю TableRow. Но мне нужно не добавлять эту строку к TableLayout, а вставить между существующими. Как это сделать?

10
 Аватар для arcmag
347 / 322 / 203
Регистрация: 27.06.2014
Сообщений: 762
24.01.2016, 22:04
хз вот можете вот можете мой скрипт попробовать то не то...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        function backlight (selector) {
            var elems = document.querySelectorAll (selector),
                f = function () {
                    var p = this.parentNode, c = p.children, start, end, v,
                        getIndex = function (elm) {
                            for (var i = 0; i < c.length; i++) if (c[i] === elm) return i;
                        },
                        check = function (s, e) {
                            for (var i = 0; i < c.length; i++) c[i].style.background = (i >= s && i <= e) ? "red" : "";
                        };
                    if (this.hasAttribute ("data-backlight")) {
                        check (-1, -1);
                        this.removeAttribute ("data-backlight");
                        return;
                    }
                    if (!p.querySelector ("[data-backlight='start']")) {
                        this.setAttribute ("data-backlight", "start");
                        if (!p.querySelector ("[data-backlight='end']")) return;
                    }
                    if (!p.querySelector ("[data-backlight='end']")) this.setAttribute ("data-backlight", "end");
                    start = getIndex (p.querySelector ("[data-backlight='start']"));
                    end = getIndex (p.querySelector ("[data-backlight='end']"));
                    if (start > end) { v = end; end = start; start = v; }
                    check (start, end);
                };
            [].forEach.call(elems, function (e) {e.addEventListener ("click", f)});
        };
        window.addEventListener ("load", function () {
            backlight ("#parent > div");
        });
1
 Аватар для smart-drone
22 / 18 / 14
Регистрация: 07.01.2016
Сообщений: 70
24.01.2016, 22:12
Teamur, я так понял, нужен рейтинг(типа звездочки). Делается это и без js, нужно просто пораскинуть мозгом. В html есть элементы, которые сохраняют свое состояние(checkbox, radio), а так же есть псевдокласс CSS который включает правила для элемента при наведении на него курсором(:hover). Вот пример https://jsfiddle.net/hma21mxm/

Не по теме:

Нафига этот клич "Поможем!"? очень это неприятно, будто рекламное обращение к потреблянии.

1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
25.01.2016, 20:40  [ТС]
arcmag, близко, но всё-таки нет.

Нужно так:
Если после певрвого клика переместить курсор на 2й элемент он должен закраситься, далее например двигаем к 6му -> закрашивается все что находится между элементом, который мы кликнули первый раз, и 6м должно закрасится.

По сути подобное происходит при выделении текста курсором. Вы зажимаете мышь, отводите ее и что?
Вы ВИДИТЕ процесс, вы видите как увеличивается область выделения, видите выделение текста (синий фон выделения движется за курсором).
Отличие лишь в том, что вместо букв здесь блоки!
Спасибо!

Добавлено через 3 минуты
smart-drone, я больше так ("Поможем ...") не буду, извиняюсь!
Да, вы правы по сути те же звездочки.

Добавлено через 7 минут
smart-drone, посмотрел я пример, Вообще СУПЕР!
Блин. Хотелось бы обойтись без чекбоксов, радиокнопок, лэйблов. Чисто работа с DIV.
Неделю парюсь, не выходит!
Думал как. Сначала получу номер элемента по клику. запишу в переменную, мол var = start
Потом при наведении на другие элементы, получать их порядковые номера и прибавлять разницу. Но получилась зад..ца (

Добавлено через 9 минут
Звездочки звездочками, но все должно работать также и СПРАВА НАЛЕВО!
Поэтому всё-таки нужен скрипт.

Добавлено через 19 часов 59 минут
Какие еще будут предложения, господа.

Добавлено через 2 часа 3 минуты
Воооот, такие дела...
0
123 / 62 / 32
Регистрация: 10.01.2014
Сообщений: 241
26.01.2016, 19:10
Teamur,
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <!-- <script src="https://code.jquery.com/jquery-2.2.0.js"></script> -->
        <!-- <link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css" /> -->
        <!-- <link rel="stylesheet" href="/css/main.css"> -->
        <style>
            [class^="elem"] {
                width: 100px;
                height: 100px;
                background-color: #f00;
                display: inline-block;
            }
            .start {
                background-color: #000;
            }
            .color {
                background-color: #000;
            }
        </style>
    </head>
    <body>
    <div class="rate-elems">
        <div class="elem1"></div>
        <div class="elem2"></div>
        <div class="elem3"></div>
        <div class="elem4"></div>
        <div class="elem5"></div>
        <div class="elem6"></div>
        <div class="elem7"></div>
        <div class="elem8"></div>
        <div class="elem9"></div>
        <div class="elem10"></div>
    </div>
    </body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var elems       = document.body.querySelectorAll("[class^='elem']"),
    arrElems    = [].slice.call(elems);
 
 
for (var i = 0; i < elems.length; i++) {
    var start;
    var elem = elems[i];
 
    elem.addEventListener("click", function (e) {
        // если есть элемент с классом start
        if(document.body.querySelector(".start")) {
            // и отсутствует элемент с классом .stop
            if(!document.body.querySelector(".stop")) {
                // добавляем
                e.target.classList.add("stop");
 
                // убираем все eventListeners можно mouseenter
                // было бы вынести в function definition и удалять
                // обычным путем
                arrElems.forEach( function(element, index) {
                    var elementClone = element.cloneNode(true);
                    element.parentNode.replaceChild(elementClone, element);
 
                });
            }
        } else {
            start = e.target;
            e.target.classList.add("start");
        };
    });
 
    elem.addEventListener("mouseenter", function (e) {
        // если есть элемент с классом старт
        if(document.body.querySelector(".start")) {
 
            var startIndex = arrElems.indexOf(start);
            var stopIndex = arrElems.indexOf(e.target);
 
            // если индекс больше индекса остановки 
            // меняем местами
            if(startIndex > stopIndex) {
                var cache = stopIndex;
                stopIndex = startIndex + 1;
                startIndex = cache;
            } else {
                stopIndex += 1;
            }
 
            // получаем все что между этими двумя индексами
            var arrBetween = arrElems.slice(startIndex, stopIndex);
            arrBetween.forEach( function(element, index) {
                // класс подсветки
                element.classList.add("color");
                // убрали курсор ==> удалили класс подсветки
                element.addEventListener("mouseout", function (e) {
                    e.target.classList.remove("color");
                });
            });
        };
    });
};
https://jsfiddle.net/e5cbuoxf/
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
26.01.2016, 20:59  [ТС]
scio me nescire, вот это да! класс! ) А как теперь сделать, чтобы вне контейнера rate-elems выделенное сбрасывалось?

А так происходит разрыв цепочки:
1) клик на первом элементе
2) наводим на пятый
3) спускаем курсор вниз за контейнер (rate elems)
4) теперь подводим курсор снизу и поднимаем его на второй элемент
5) спускаем курсор вниз со второго элемента -> разрыв цепочки
0
123 / 62 / 32
Регистрация: 10.01.2014
Сообщений: 241
27.01.2016, 03:51
Teamur,
уверен, можно уложиться в строк 30, но у меня на часах 4 ночи, так что пофиг
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
var elems       = document.body.querySelectorAll("[class^='elem']"),
    arrElems    = [].slice.call(elems),
    rateElems   = document.body.getElementsByClassName("rate-elems")[0];
 
rateElems.addEventListener("mouseleave", function (e) {
    if(!document.body.querySelector(".stop")) {
        arrElems.forEach( function(element, index) {
            element.classList.remove("color");
        });
    } else {
        return;
    }
});
 
 
for (var i = 0; i < elems.length; i++) {
    var start;
    var elem = elems[i];
 
    elem.addEventListener("click", function (e) {
        // если есть элемент с классом start
        if(document.body.querySelector(".start")) {
            // и отсутствует элемент с классом .stop
            if(!document.body.querySelector(".stop")) {
                // добавляем
                e.target.classList.add("stop");
            }
        } else {
            start = e.target;
            e.target.classList.add("start");
        };
    });
 
    elem.addEventListener("mouseenter", mouseoverListener);
};
 
function mouseoverListener (e) {
    if(document.body.querySelector(".stop")) return;
    if(document.body.querySelector(".start")) {
 
        var startIndex = arrElems.indexOf(start);
        var stopIndex = arrElems.indexOf(e.target);
 
        if(startIndex > stopIndex) {
            colorizeBetween(startIndex, stopIndex, "left");
 
        } else if (startIndex < stopIndex) {
            
            colorizeBetween(startIndex, stopIndex, "right");
        } else {
            arrElems.forEach( function(element, index) {
                element.classList.remove("color");
            });
        }
 
        function colorizeBetween (startIndex, stopIndex, direction) {
            if (direction === "right") {
                var stopIndex = stopIndex + 1;
                var arrBetween = arrElems.slice(startIndex, stopIndex);
                arrBetween.forEach( function(element, index) {
                    element.classList.add("color");
                });
 
                var arrLeftToStart = arrElems.slice(0, startIndex);
                arrLeftToStart.forEach( function(element, index) {
                    element.classList.remove("color");
                });
 
                var arrStopToEnd = arrElems.slice(stopIndex, arrElems.length);
                arrStopToEnd.forEach( function(element, index) {
                    element.classList.remove("color");
                }); 
            } else {
                var sta = startIndex;
                var sto = stopIndex;
                var startIndex = sto;
                var stopIndex = sta;
 
                var arrBetween = arrElems.slice(startIndex, stopIndex);
 
                var arrStartToRight = arrElems.slice(startIndex, arrElems.length);
                arrStartToRight.forEach( function(element, index) {
                    element.classList.remove("color");
                });
 
 
                arrBetween.forEach( function(element, index) {
                    element.classList.add("color");
                });
 
                var arrStopToEnd = arrElems.slice(0, startIndex);
                arrStopToEnd.forEach( function(element, index) {
                    element.classList.remove("color");
                }); 
            };
        };
    };
};
https://jsfiddle.net/e5cbuoxf/6/
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.01.2016, 19:08  [ТС]
Да вы просто мастер, спасибо!
scio me nescire, спать всё-таки нужно! ) Восстанавливайтесь...
Пожалуйста, если найдете в себе силы, попробуйте сократить код!
Считаю что будет очень полезно сравнить исходный вариант и сокращенный. Понять засчет чего можно сократить и упростить код!

Добавлено через 13 минут
И последнее, что очень хотелось бы реализовать: Третий клик по элементу, когда цепочка уже выделена, сбрасывает её. И, следовательно, снова появляется возможность выделить интервал.
0
123 / 62 / 32
Регистрация: 10.01.2014
Сообщений: 241
27.01.2016, 19:41
Teamur,
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function makeCounter() {
    // замыкание
  function counter() {
    return counter.currentCount++;
  };
  
  counter.currentCount = 1;
 
  return counter;
}
var counter = makeCounter();
 
rateElems.addEventListener("click",function(e){
    // counter должен стоять в самом начале, иначе после первого false
  // выполнение до него не дойдет, счетчик не будет увеличен и будут ошибки
    if(counter() % 3 === 0 && document.body.querySelector(".start") 
            && document.body.querySelector(".stop")) {          
    arrElems.forEach(function(element, index){
        element.classList.remove("start", "stop", "color");
    });
  };
});
https://jsfiddle.net/e5cbuoxf/7/
1
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
27.01.2016, 22:26  [ТС]
scio me nescire, всё замечательно! Получилось аж 22 строки с комментариями.
Вот смотрите. я выделил интервал. Потом делаю клик по любому элементу и тут же он должен стать черного цвета. Другими словами сразу же должно начаться новое выделение. Следовательно третий по счету клик создает новое выделение. Было бы просто замечательно. Спасибо!

Добавлено через 21 минуту
Без массивов - это конечно круто! )) Неожидал.
Я предполагал, что будет работать по такой схеме:
1. По наведению на элемент контейнера, скрипт получает порядковый номер элемента в нем;
2. По клику - записывает его в переменную, например start=2 (где 2 - номер) и запускает Listener, реагирующий на наведение
3. По наведении на конечный элемент end, скрипт также получает его порядковый номер, например 7й
4. Затем счётчиком присваивает классы элементам от 2 до 7
Как-то так
0
 Аватар для Teamur
29 / 29 / 5
Регистрация: 06.01.2015
Сообщений: 336
31.01.2016, 13:04  [ТС]
Как же сократить код товарища scio me nescire, https://jsfiddle.net/e5cbuoxf/7/
Плюс третий клик должен перезапускать функцию = начать новое выделение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.01.2016, 13:04
Помогаю со студенческими работами здесь

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

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

Выбрать даты в StringGrid находящиеся между двумя другими датами
Добрый день. Подскажите пожалуйста как решить следующую задачу. У меня имеется две даты: дата начала периода и дата конца периода...

Поместить блок между двумя другими, посредство только css
Доброго времени суток! необходимо при помощи только css выровнять блок между двумя другими.

Вывести элементы массива, которые находится между двумя другими
Собственно сабж Есть массив, есть индексы двух его элементов. Нужно вывести все элементы массива, которые находится между двумя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru