Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.05.2021, 04:57
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Как сделать, чтобы ползунок перемещался только в пределах отрезка?
Создаю ползунок, который можно захватить и перетащить. Написала условия ограничивающие перемещения ползунка в функции myMove пример ниже.
for(var i=0;i<scrolling.length;i++)
      {
        var s=scrolling[i];
        if(s.isDragging){
            if(s.x >= s.lineBegin && s.x <= s.lineEnd)
            {
              var mx=parseInt(e.clientX-offsetX);
              var my=parseInt(e.clientY-offsetY);

              var dx=mx-startX;
              var dy=my-startY;
            
              s.x+=dx;
              
              startX=mx;
              startY=my;
            }
        }
      }

Но он все равно уходит за границу и там заклинивает. За пределом отрезка мышкой взаимодействовать с ползунком нельзя. Вот пример на картинке три ползунка. Как исправить, чтобы ползунок перемещался в пределе отрезка и не заклинивал?
img1.jpg
Вот полностью код:
<!DOCTYPE HTML>
<html>
    <head>
	<title>Scrolling</title>
</head>
    <body>
     <canvas id="canvas1" width="670" height="500" style="background-color:#eee; border:1px solid #ccc;"></canvas>
    <script>
 var canvas1, context; 
 var offsetX, offsetY;
 var BB;
var dragok = false;
 
 
var scrolling = [];
var startX;
var startY; 
 
scrolling.push({x:150,y:20,lineBegin:150,lineEnd:350,width:15,height:30,fill:"#444444",i1:0,sDragging:false});
scrolling.push({x:150,y:70,lineBegin:150,lineEnd:350,width:15,height:30,fill:"#ff550d",i1:1,isDragging:false});
scrolling.push({x:150,y:120,lineBegin:150,lineEnd:350,width:15,height:30,fill:"#800080",i1:2,isDragging:false});

function myDown(e){

  e.preventDefault();
  e.stopPropagation();
  
  dragok=false;
   for(var i=0;i<scrolling.length;i++){
    var s=scrolling[i];
    if(s.x >= s.lineBegin)
    {
      var mx=parseInt(e.clientX-offsetX);
      var my=parseInt(e.clientY-offsetY);
       if(mx>s.x && mx<s.x+s.width && my>s.y && my<s.y+s.height)
       {
          dragok=true;
          s.isDragging=true;
       }
       startX=mx;
       startY=my;
     }
   }
   
  draw();
 
  
}
function myUp(e){
  e.preventDefault();
  e.stopPropagation();
  
  for(var i=0;i<scrolling.length;i++){
      scrolling[i].isDragging=false;
  }
}

function myMove(e){
  if (dragok)
  { 
      e.preventDefault();
      e.stopPropagation();
      for(var i=0;i<scrolling.length;i++)
      {
        var s=scrolling[i];
        if(s.isDragging){
            if(s.x >= s.lineBegin && s.x <= s.lineEnd)
            {
              var mx=parseInt(e.clientX-offsetX);
              var my=parseInt(e.clientY-offsetY);

              var dx=mx-startX;
              var dy=my-startY;
            
              s.x+=dx;
              
              startX=mx;
              startY=my;
            }
        }
      }
      draw();
   } 
}

function draw() {
  clear();
  for(var i=0;i<scrolling.length;i++){
       rect(scrolling[i]);
       line(scrolling[i]);
  }
}

function clear() {
  context.clearRect(0, 0, canvas1.width, canvas1.height);

}

function rect(r)
{
  context.fillStyle=r.fill;
  context.fillRect(r.x,r.y,r.width,r.height);
}

function line(r)
{
 context.save();
 context.beginPath();
 context.moveTo(r.lineBegin, r.y+r.height/2);
 context.lineTo(r.lineBegin, r.y+r.height/2);
 context.lineTo(r.lineEnd, r.y+r.height/2);
 context.strokeStyle = "#000";
 context.stroke();
}
 
 function init() {
    canvas1 = document.getElementById("canvas1");
    context = canvas1.getContext("2d");
    BB = canvas1.getBoundingClientRect();
    offsetX=BB.left;
    offsetY=BB.top;
      
    draw();
    
   document.addEventListener("mousedown",function(evt)
    { 
      myDown(evt);
    });
    
    document.addEventListener("mouseup",function(evt)
    { 
      myUp(evt);
    });
    document.addEventListener("mousemove",function(evt)
    {
      myMove(evt);      
    });

}
init();
    </script>
   </body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 28.05.2021, 07:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Katy93,
не назначайте значения, которые выходят за пределы, строка 87, убрать или оставить - s.width в этой строке, решать вам.
наверно s.width/2 c обеих сторон будет логичнее.

