Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 4

Смена изображения через 2-3 секунды при зажатой кнопке мыши

10.02.2021, 12:43. Показов 1983. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые! Есть код :
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
window.onload = function () {
    var imgArr = [];
 
    for (var i = 0; i < 45; i++) {
      imgArr[i] = new Image();
 
      imgArr[i].src = "./assets/imgCar/" + i + ".jpg";
    }
 
    var targetImage = document.getElementsByClassName("review")[0];
    //первоначально старую координату Х считаем нулевой
    var oldX = 0;
    var touchX = 0;
    //счетчик текущего изображения
    var count = 0;
 
    //
    targetImage.ondragstart = function (e) {
      //return false;//1й вариант
      e.preventDefault(); //2й вариант
    };
    //по нажатию клавиши подключаем обработчик mousemove
 
    targetImage.onmousedown = function () {
      targetImage.style.cursor = "ew-resize";
 
      targetImage.addEventListener("mousemove", handler);
 
      //targetImage.onmousemove = handler; //второй вариант подключения обработчика
    };
    //отпускаем клавишу - отключаем обработчик mousemove
    window.onmouseup = function () {
      targetImage.style.cursor = "pointer";
      targetImage.removeEventListener("mousemove", handler);
      //targetImage.onmousemove = null;  //второй вариант отключения обработчика
    };
    targetImage.addEventListener("touchmove", handlerMob);
    targetImage.removeEventListener("touchend", handlerMob);
 
    //действие при нажатой клавише мыши
 
    function handler(e) {
      //если текущая координата мыши больше старой (курсор находится правее), то меняем картинку на следующую
      console.log(e);
 
      if (e.pageX > oldX) {
        if (++count > 44) {
          count = 0;
        }
      } else {
        //если текущая координата мыши меньше старой (курсор находится левее), то меняем картинку на предыдущую
        if (--count < 0) {
          count = 44;
        }
      }
 
      this.src = imgArr[count].src;
 
      oldX = e.pageX;
    }
 
    function handlerMob(e) {
      const touch = e.changedTouches[0];
      const target = document.elementFromPoint(touch.clientX, touch.clientY);
      if (target > touchX) {
        if (++count > 44) {
          count = 0;
        }
      } else {
        //если текущая координата мыши меньше старой (курсор находится левее), то меняем картинку на предыдущую
        if (--count < 0) {
          count = 44;
        }
        this.src = imgArr[count].src;
 
        touchX = e.target;
      }
    }
  };
Что, необходимо и куда добавить чтобы изображения при движении мыши листались плавно, пробовала
JavaScript
1
var d= parseInt( Date.now()/1000);
и после к d прибавлять 2000, потом условие в функции hadler if(d) и дальше исполнения кода, но так не работает. Подскажите начинающему товарищу, спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2021, 12:43
Ответы с готовыми решениями:

Фриз приложения при зажатой кнопке мыши
Здравствуйте, проблема такая. Есть скроллбар, в какой то момент он становится недоступным enable:=false, но если в этот момент мы управляли...

PaintBox: рисование кривой при зажатой кнопке мыши
Разработайте приложение из одной формы, разместив на форме компонент Panel, а на Panel – компонент PaintBox. Запрограммируйте перемещение...

