显示设置为无时显示div

时间:2013-04-08 09:07:24

标签: javascript html css

我正在玩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

2 个答案:

答案 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而不是displayhttp://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)

这是因为CSS preference rules

考虑这段代码:

#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>

http://tinker.io/bf197/4