<!DOCTYPE HTML>
<html>
<head>
    <title>Scrolling</title>
</head>
<body>
    <canvas id="canvas1" width="670" height="500" style="background-color:#eee; border:1px solid #ccc;"></canvas>
    <script>
        var canvas1, context;
        var offsetX, offsetY;
        var BB;
        var dragok = false;
        var scrolling = [];
        var startX;
        var startY;
        scrolling.push({
            x: 150,
            y: 20,
            lineBegin: 150,
            lineEnd: 350,
            width: 15,
            height: 30,
            fill: "#444444",
            i1: 0,
            sDragging: false
        });
        scrolling.push({
            x: 150,
            y: 70,
            lineBegin: 150,
            lineEnd: 350,
            width: 15,
            height: 30,
            fill: "#ff550d",
            i1: 1,
            isDragging: false
        });
        scrolling.push({
            x: 150,
            y: 120,
            lineBegin: 150,
            lineEnd: 350,
            width: 15,
            height: 30,
            fill: "#800080",
            i1: 2,
            isDragging: false
        });
        function myDown(e) {
            e.preventDefault();
            e.stopPropagation();
            dragok = false;
            for (var i = 0; i < scrolling.length; i++) {
                var s = scrolling[i];
                if (s.x >= s.lineBegin) {
                    var mx = parseInt(e.clientX - offsetX);
                    var my = parseInt(e.clientY - offsetY);
                    if (mx > s.x && mx < s.x + s.width && my > s.y && my < s.y + s.height) {
                        dragok = true;
                        s.isDragging = true;
                    }
                    startX = mx;
                    startY = my;
                }
            }
            draw();
        }
        function myUp(e) {
            e.preventDefault();
            e.stopPropagation();
            for (var i = 0; i < scrolling.length; i++) {
                scrolling[i].isDragging = false;
            }
        }
        function myMove(e) {
            if (dragok) {
                e.preventDefault();
                e.stopPropagation();
                for (var i = 0; i < scrolling.length; i++) {
                    var s = scrolling[i];
                    if (s.isDragging) {
                        var mx = parseInt(e.clientX - offsetX);
                        var my = parseInt(e.clientY - offsetY);
                        var dx = mx - startX;
                        var dy = my - startY;
                        var k = s.x + dx
                        k = Math.min(s.lineEnd - s.width, Math.max(s.lineBegin, k));
                        s.x = k;
                        startX = mx;
                        startY = my;
                    }
                }
                draw();
            }
        }
        function draw() {
            clear();
            for (var i = 0; i < scrolling.length; i++) {
                rect(scrolling[i]);
                line(scrolling[i]);
            }
        }
        function clear() {
            context.clearRect(0, 0, canvas1.width, canvas1.height);
        }
        function rect(r) {
            context.fillStyle = r.fill;
            context.fillRect(r.x, r.y, r.width, r.height);
        }
        function line(r) {
            context.save();
            context.beginPath();
            context.moveTo(r.lineBegin, r.y + r.height / 2);
            context.lineTo(r.lineBegin, r.y + r.height / 2);
            context.lineTo(r.lineEnd, r.y + r.height / 2);
            context.strokeStyle = "#000";
            context.stroke();
        }
        function init() {
            canvas1 = document.getElementById("canvas1");
            context = canvas1.getContext("2d");
            BB = canvas1.getBoundingClientRect();
            offsetX = BB.left;
            offsetY = BB.top;
            draw();
            document.addEventListener("mousedown", function(evt) {
                myDown(evt);
            });
            document.addEventListener("mouseup", function(evt) {
                myUp(evt);
            });
            document.addEventListener("mousemove", function(evt) {
                myMove(evt);
            });
        }
        init();
    </script>
</body>
</html>

Последний раз редактировалось рони, 28.05.2021 в 07:37.
Ответить с цитированием
  #3 (permalink)  
Старый 28.05.2021, 16:46
Кандидат Javascript-наук
Отправить личное сообщение для Katy93 Посмотреть профиль Найти все сообщения от Katy93
 
Регистрация: 28.12.2018
Сообщений: 138

Спасибо за помощь, теперь работает.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы текст не усекался в пределах родительского элемента? Lun2 Элементы интерфейса 11 14.08.2020 18:31
Как сделать только 1 точку в калькуляторе Aleksandr Gumanat Общие вопросы Javascript 3 17.07.2020 18:06
Как сделать, чтобы скрипт работал только если текущий документ iframe? ruslan_mart Общие вопросы Javascript 10 14.01.2015 13:56
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
как сделать так чтобы в popup окне принимался css стили,? sarik Общие вопросы Javascript 2 12.03.2013 10:24