gpt4 book ai didi

javascript - 不触发布局的Packery init

转载 作者:行者123 更新时间:2023-11-30 20:31:32 25 4
gpt4 key购买 nike

我有 packery 和 jQuery Draggable 所有设置并在我的开发环境中正常工作。

目前我正在将我订购的(打包)html 保存到数据库中。在将所有内容插入数据库之前,我更改了 dom 元素的顺序以匹配 packery 顺序。一切正常

当使用保存的 html 重新加载页面时,所有 div 都会按照保存的方式显示在它们的位置。

我遇到的问题是当我使用加载的 HTML 再次设置 packery 时($grid 是父 div)

var $grid = $('.grid');
$grid.packery({
columnWidth: '.grid-sizer',
itemSelector: '.grid-item',
stamp: ".stamp",
gutter:0,
percentPosition: true
});

Packery 再次“打包”一切。这正是它应该做的。事情是我想保留我的旧布局,其中可能有空白空间。

我的问题是...

是否可以在不触发布局功能的情况下初始化Packery?我尝试将 initLayout: false 添加到选项中。但它不允许我拖动元素 & layoutInstant: false 似乎没有做任何事情。

保存的 html 的屏幕(按照我想要的方式拖动所有内容之后)然后重新加载然后 $grid.packery()

/image/fS2Vp.png
/image/pAnkW.png

最佳答案

好吧,我设法自己解决了这个问题。主要来自 metafizzy git 上的这个答案 metafizzy isse tracker

在初始 packery 设置之前添加了代码

Packery.prototype.getShiftPositions = function( attrName ) {
attrName = attrName || 'id';
var _this = this;
console.log(_this.packer.width);
return this.items.map( function( item ) {
return {
attr: item.element.getAttribute( attrName ),
x: item.element.offsetLeft,
y: item.element.offsetTop
}
});
};

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
console.log(this.items);
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 );
if (item) {
item.rect.x = itemPosition.x;
item.rect.y = itemPosition.y;
return item;
}
}, this );

// filter out any items that no longer exist
this.items = this.items.filter(function(item) {
return item !== undefined;
});
// add new items
var newitems = [];
var p = this;
$(this.$element[0]).find(this.options.itemSelector).each(function(i, e) {
if (!p.getItem(e)) {
newitems.push(e);
}
});
this.addItems(newitems);

this.shiftLayout();
};

设置 packery 时。设置 initLayout:false 例如

$grid.packery({
columnWidth: parseInt($columnWidth),
itemSelector: '.grid-item',
stamp: ".stamp",
gutter:0,
percentPosition: true,
initLayout: false,
});

然后设置所有内容 (data-item-index) 是添加到每个可以移动的 div 的唯一值。你可以使用“id”

var initPositions = $grid.packery( 'getShiftPositions', 'data-item-index');
$grid.packery( 'initShiftLayout', initPositions, 'data-item-index');

关于javascript - 不触发布局的Packery init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com