Выполнять функцию при зажатой правой кнопке мыши
if (Key.isDown(Key.ESCAPE)) { /* */ } как сделать что так же, только заместо ескейта была правая кнопка мыши или левая? (PS возможно ли...

6
 Аватар для web_coder2
755 / 359 / 100
Регистрация: 04.10.2018
Сообщений: 548
10.02.2021, 15:28
Привет valeridragon,

PHP/HTML
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
<!DOCTYPE html>
<html>
 
<head>
    <title></title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <style>
        *{
            margin: 0;
            padding: 0;
        }
    </style>
</head>
 
<body>
    <button>push me during 2 sec </button>
    <div id="image" style='width:300px; height: 300px;'></div>
    <script>
    /**
     * функция генератор случайных чисел
     * @param  {Number} min [description]
     * @param  {Number} max [description]
     * @return {[type]}     [description]
     */
    const r = (min = 200, max=255) => Math.floor(min + Math.random() * (max + 1 - min))
 
    /**
     * функция генератор цветов фона для картинок
     * @param  {[type]} _ [description]
     * @return {[type]}   [description]
     */
    const c = (s, ...c) => {
        let str = ""
        s.forEach((t, i) => (str +=t, str +=c[i] ? r() : ""))
        return str
    }
 
    //вставляем изображения в контейнер id="image"
    const img = document.querySelector("#image")
    for(let i =0; i < 40; i++){
        img.insertAdjacentHTML("afterbegin", `<img height="300px" width="300px" style="background: ${c`rgb(${1},${1},${1})`}; display: none;"/>`)
    }
 
    /**
     * обработчик смены картинок
     */
    const m = (img => {
        let timeout = 2000
        let timer
        let indx = 1
        let imgs = [...img.children]
        imgs[0].style.display = "inline"
        const g = _ =>{
           if (indx == imgs.length) {
                indx = 0
            }
            imgs.forEach(e => e.style.display = "none")
            imgs[indx].style.display = "inline"
            indx++
        }
        return e => {
            if (e.type == "mousedown" || e.type == "pointerdown") {
                if (!timer)
                    timer = setInterval(_ => g(), timeout)
            } else {
                if(timer){
                  clearInterval(timer)
                  timer = 0
                }
            }
        }
    })(img)
    const b = document.querySelector("button")
 
    b.onmousedown = b.onpointerdown = b.onpointerup = b.onmouseup = b.onmouseleave = b.onpointerleave = b.onmouseout = b.onpointerout = m
    </script>
</body>
 
</html>

Астрологи объявили неделю кнопок и ротаций с задержкой количество тем увеличится минимум в трое =)
1
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 4
10.02.2021, 17:33  [ТС]
Благодарю за ответ, но в вашем коде все происходит при клике по кнопке, у меня же блок, в котором уже есть одно изображение и оно динамически меняется при ведении мыши влево или в право, вот мне эту смену картинок нужно сделать плавнее(медленнее) ,а как до блондинки не дойдет:-)
0
 Аватар для web_coder2
755 / 359 / 100
Регистрация: 04.10.2018
Сообщений: 548
10.02.2021, 18:34
valeridragon, если я правильно понял Вам нужен слайдер с возможностью плавного перетаскивания слайдов,

Цитата Сообщение от valeridragon Посмотреть сообщение
у меня же блок, в котором уже есть одно изображение и оно динамически меняется при ведении мыши влево или в право
именно перетаскивание плавнее можно сделать через requestAnimationFrame и например еще вариант кликаешь просто на фотку а она плавно меняется через CSS transition
Вопрос : а что означает тогда
Цитата Сообщение от valeridragon Посмотреть сообщение
Смена изображения через 2-3 секунды при зажатой кнопке мыши

Т.е. в каком месте это нужно?
0
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 4
10.02.2021, 18:54  [ТС]
В том блоке, где и есть это изображение, на нем зажимаешь кнопку мыши и пошли влево или в право вести мышку и тогда происходит смена картинок, но очень быстро....
0
 Аватар для web_coder2
755 / 359 / 100
Регистрация: 04.10.2018
Сообщений: 548
11.02.2021, 08:52
Лучший ответ Сообщение было отмечено valeridragon как решение

Решение

Доброе утро valeridragon,

слайд меняется по клику и петаскиванием в обе стороны, и если 2 сек удерживать мышку с нажатой лкм слайд сам поменяется

PHP/HTML
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
<!DOCTYPE html>
<html>
 
<head>
    <title></title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    html, body{
        height: 100%;
    }
    #images {
        position: relative;
        overflow: hidden;
    }
 
    #images img {
        position: absolute;
    }
 
    body {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }
    </style>
</head>
 
