A Pen by Dave DeSandro on CodePen.
Created
June 28, 2018 21:55
-
-
Save BoeJaker/29127f09a84134458fffd05d8305ec04 to your computer and use it in GitHub Desktop.
Packery - save & restore drag position
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<h1>Packery - save & 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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 ) ); | |
}); | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
* { 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