Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 3 / 1
Регистрация: 24.03.2013
Сообщений: 304

Простейший drag and drop

12.11.2016, 10:47. Показов 1469. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему, если переместить ползунок, а потом по нему кликнуть, то от перемешается в самое начало?

index.html:


HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
<div id="slider" class="slider">
    <div class="thumb"></div>
</div>
 
 
<script src='script.js'></script>
 
</body>
</html>
style.css:

CSS
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
#slider{
            background: #f6e6b4;
            background: -moz-radial-gradient(center, ellipse cover,  #f6e6b4 0%, #ed9017 100%);
            background: -webkit-radial-gradient(center, ellipse cover,  #f6e6b4 0%,#ed9017 100%);
            background: radial-gradient(ellipse at center,  #f6e6b4 0%,#ed9017 100%);
            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f6e6b4', endColorstr='#ed9017',GradientType=1 );
            width: 310px;
            height: 15px;
            margin: 25px;
            border-radius: 3px;
        }
        
        .thumb{
            position: relative;
            width: 15px;
            height: 30px;
            top: -7.5px;
            background: #258dc8;
            background: -moz-linear-gradient(top,  #258dc8 0%, #258dc8 100%);
            background: -webkit-linear-gradient(top,  #258dc8 0%,#258dc8 100%);
            background: linear-gradient(to bottom,  #258dc8 0%,#258dc8 100%);
            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#258dc8', endColorstr='#258dc8',GradientType=0);
            border-radius: 4px;
            cursor: pointer;
        }
script.js:

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
var thumb = slider.firstElementChild;
var box = slider.getBoundingClientRect();
 
 
thumb.onmousedown = function(e){
 
    var shiftX = e.pageX - box.left + pageXOffset;
    var thumbStyle = thumb.style;
        
        console.log(e.pageX - shiftX)
        console.log(box.left + pageXOffset)
        
        console.log( e.pageX - shiftX + thumb.offsetWidth)
        console.log( box.right + pageXOffset)
        
        console.log( thumbStyle.left = e.pageX - box.left + pageXOffset - shiftX + 'px')
 
        function changeAtMove(e){
            if((e.pageX - shiftX) < box.left + pageXOffset){
                thumbStyle.left = 0;
                
            }else if((e.pageX - shiftX + thumb.offsetWidth) > box.right + pageXOffset){
                thumbStyle.left = slider.offsetWidth - thumb.offsetWidth + 'px';
                
            }else {
                thumbStyle.left = e.pageX - box.left + pageXOffset - shiftX + 'px';
            }
        }
        
        changeAtMove(e);
 
        document.onmousemove = function(e){
            changeAtMove(e);
        }
 
        document.onmouseup = thumb.onmouseup = function(){
            document.onmousemove = document.onmouseup = null;
        }
        return false;
    };
 
    thumb.ondragstart = function(){return false;}
Песочница: http://plnkr.co/edit/2Q5qjN26D... ?p=preview

Мне писали, то, что

JavaScript
1
thumbStyle.left = e.pageX - box.left + pageXOffset - shiftX + 'px'
а

JavaScript
1
shiftX = e.pageX - box.left + pageXOffset
сначала вы рассчитываете shiftX = e.pageX - box.left + pageXOffset, потом из e.pageX - box.left + pageXOffset которое в свою очередь равно shiftX вычитаете shiftX вот и получается у вас всегда 0, т.е. скидывается в начало


Но я всё равно ничего не понял.

Добавлено через 38 минут
Я удалил pageXOffset и shiftX и работает, но почему, теперь при клике на ползунок, но прыгает вправо?

Песочница: http://plnkr.co/edit/IGdIiT6Oa... ?p=preview
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2016, 10:47
Ответы с готовыми решениями:

Drag and drop
Помогите найти ошибку &lt;html&gt; &lt;head&gt; &lt;script&gt; var ball = document.getElementById('ball'); ball.onmousedown = function(e) { ...

Drag and Drop
вот нашёл примерчик в сети http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop но тут явно указана единственно...

сохранение drag-and-drop
https://learn.javascript.ru/drag-and-drop-plus Существует метод сохранить состояние после перетаскивания одного елемента в другой?? ...

2
 Аватар для vettel
84 / 84 / 41
Регистрация: 14.02.2015
Сообщений: 320
12.11.2016, 11:10
Цитата Сообщение от Dimon3x Посмотреть сообщение
Я удалил pageXOffset и shiftX и работает, но почему, теперь при клике на ползунок, но прыгает вправо?
Разберитесь с координатами.
В данном случае вы просто делаете левую координату ползунка равную месту, где вы кликнули мышь (по сути).
Вам нужно делать поправку хотя бы на половину ширины ползунка. Скажем,
JavaScript
1
2
3
     else {
                thumbStyle.left = e.pageX - box.left - thumb.offsetWidth/2 + 'px';
            }
Тогда при клике на ползунок мышь всегда будет посередине его.
0
3 / 3 / 1
Регистрация: 24.03.2013
Сообщений: 304
12.11.2016, 14:33  [ТС]
Я нашёл очень простое решение.

index.html:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
 
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="style.css">
</head>
 
<body>
 
  <div id="slider" class="slider">
    <div class="thumb"></div>
  </div>
 
 
<script src='script.js'></script>
</body>
 
</html>
style.css:

CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.slider {
  background: #f6e6b4;
  background: radial-gradient(ellipse at center,  #f6e6b4 0%,#ed9017 100%);
  width: 310px;
  height: 15px;
  margin: 25px;
  border-radius: 3px;
  position:relative;
}
 
 
  .thumb{
    position: relative;
    width: 15px;
    height: 30px;
    top: -7.5px;
    background: #258dc8;
    background: linear-gradient(to bottom,  #258dc8 0%,#258dc8 100%);
    border-radius: 4px;
    cursor: pointer;
}
scrypt.js

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
var thumb = slider.querySelector('.thumb');
 
thumb.onmousedown = function(e){
 
  let xShift = e.clientX - thumb.offsetLeft
  let max = slider.clientWidth - thumb.offsetWidth;
  
  document.onmousemove = function(e) {
    var current = e.clientX - xShift;
   
    if(current < 0){
       current = 0
    }
    
    else if(current > max){
       current = max
    }
    
    thumb.style.left = current + 'px';
 
  }
  document.onmouseup = function(e){
    document.onmousemove = document.onmouseup = '';
  }
  
 
}
Песочница: http://plnkr.co/edit/IGdIiT6Oa... ?p=preview
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2016, 14:33
Помогаю со студенческими работами здесь

Drag and drop и корзина
Добрый день! Подскажите пожалуйста, как сделать чтоб когда я беру предмет за тем перетаскиваю на корзину и отпускаю кнопку, предмет...

Drag and drop на форму
Подскажите пожалуйста, можно ли сделать так, чтобы при перетаскивании файла dran and drop-ом на див, в форму записывался полный путь к...

Drag&Drop
Есть таблица (много полей) Существует ли фреймворк для Drag&amp;Drop который по верх этой таблице двигал div блок и по необходимости менял...

drag-n-drop с таблицами
Добрый вечер. Возник такой вопрос: Есть текст в одном поле таблицы, надо его перетащить в другое поле, где он появится, а в старом...

Drag and Drop в JavaScript
Здравствуйте!!!!!! Подскажите пожалуйста, какой-нибудь пример или книгу ил еще что-нибудь по Drag and Drop в JavaScript, очень нужно,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru