Bootstrap把复选框放在下拉列表中

时间:2014-07-29 13:42:54

标签: html css twitter-bootstrap checkbox

我正试图在下拉列表中放入一个复选框表格:

<ul>
  <li class="dropdown">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">
      Dropdown Form<b class="caret"></b>
    </a>
    <ul class="dropdown-menu">
      <li><label class="checkbox"><input type="checkbox">Two</label></li>
      <li><label class="checkbox"><input type="checkbox">Two</label></li>
    </ul>
  </li>
</ul>

这是Demo in Bootply

但是,正如您在演示中所看到的,无论出于何种原因,实际的复选框本身都显示在下拉菜单之外。任何人都可以告诉我是什么原因造成的,以及应该如何实施?如果我拿出标签类它可以工作,但它们都已经完成了。

5 个答案:

答案 0 :(得分:12)

这就是我们要建立的:

Demo

HTML

从本质上讲,我们希望结合使用两组不同的Bootstrap控件和样式:DropdownsCheckboxes。在每个li内,我们将使用label而不是a元素,以便我们可以wrap the checkbox in a label并使整个行可单击。

<ul class="dropdown-menu checkbox-menu allow-focus">
  <li >
    <label>
      <input type="checkbox"> Cheese
    </label>
  </li>
</ul>

CSS

我们可以窃取通常应用于.dropdown-menu li a的某些样式,输入并将其应用于我们的标签选项。我们将使标签占据容器的整个宽度,并解决一些标签/复选框对齐问题。此外,我们将为.active:hover添加样式。

.checkbox-menu li label {
    display: block;
    padding: 3px 10px;
    clear: both;
    font-weight: normal;
    line-height: 1.42857143;
    color: #333;
    white-space: nowrap;
    margin:0;
    transition: background-color .4s ease;
}
.checkbox-menu li input {
    margin: 0px 5px;
    top: 2px;
    position: relative;
}

.checkbox-menu li.active label {
    background-color: #cbcbff;
    font-weight:bold;
}

.checkbox-menu li label:hover,
.checkbox-menu li label:focus {
    background-color: #f5f5f5;
}

.checkbox-menu li.active label:hover,
.checkbox-menu li.active label:focus {
    background-color: #b8b8ff;
}

JavaScript

其他一些内部管理,我们将在每个列表项上手动保留一个.active类标志,以与是否选中该项相对应,以便我们对其进行适当的样式设置。

$(".checkbox-menu").on("change", "input[type='checkbox']", function() {
   $(this).closest("li").toggleClass("active", this.checked);
});

我们还将希望通过阻止事件冒泡使菜单进入stay open on internal click events来允许多个选择

$(document).on('click', '.allow-focus', function (e) {
  e.stopPropagation();
});

堆栈摘要中的演示

$(".checkbox-menu").on("change", "input[type='checkbox']", function() {
   $(this).closest("li").toggleClass("active", this.checked);
});

$(document).on('click', '.allow-focus', function (e) {
  e.stopPropagation();
});
body {
  padding: 15px;
}

.checkbox-menu li label {
    display: block;
    padding: 3px 10px;
    clear: both;
    font-weight: normal;
    line-height: 1.42857143;
    color: #333;
    white-space: nowrap;
    margin:0;
    transition: background-color .4s ease;
}
.checkbox-menu li input {
    margin: 0px 5px;
    top: 2px;
    position: relative;
}

.checkbox-menu li.active label {
    background-color: #cbcbff;
    font-weight:bold;
}

.checkbox-menu li label:hover,
.checkbox-menu li label:focus {
    background-color: #f5f5f5;
}

.checkbox-menu li.active label:hover,
.checkbox-menu li.active label:focus {
    background-color: #b8b8ff;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.js"></script>



<div class="dropdown">
  <button class="btn btn-default dropdown-toggle" type="button" 
          id="dropdownMenu1" data-toggle="dropdown" 
          aria-haspopup="true" aria-expanded="true">
    <i class="glyphicon glyphicon-cog"></i>
    <span class="caret"></span>
  </button>
  <ul class="dropdown-menu checkbox-menu allow-focus" aria-labelledby="dropdownMenu1">
  
    <li >
      <label>
        <input type="checkbox"> Cheese
      </label>
    </li>
    
    <li >
      <label>
        <input type="checkbox"> Pepperoni
      </label>
    </li>
    
    <li >
      <label>
        <input type="checkbox"> Peppers
      </label>
    </li>
    
  </ul>
</div>

答案 1 :(得分:3)

Bootstrap在其文档中使用复选框的方式如下:

<div class="checkbox">
    <label>
        <input type="checkbox">Two
    </label>
</div>

所以你的看起来像是:

<ul>
    <li class="dropdown">
        <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown Form<b class="caret"></b></a>
        <ul class="dropdown-menu">
            <li>
                <div class="checkbox">
                    <label>
                        <input type="checkbox">Two
                    </label>
                </div>
            </li>
            <li>
                <div class="checkbox">
                    <label>
                        <input type="checkbox">Two
                    </label>
                </div>
            </li>
        </ul>
    </li>
</ul>

文档: http://getbootstrap.com/css/#forms

答案 2 :(得分:2)

我认为一个简单的解决方案是

<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" 
id="sampleDropdownMenu" data-toggle="dropdown">
Dropdown
</button>
<div class="dropdown-menu">
<button class="dropdown-item" type="button">
 <input type="checkbox">Action
 </button>
<button class="dropdown-item" type="button">
 <input type="checkbox">Action
</button>
<button class="dropdown-item" type="button">
  <input type="checkbox">Action
</button>
</div>
</div>

答案 3 :(得分:1)

这里的问题是您的复选框正在设置样式(通过Bootstrap):

.checkbox input[type=checkbox]{
    position: absolute;
    margin-left: -20px;
}

这可能是为了避免那些&#34;聚合&#34;您在.checkbox上删除<label>课程时看到的问题,但在这种情况下,导致margin-left出现问题。

通过对标记和CSS进行最小调整来解决此问题的一种方法就是在<label>添加一些填充以解释它:

label.checkbox{
    padding-left:20px;
}

这里有一个updated Bootply来向您展示代码的实际效果。希望这可以帮助!如果您有任何问题,请告诉我。

答案 4 :(得分:0)

由于列表很长,我非常喜欢@Kylemit的解决方案,并对其进行了一些修改。
只需将类pre-scrollable添加到ul中,列表就可以很好地滚动。