jquery - 防止可拖动的 div 彼此靠近
问题描述
我正在使用 jQuery UI 制作一些可以拖放到地图上的图钉。
每个图钉都需要与其他图钉留出一定的空白空间(不能放置在任何其他图钉的大约 30px 范围内),在拖动过程中会在其周围显示一个暗光晕。目前,可以将引脚拖到上方并放置在彼此之上,而我希望引脚被拖动以围绕已放置的任何引脚进行操作,如下所示:
有没有足够简单/轻量级的方法来做到这一点?提前致谢!
$(document).ready(function() {
$(".pin").draggable({
grid: [ 5, 5 ],
start: function(e, ui) {
$(this).addClass('placed');
$('.placed').css('box-shadow' , '0 0 0 15px rgba(0, 0, 0, 0.3), 0 7px 10px 0 rgba(0, 0, 0, 0.7)');
},
stop: function(e, ui) {
$('.pin').css('box-shadow' , '0 0 0 0 rgba(0, 0, 0, 0), 0 3px 8px 0 rgba(0, 0, 0, 0.3)');
}
});
});
.pin {
width: 20px;
height: 20px;
background-color: #65C02F;
border-radius:20px;
-moz-border-radius: 20px;
-webkit-border-radius: 20px;
border: 2px solid #FFF;
margin: 10px;
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0), 0 4px 6px 0 rgba(0, 0, 0, 0.3);
cursor: pointer;
z-index: 2;
transition: box-shadow 0.2s;
}
.pin:hover {
background-color: #50A71C;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<div class="pin"></div>
<div class="pin"></div>
<div class="pin"></div>
<div class="pin"></div>
解决方案
我使用上面使用JQuery UI Draggable Collision的 Reverend Pete 建议的链接让它工作
jsfiddle.net/RichardGouw/h14jcqvx/28/
稍微改变了主意,在活动引脚周围有一个光环,但碰撞效果仍然是一样的
HTML
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script src="http://code.jquery.com/ui/1.8.18/jquery-ui.js"></script>
<!-- Include links to UI Draggable Collision files -->
<div class="pin"></div>
<div class="pin"></div>
<div class="pin"></div>
<div class="pin"></div>
CSS
.pin {
width: 20px;
height: 20px;
background-color: #65C02F;
margin: 7px;
border-radius: 20px;
-moz-border-radius: 20px;
-webkit-border-radius: 20px;
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
-moz-box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
transition: box-shadow 0.2s;
}
.pin.placed.boundary {
box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.4);
-moz-box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.4);
-webkit-box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.4);
}
jQuery
// make pins draggable (using jQuery UI)
$(".pin").draggable({
// apply collision effect (using UI Draggable Collision)
obstacle: ".placed",
preventCollision: true,
// optional, snap to pixel grid (using jQuery UI)
grid: [5,5],
// animate on start of drag (using jQuery UI)
start: function(e, ui) {
$(this).removeClass('placed'),
$('.placed').addClass('boundary');
},
// animate on end of drag (using jQuery UI)
stop: function(e, ui) {
$(this).addClass('placed'),
$('.placed').removeClass('boundary');
}
});
推荐阅读
- vue.js - 在 Vue 2 中,如何在两个组件之间传递变量?这仅适用于父子组件吗?
- spring - 在事务方法中返回 UpdatedEntity
- python - 获取元素的滚动高度或高度,而不是正文硒
- python - 根据两列的值计数选择行
- sql - 删除 sql 表上的内存优化并删除它创建的文件组
- asp.net-core - 在加密的 cookie 中缓存散列密码以连接旧版 API?
- python - fillna(0) 首先但 NaN 值出现在 iloc
- angular - Angular 12 翻译不起作用
- c# - 从 PHP 转换为 C#
- database - 使用 Firestore 封装集合是一种不好的做法吗?