This example shows a simple drag interaction that doesn't require a drop interaction.
1
3
4
5
6
2
1
2
3
4
5
6
Setting up the Work Area
First we need to create the work area, players (drags) and slots (drops).
<div id="workarea"> <div class="slot" id="t1">1</div> <div class="slot bottom" id="b1">3</div> <div class="slot bottom" id="b2">4</div> <div class="slot bottom" id="b3">5</div> <div class="slot bottom" id="b4">6</div> <div class="slot" id="t2">2</div> <div class="player" id="pt1">1</div> <div class="player" id="pt2">2</div> <div class="player" id="pb1">3</div> <div class="player" id="pb2">4</div> <div class="player" id="pboth1">5</div> <div class="player" id="pboth2">6</div> </div>
Now we give them some CSS to make them visible.
.slot { border: 2px solid #808080; background-color: #CDCDCD; color: #666666; text-align: center; position: relative; float: left; margin: 4px; width: 60px; height: 60px; z-index: 0; } .player { border: 2px solid #808080; color: #ffffff; text-align: center; position: relative; float: left; margin: 4px; width: 60px; height: 60px; top: 150px; z-index: 1; cursor: move; } #pt1 { clear: both; } .bottom { top: 50px; } #pt1, #pt2 { background-color: #71241A; } #pb1, #pb2 { background-color: #004C6D; } #pboth1, #pboth2 { background-color: #FFA928; } #workarea { position: relative; height: 300px; width: 500px; } #workarea .yui3-dd-drop-active-valid { border: 2px solid green; } #workarea .yui3-dd-drop-over { background-color: green; } #workarea .yui3-dd-drop-active-invalid { border: 2px solid red; }
Setting up the YUI Instance
Now we need to create our YUI instance and tell it to load the dd-drop
, dd-proxy
and dd-constrain
modules.
YUI().use('dd-drop', 'dd-proxy', 'dd-constrain');
Setting up the Drop Targets
Now that we have a YUI instance with the requested modules, we are going to create our Drop Targets.
YUI().use('dd-drop', 'dd-proxy', 'dd-constrain', function(Y) { //Get all the nodes with the class of .slot under #workarea var slots = Y.one('#workarea').all('.slot'); //Loop through them Y.each(slots, function(v, k) { var id = v.get('id'), groups = ['two']; //Assign them to different groups switch (id) { case 't1': case 't2': groups = ['one']; break; } //Create the Drop object var drop = new Y.DD.Drop({ node: v, //With the new groups array as a config option groups: groups }); }); });
Setting up the Drag Nodes
Now we need to create the Drag Nodes and assign them to the proper group.
YUI().use('dd-drop', 'dd-proxy', 'dd-constrain', function(Y) { //Snipped var players = Y.one('#workarea').all('.player'); Y.each(players, function(v, k) { var id = v.get('id'), groups = ['one', 'two']; switch (id) { case 'pt1': case 'pt2': groups = ['one']; break; case 'pb1': case 'pb2': groups = ['two']; break; } var drag = new Y.DD.Drag({ node: v, //Assign the Groups groups: groups, //Use Intersect Mode for the Target Calculations dragMode: 'intersect', }).plug(Y.Plugin.DDProxy, { //We don't want the node to move on end drag moveOnEnd: false }).plug(Y.Plugin.DDConstrained, { //Keep me inside the workarea constrain2node: '#workarea' }); });
Handling the Drops and Moments
Now we are going to listen for the following Drag Events: drag:start, drag:end, drag:drophit, drag:dropmiss
drag.on('drag:start', function() { //In this event we setup some styles to make the nodes look pretty var p = this.get('dragNode'), n = this.get('node'); n.setStyle('opacity', .25); if (!this._playerStart) { this._playerStart = this.nodeXY; } //Put the Drag's HTML inside the proxy p.set('innerHTML', n.get('innerHTML')); //set some styles on the proxy p.setStyles({ backgroundColor: n.getStyle('backgroundColor'), color: n.getStyle('color'), opacity: .65 }); }); drag.on('drag:end', function() { //Undo some of the styles from the start var n = this.get('node'); n.setStyle('opacity', '1'); }); drag.on('drag:drophit', function(e) { //If we drop on a target, move to its position var xy = e.drop.get('node').getXY(); this.get('node').setXY(xy); }); drag.on('drag:dropmiss', function(e) { //If we miss a target, move back to our start position if (this._playerStart) { this.get('node').setXY(this._playerStart); this._playerStart = null; } });
Full Javascript Code
YUI().use('dd-drop', 'dd-proxy', 'dd-constrain', function(Y) { var slots = Y.one('#workarea').all('.slot'); Y.each(slots, function(v, k) { var id = v.get('id'), groups = ['two']; switch (id) { case 't1': case 't2': groups = ['one']; break; } var drop = new Y.DD.Drop({ node: v, groups: groups }); }); var players = Y.one('#workarea').all('.player'); Y.each(players, function(v, k) { var id = v.get('id'), groups = ['one', 'two']; switch (id) { case 'pt1': case 'pt2': groups = ['one']; break; case 'pb1': case 'pb2': groups = ['two']; break; } var drag = new Y.DD.Drag({ node: v, groups: groups }).plug(Y.Plugin.DDProxy, { moveOnEnd: false }).plug(Y.Plugin.DDConstrained, { constrain2node: '#workarea' }); drag.on('drag:start', function() { var p = this.get('dragNode'), n = this.get('node'); n.setStyle('opacity', .25); if (!this._playerStart) { this._playerStart = this.nodeXY; } p.set('innerHTML', n.get('innerHTML')); p.setStyles({ backgroundColor: n.getStyle('backgroundColor'), color: n.getStyle('color'), opacity: .65 }); }); drag.on('drag:end', function() { var n = this.get('node'); n.setStyle('opacity', '1'); }); drag.on('drag:drophit', function(e) { var xy = e.drop.get('node').getXY(); this.get('node').setXY(xy, Y.UA.ie); }); drag.on('drag:dropmiss', function(e) { if (this._playerStart) { this.get('node').setXY(this._playerStart, Y.UA.ie); this._playerStart = null; } }); }); });