Skip to content

Instantly share code, notes, and snippets.

@BoeJaker
Created June 28, 2018 21:55
Show Gist options
  • Save BoeJaker/29127f09a84134458fffd05d8305ec04 to your computer and use it in GitHub Desktop.
Save BoeJaker/29127f09a84134458fffd05d8305ec04 to your computer and use it in GitHub Desktop.
Packery - save & restore drag position
<h1>Packery - save &amp; restore drag position</h1>
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item grid-item--large" data-item-id="1"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/orange-tree.jpg);"></div>
<div class="grid-item" data-item-id="2"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/submerged.jpg);"></div>
<div class="grid-item" data-item-id="3"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/look-out.jpg);"></div>
<div class="grid-item grid-item--width2" data-item-id="4"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/one-world-trade.jpg);"></div>
<div class="grid-item" data-item-id="5"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/drizzle.jpg);"></div>
<div class="grid-item grid-item--width2" data-item-id="6"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/golden-hour.jpg);"></div>
<div class="grid-item" data-item-id="7"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/cat-nose.jpg);"></div>
<div class="grid-item" data-item-id="8"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/contrail.jpg);"></div>
<div class="grid-item" data-item-id="9"
style="background-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/82/flight-formation.jpg);"></div>
</div>
// external js: packery.pkgd.js, draggabilly.pkgd.js
// add Packery.prototype methods
// get JSON-friendly data for items positions
Packery.prototype.getShiftPositions = function( attrName ) {
attrName = attrName || 'id';
var _this = this;
return this.items.map( function( item ) {
return {
attr: item.element.getAttribute( attrName ),
x: item.rect.x / _this.packer.width
}
});
};
Packery.prototype.initShiftLayout = function( positions, attr ) {
if ( !positions ) {
// if no initial positions, run packery layout
this.layout();
return;
}
// parse string to JSON
if ( typeof positions == 'string' ) {
try {
positions = JSON.parse( positions );
} catch( error ) {
console.error( 'JSON parse error: ' + error );
this.layout();
return;
}
}
attr = attr || 'id'; // default to id attribute
this._resetLayout();
// set item order and horizontal position from saved positions
this.items = positions.map( function( itemPosition ) {
var selector = '[' + attr + '="' + itemPosition.attr + '"]'
var itemElem = this.element.querySelector( selector );
var item = this.getItem( itemElem );
item.rect.x = itemPosition.x * this.packer.width;
return item;
}, this );
this.shiftLayout();
};
// -----------------------------//
// init Packery
var $grid = $('.grid').packery({
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true,
initLayout: false // disable initial layout
});
// get saved dragged positions
var initPositions = localStorage.getItem('dragPositions');
// init layout with saved positions
$grid.packery( 'initShiftLayout', initPositions, 'data-item-id' );
// make draggable
$grid.find('.grid-item').each( function( i, itemElem ) {
var draggie = new Draggabilly( itemElem );
$grid.packery( 'bindDraggabillyEvents', draggie );
});
// save drag positions on event
$grid.on( 'dragItemPositioned', function() {
// save drag positions
var positions = $grid.packery( 'getShiftPositions', 'data-item-id' );
localStorage.setItem( 'dragPositions', JSON.stringify( positions ) );
});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://npmcdn.com/draggabilly@2/dist/draggabilly.pkgd.js"></script>
<script src="https://npmcdn.com/packery@2/dist/packery.pkgd.js"></script>
* { box-sizing: border-box; }
/* force scrollbar */
html { overflow-y: scroll; }
body { font-family: sans-serif; }
/* ---- grid ---- */
.grid {
max-width: 1200px;
background: #DDD;
}
/* clear fix */
.grid:after {
content: '';
display: block;
clear: both;
}
/* ---- .grid-item ---- */
.grid-sizer,
.grid-item {
width: 25%;
}
.grid-item {
padding-bottom: 25%; /* hack for proportional sizing */
float: left;
background-position: center center;
background-size: cover;
}
.grid-item--width2 {
width: 50%;
}
.grid-item--large {
width: 50%;
padding-bottom: 50%;
}
.packery-drop-placeholder {
border: 3px dotted #333;
background: hsla(0, 0%, 0%, 0.3);
}
.grid-item.is-dragging,
.grid-item.is-positioning-post-drag {
z-index: 2;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment