我正在玩jQuery和拖放功能。我有一个div
,在CSS中设置为hidden
。激活拖动元素时,应通过将droppable
设置为display
(这是默认值)来显示inline
元素。
但是,display: inline;
不会否决display: none;
。怎么做(通过jQuery或CSS)?
我目前的代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>jQuery UI Droppable - Visual feedback</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<style>
#draggable2 { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
#droppable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 10px; }
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; display: none; }
.droppable-highlight { display: inline; }
h3 { clear: left; }
</style>
<script>
$(function() {
$( "#draggable2" ).draggable();
$( "#droppable" ).droppable({
accept: "#draggable2",
activeClass: "droppable-highlight",
drop: function( event, ui ) {
$( this )
.addClass( "ui-state-highlight" )
.find( "p" )
.html( "Dropped!" );
}
});
});
</script>
</head>
<body>
<h3>Feedback on activating draggable:</h3>
<div id="draggable2" class="ui-widget-content">
<p>Drag me to my target</p>
</div>
<div id="droppable" >
<p>Drop here</p>
</div>
</body>
</html>
Tinker.io链接:http://tinker.io/bf197
答案 0 :(得分:4)
问题是,当隐藏droppable时,jQuery UI代码不会将类添加到droppable(具有display: none
)。如果 可见,会添加
这是一个没有display: none
的更新修补程序:http://tinker.io/bf197/1
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; }
#droppable.droppable-highlight { border-color: red; display: block; }
如果您使用Chrome的开发工具或类似工具,您会看到课程已添加(并且边框变为红色)。
但请再次使用display: none
查看此内容:http://tinker.io/bf197/2
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; display: none; }
#droppable.droppable-highlight { border-color: red; display: block; }
如果您在开发工具中观看,该类永远不会被添加。显然,jQuery UI会忽略droppable,如果它不可见。
您可能需要将此问题视为jQuery UI团队的一个问题,因为代码似乎明确地检查了这种情况。
我确实找到了部分解决方法:使用visibility
而不是display
:http://tinker.io/bf197/3
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; visibility: hidden; }
#droppable.droppable-highlight { visibility: visible; }
这有效,但当然,问题是visibility: hidden
的元素仍占用其布局空间。
您可以从布局中移除元素而不使其display: none
并获得所需的效果:http://tinker.io/bf197/5
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 40px; position: absolute; left: -10000px; }
#droppable.droppable-highlight { border-color: red; position: static; }
这可以通过在正常情况下将元素放置在页外,但是当它具有类时覆盖该定位。除了攻击jQuery UI代码之外,我认为这与你将要获得的display: none
行为非常接近。
其他说明:
我更新了上面规则的选择器,因此它足够具体,因为否则ID选择器的特异性会影响类选择器的特异性。
display
的默认div
值为block
,而不是inline
。
答案 1 :(得分:1)
考虑这段代码:
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; display: none; }
.droppable-highlight { display: inline; }
第一个是id-selector,它比第二个(类选择器)更具体。将.droppable-highlight
更改为#droppable.droppable-highlight
可以解决问题:)
您还需要为#droppable.ui-state-highlight
执行相同的操作,因为当您放手时,droppable-highlight
类会被删除。
其次,当一个元素为display:none
时,它不占用屏幕上的空间,你不能“掉落”它。相反,请使用visibility
所以,最终的代码是:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>jQuery UI Droppable - Visual feedback</title>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<style>
#draggable2 { width: 90px; height: 90px; padding: 0.5em; float: left; margin: 10px 10px 10px 0; }
#droppable2 { width: 120px; height: 120px; padding: 0.5em; float: left; margin: 10px; }
#droppable { border-width: 3px; border-style: solid; border-color: #585FCC; height: 20px; visibility:hidden; }
#droppable.droppable-highlight { border-color: red; visibility:visible; }
#droppable.ui-state-highlight { border-color: red; visibility:visible; }
h3 { clear: left; }
</style>
<script>
$(function() {
$( "#draggable2" ).draggable();
$( "#droppable" ).droppable({
accept: "#draggable2",
activeClass: "droppable-highlight",
drop: function( event, ui ) {
$( this )
.addClass( "ui-state-highlight" )
.find( "p" )
.html( "Dropped!" );
}
});
});
</script>
</head>
<body>
<h3>Feedback on activating draggable:</h3>
<div id="draggable2" class="ui-widget-content">
<p>Drag me to my target</p>
</div>
<div id="droppable" >
<p>Drop here</p>
</div>
</body>
</html>