- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在构建一个网站设计器,其中一个核心功能是能够拖放以重新排列元素。我已经在这个功能上工作了几天,并且已经失败了几次。关于此拖放系统最重要的注意事项是可拖动元素可以放在master容器内的任何位置,并且会卡入到位 所以不会有绝对定位的元素,否则元素不会卡入到位。
首先,我首先构建核心可拖动位,您可以在其中拖动元素,然后当您放下元素时,我使用 document.elementFromPoint()
获取光标所在的元素位置是(注意:我必须隐藏可拖动元素,否则它会返回该元素)。
现在我有了离光标最近的元素,主要问题是确定可拖动元素相对于该元素需要去哪里,因为有 4 个选项 append - prepend - insertBefore - insertAfter
。我已经设法让 append - prepend & insertBefore
工作,但它不够可靠,因为我要做的就是使用目标的高度和偏移量来确定 append 或 prepend
我正在增加 getFromPoint
上的 Y
参数,以查看我是否在短距离内击中了不同的元素以确定 insertBefore
。这是我到目前为止的代码。
box.addEventListener('mouseup', function (e) {
if (!dragging) return;
dragging = false;
var thisEl = this; // the drag-able element
// Hide
this.style.display = 'none'; // hide the element so we can get
// document.elementFromPoint
var el = document.elementFromPoint(e.pageX, e.pageY), // target
elH = el.offsetHeight, // height of target
elT = el.offsetTop; // offset of target
for (var i = 0; i < 15; i++) { // This is a weird part see the reference at the bottom
var newEl = document.elementFromPoint(e.pageX, e.pageY + i);
if (newEl !== el) {
this.style.display = 'block';
this.style.position = 'static';
return newEl.parentNode.insertBefore(thisEl, newEl);
}
}
if (e.pageY < elT + (elH / 2)) { // if the pageY is less than the target offset + half of the height, that's how I am calculating prepend
el.appendChild(this);
el.insertBefore(this, el.firstChild);
} else {
el.appendChild(this); // else append;
}
this.style.display = 'block';
this.style.position = 'static'; // Snap back in with 'static'
});
这只是我的 mouseup
事件,它完成了所有工作。其他事件只是使元素可拖动,并不重要。
这是一个 fiddle
因此,如果那没有问这个问题,那么这是一个简短的版本。
我的可拖动元素需要能够放在任何地方并卡入。最好的方法是什么,因为我在 fiddle 中做的方式肯定不好。我如何检测元素相对于 mouseup
上的目标的位置。
引用奇怪的部分。
这是它的工作原理(警告,这不好)。当我使用 elementFromPoint
获取目标元素时,我会创建一个循环,该循环将循环 15 次并递增进入 elementFromPoint
的 Y
值,因此基本上 elementFromPoint
正在向下移动 15px
,如果它在那个短空间内碰到一个新元素,我假设您想在目标之前插入该元素。
我非常高兴收到与此代码无关的答案,因为这也会使其他用户受益。
我想指出,可拖动的容器是设计器的主要部分。所以对我来说,拥有所有绝对定位的元素并不是一个选择,我真的不是一个好主意,把一个元素放在每个可能的地方,这样我就可以检测到可拖动元素必须去哪里,因为无论在什么地方该容器将是没有不必要内容的高质量结果。
我还想指出,我的应用程序不并且将不会支持旧浏览器,即IE6、IE7、IE8、IE9
最佳答案
我会考虑使用 jQuery UI 的 Sortable widget
。 <强> portlets example 处理 insertBefore
和 insertAfter
要求。我创建了一个简单的 fiddle 建立在 portlet 示例的基础上,也满足 prepend
和 append
要求。
这对您来说只是一个开始,我相信您可以根据需要进行操作。 connectWith
这很重要,具体取决于您希望放置东西的位置。
JS
$(".column").sortable({
items: ".portlet",
connectWith: ".column"
});
$(".portlet").sortable({
items: ".portlet-content",
connectWith: ".portlet"
});
$(".column").disableSelection();
HTML
<div class="column">
<div class="portlet ui-widget ui-widget-content ui-helper-clearfix ui-corner-all">
<div class="portlet-content">One. Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
</div>
<div class="portlet ui-widget ui-widget-content ui-helper-clearfix ui-corner-all">
<div class="portlet-content">Two. Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
</div>
<div class="portlet ui-widget ui-widget-content ui-helper-clearfix ui-corner-all">
<div class="portlet-content">Three. Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
</div>
</div>
<div class="column">
<div class="portlet ui-widget ui-widget-content ui-helper-clearfix ui-corner-all">
<div class="portlet-content">Four. Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
</div>
<div class="portlet ui-widget ui-widget-content ui-helper-clearfix ui-corner-all">
<div class="portlet-content">Five. Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
</div>
</div>
关于javascript - 可在所有可能的地方放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388846/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
操作无法完成。 Places API 库中发生内部错误。如果您认为此错误代表错误,请使用我们社区和支持页面 (https://developers.google.com/places/support)
我正在尝试在我的项目中使用 google places,我将其设置在 fragment 中而不是 Activity 中,我的自动完成 fragment 在 fragment 中。但是,当我尝试搜索它时
我的目的是使用R来查询google api。 我有一个地址和名称列表(属于商店、餐馆等),我需要为每个地址和名称存储: “纬度”、“经度”、“业务类型” 我的想法是使用 google place ap
我正在寻找设置一个自动完成的谷歌地方小部件。 我有一个带有“searchFieldText”id 的输入类型文本。 这是我的 JS 代码: var inputsec = document.getEle
是否可以使用图形 API(或地址/ zip )按纬度/经度和半径获取地点?我在文档中的任何地方都看不到它 最佳答案 搜索 URL 的以下格式将返回某个位置附近的地点列表: https://graph.
我正在探索 Google API,主要是 Places API。由于对 Google Places API 的请求数限制为 100,000,因此我正在寻找方法来最大限度地减少发送到 API 的请求数。
伙计们,我在我的应用程序中有一个功能,可以使用 GetFiles 在特定目录中搜索特定文件。方法 System.IO.Directory.GetFiles(string path, string
我已经在 Laravel 5.3 上使用 where 查询成功创建了许多函数,但是这次发生了一些奇怪的事情。 public function show($id){ $artikel = Art
我正在为我的 iPhone 应用程序使用 Facebook 图形 API 来获取附近地点的列表,我使用带有一些参数的“搜索”请求。我得到的响应是一个包含以下信息的地点列表:“纬度”、“经度”、“名称”
我有一个 Android 应用程序,我在其中使用 Google map 显示附近的地方,如加油站、药店等。我正在使用 map 和地点 API。 https://maps.googleapis.com/
我是一名优秀的程序员,十分优秀!