<body>
    <div id="images" style='width:300px; height: 300px; position: relative'></div>
    <script>
    /**
     * функция генератор случайных чисел
     * @param  {Number} min [description]
     * @param  {Number} max [description]
     * @return {[type]}     [description]
     */
    const r = (min = 200, max = 255) => Math.floor(min + Math.random() * (max + 1 - min))
 
    /**
     * функция генератор цветов фона для картинок
     * @param  {[type]} _ [description]
     * @return {[type]}   [description]
     */
    const c = (s, ...c) => {
        let str = ""
        s.forEach((t, i) => (str += t, str += c[i] ? r() : ""))
        return str
    }
 
    //вставляем изображения в контейнер id="image"
    const img = document.querySelector("#images")
    for (let i = 0; i < 4; i++) {
        img.insertAdjacentHTML("afterbegin", `<img height="300px" width="300px" style="background: ${c`rgb(${1},${1},${1})`}; top: 0px; left: 0px; display: none;"/>`)
    }
 
    /**
     * обработчик смены картинок
     */
    const m = (img => {
 
        let indx = 0
        let imgs = [...img.children]
        //Обновление картинок
        const updateImages = () => {
 
            if (indx == imgs.length) {
                indx = 0
            }
            imgs[indx].style.display = "inline"
            imgs[indx].style.zIndex = "1"
 
            imgs.forEach( (e, i) => {
                if(i == indx)
                    return
                e.style.display = "none"
                e.style.top = "0px"
                e.style.left = "0px"
                e.style.zIndex = ""
            })
 
            let next = indx + 1 == imgs.length ? 0 : indx + 1
 
            imgs[next].style.display = "inline"
            imgs[next].style.zIndex = "0"
            indx++
        }
 
        let target = null
        updateImages()
 
        // Перетаскивание
        const d = (_ => {
            let _disable = false
            let _coordMouseDownX = 0
            const _mousedown = e => {
                if (!target || _disable)
                    return
                _coordMouseDownX = e.clientX
            }
 
            const _drag = e => {
                if (!target || _disable)
                    return
                a.updateOffsetX(e.clientX - _coordMouseDownX)
            }
            return {
                mousedown: e => _mousedown(e),
                drag: e => _drag(e),
                disable: () => _disable = true,
                enable: () => _disable = false
            }
        })()
 
        /**
         * анимация
         * @param  {Function} _ [description]
         * @return {[type]}     [description]
         */
        const a = (_ => {
            let _aniID = null
            let _autoStop = null
            let _offsetX = 0
            let _timeoutFrameAni = null
            const _stopAni = () => {
                cancelAnimationFrame(_aniID)
                _offsetX = 0
                target = _aniID = _autoStop = _timeoutFrameAni = null;
                updateImages()
            }
            const _upadteAni = () => {
 
                let left = +target.style.left.slice(0, -2)
                switch (true) {
                    case Math.abs(left) >= 300:
                        return _stopAni()
                        break
                    case Math.abs(left) >= 150 || _autoStop:
                        target.style.left = left + (left < 0 ? -5 : 5) + "px"
                        break
                    case Math.abs(left) < 150:
                        target.style.left = _offsetX + "px"
                        break
                }
 
                _aniID = requestAnimationFrame(_upadteAni)
            }
            return {
                stopAni: () => _stopAni(),
                upadteAni: () => {
                    _upadteAni();
                    _autoStop = null
                },
                updateOffsetX: x => _offsetX = x,
                autoStop: () => _autoStop = true,
                isStoped: () => _aniID === null
            }
        })()
        const stop = () => {
            a.autoStop()
            d.disable()
            clearTimeout(timerUser)
            timerUser = null
        }
        // после этого сработает автоматическая смена кадра
        let timeoutUser = 2000
        let timerUser = null
        return e => {
            if (e.target.nodeName.toUpperCase() != "IMG")
                return
 
            switch (true) {
                case e.type == "mousedown" || e.type == "pointerdown":
 
                    if (!a.isStoped())
                        return
 
                    timerUser = setTimeout(stop, timeoutUser)
                    target = e.target
                    d.enable()
                    d.mousedown(e)
                    a.upadteAni()
                    break
                case e.type == "mousemove" || e.type == "pointermove":
                    if (a.isStoped())
                        return
                    d.drag(e)
                    break
                default:
                    //cancel animation
                    stop()
                    break
            }
 
        }
    })(img)
 
 
    img.onmousedown = img.onpointerdown = img.onpointerup = img.onmouseup = img.onmouseleave = img.onpointerleave = img.onmouseout = img.onpointerout = img.onclick = img.onmousemove = img.onpointermove = m
    </script>
</body>
 
</html>
еще есть интересная статья Emulating CSS Timing Functions with JavaScript можно поэкспементировать с функциями искревления времени =)

Добавлено через 4 минуты

Не по теме:

с применением новеших технологий свитчестроения =)

1
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 4
11.02.2021, 12:09  [ТС]
Спасибо огромное, попробую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2021, 12:09
Помогаю со студенческими работами здесь

ONMouseMove не вызывается при зажатой левой кнопке мыши
При Зажатой левой КМ не вызывается событие оnmouseMove проект ниже

Клики левой кнопки мыши по таймеру, при зажатой левой кнопке мыши (user32.lib)
Уважаемые форумчане, взорвался мозг. Помогите. Есть одна, по мне, невыполнимая, задача, которую я уже очень долго не могу решить. Мне...

Поворот объекта по оси Z при зажатой левой кнопке мыши
Здравствуйте! Подскажите, пожалуйста, в чем может быть проблема: скрипт занимается поворотом объекта, если зажата левая кнопка мыши. Тут...

Как отловить событие перемещения курсора при зажатой левой кнопке мыши
Искал на форуме не нашел как можно реализовать такую штуку? Хочу отловить событие перемещения курсора при зажатой левой кнопке мыши. К...

Игра "Сапер": MouseEnter и MouseLeave не генерируются при зажатой кнопке мыши
Здравствуйте, пытаюсь написать &quot;Сапер&quot; где в роли квадратиков я использую picturebox. Проблема следующая: не могу сделать так чтобы при...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru