2014-01-21 6 views
5

Ich benutze die Drag & Drop Funktion von jQuery UI. Damit es auf Touch-Geräten funktioniert, verwende ich jQuery UI Touch Punch.Scrollen durch jQuery UI Draggables auf Touch Devices Trigger Ziehen

Ich habe eine Liste von Draggables, die nicht viel Platz um sie herum haben. Auf Touch-Geräten stellte ich fest, dass die einzige Möglichkeit, durch die Liste zu blättern, darin bestand, die sehr engen Bereiche um die Ziehpunkte herum zu verwenden, was nicht benutzerfreundlich ist. Ich habe darüber nachgedacht, Schaltflächen hinzuzufügen, um nach oben und unten zu blättern, aber ich denke, dass sich das für Benutzer, die es gewohnt sind, mit Wischen zu scrollen, fremd und klobig anfühlen würde. Ich endete mit Art einer Hacky Abhilfe, aber es hat zwei Probleme:

  1. Es dauert eine Weile, bevor die Swipe zu bewegen beginnt, was den falschen Eindruck erwecken könnte, dass die Website hinkt.

  2. Es gibt keinen kinetischen Aspekt beim Scrollen, also ist es viel mehr Arbeit zu scrollen als üblich.

Meine Frage

Kann mein Code verbessert werden, um die beiden oben genannten Probleme zu beheben oder sollte ich einen ganz anderen Ansatz nehmen, dieses Problem zu Fixierung?

Der Kodex

jsFiddle demofull screen result of jsFiddle demo

HTML

<p>Drag the colored squares into the gray area on the right.</p> 

<ul> 
    <li><span class="red"></span></li> 
    <li><span class="orange"></span></li> 
    <li><span class="yellow"></span></li> 
    <li><span class="green"></span></li> 
    <li><span class="blue"></span></li> 
    <li><span class="purple"></span></li> 
    <li><span class="red"></span></li> 
    <li><span class="orange"></span></li> 
    <li><span class="yellow"></span></li> 
    <li><span class="green"></span></li> 
    <li><span class="blue"></span></li> 
    <li><span class="purple"></span></li> 
    <li><span class="red"></span></li> 
    <li><span class="orange"></span></li> 
    <li><span class="yellow"></span></li> 
    <li><span class="green"></span></li> 
    <li><span class="blue"></span></li> 
    <li><span class="purple"></span></li> 
    <li><span class="red"></span></li> 
    <li><span class="orange"></span></li> 
    <li><span class="yellow"></span></li> 
    <li><span class="green"></span></li> 
    <li><span class="blue"></span></li> 
    <li><span class="purple"></span></li> 
</ul> 

<div></div> 

CSS

p { 
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
    margin-bottom: 10px; 
} 

ul, div { 
    float: left; 
    height: 440px; 
    background-color: #ccc; 
    border: 1px solid #000; 
} 

ul { 
    width: 127px; 
    overflow-y: scroll; 
    list-style: none; 
} 

li span { 
    margin: 9px auto; 
} 

span { 
    display: block; 
    width: 100px; 
    height: 100px; 
    border: 5px solid #000; 
} 

.red { 
    background-color: #f00; 
} 

.orange { 
    background-color: #ff8000; 
} 

.yellow { 
    background-color: #ff0; 
} 

.green { 
    background-color: #0f0; 
} 

.blue { 
    background-color: #00f; 
} 

.purple { 
    background-color: #f0f; 
} 

div { 
    width: 330px; 
    margin-left: 20px; 
} 

div span { 
    float: left; 
} 

JavaScript

// BEGIN: My attempt to fix the scrolling issue on touch devices 

if ('ontouchstart' in document.documentElement) { 
    $('span').on('dragstart', function(e) { 
     if ($(this).hasClass('scroll')) { 
      e.preventDefault(); 
     } 
    }).on('mousemove', function(e) { 
     if ($(this).hasClass('scroll')) { 
      $('ul').scrollTop(scroll_top_on_mousedown + mousedown_coords.pageY - e.pageY); 
      return false; 
     } 

     if (typeof(mousedown_coords) == 'object' && Math.max(
       Math.abs(mousedown_coords.pageX - e.pageX), 
       Math.abs(mousedown_coords.pageY - e.pageY) 
      ) >= 80 
     ) { 
      if (e.pageX - mousedown_coords.pageX < 70) { 
       $(this).addClass('scroll'); 
      } 
     } 
    }).on('mousedown', function(e) { 
     mousedown_coords = { 
      'pageX': e.pageX, 
      'pageY': e.pageY, 
     }; 

     scroll_top_on_mousedown = $('ul').scrollTop(); 
    }).on('touchend', function() { 
     $(this).trigger('mouseup'); // Android fix 

     delete window.mousedown_coords; 
     $('ul .scroll').removeClass('scroll'); 
    }); 
} 

// END: My attempt to fix the scrolling issue on touch devices 

$('span').draggable({ 
    distance: 90, 
    helper: 'clone', 
    containment: $('div') 
}); 

$('div').droppable({ 
    drop: function(event, ui) { 
     if ($(this).children('span').length == 12) { 
      $(this).empty(); 
     } 

     $(this).append($(ui.draggable).clone()); 
    } 
}); 
+1

Haben Sie versucht, eine ** [Verzögerungsoption] (http://api.jqueryui.com/draggable/#option-delay) ** in Ihrer ziehbaren Funktion hinzuzufügen? Wenn Sie eine Verzögerung von beispielsweise 500 Millisekunden einstellen, reicht es vielleicht aus, dass der Benutzer die Seite scrollen kann, ohne die ziehbare Funktion auszulösen. – Cholesterol

+0

@Cholsterol Wenn ich den ganzen Code rausreiße, den ich geschrieben habe, der die Schriftrolle fälscht und dann die Option 'delay' hinzufüge, bin ich wieder da, wo ich vorher war (nur scrollen, wenn mein Finger auf einem Teil der grauen Fläche ist außerhalb der farbigen Quadrate), mit dem Unterschied, dass es jetzt eine Verzögerung gibt, bevor natürlich die farbigen Quadrate gezogen werden. Danke für den Vorschlag. – Nick

Antwort

3

Leider glaube ich die beste Antwort Ihre UI neu zu denken ist. Einen Benutzer zum Scrollen über ziehbare Elemente zu zwingen, wird nur Probleme darstellen. Zuerst dachte ich, die Verwendung von jQuerys tabhold Event würde das draggable Event verzögern, aber sie wollen nicht nett zusammen spielen.

+0

Ich bin zu dem gleichen Schluss gekommen, also habe ich es so gemacht, dass auf Touch-Geräten der Benutzer den Gegenstand antippen muss, bevor er ziehbar wird. Ich fügte einen visuellen Hinweis hinzu, dass es ziehbar ist, so dass es für den Benutzer offensichtlich ist. Nachdem der Benutzer es gezogen hat oder wenn er es sich anders überlegt hat und das gleiche Objekt erneut anklickt oder auf ein anderes Objekt klickt, wird es wieder entschlüsselt. – Nick

+0

Können Sie uns bitte mitteilen, was Sie mit uns gemacht haben? Ich habe auch ein ähnliches Problem :( – GETah

+0

@GETah Gibt es einen Teil meiner früheren Kommentar, dass Sie stecken bleiben? – Nick