启用 scrollX 时,包含按钮下拉列表的行会导致垂直滚动

Posted

技术标签:

【中文标题】启用 scrollX 时,包含按钮下拉列表的行会导致垂直滚动【英文标题】:Row containing a button dropdown causes vertical scrolling when scrollX is enabled 【发布时间】:2019-10-16 11:11:01 【问题描述】:

由于显示的列数,我有一个启用了 scrollX 的数据表。表行包含一个引导按钮下拉菜单,其中包含多个项目。选择下拉菜单时,滚动已启用,很难选择正确的操作。选择下拉菜单时如何调整视口大小以使垂直滚动不出现?

jsfiddle 是https://jsfiddle.net/darwinaero/q9mLg375/15/


    $(function() 

      $('#tblTest').DataTable(
        dom: 'Blfrtip',
        scrollX: true,
        paging: true,
        responsive: true
      );
    );


    <div class="container-fluid">
      <div class="row">
        <div class="col-md-12">
          <table id="tblTest">
            <thead>
              <tr>
                <th>Col1</th>
                <th>Col2</th>
                <th>Col3</th>
                <th>Col4</th>
                <th>Col5</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>some data</td>
                <td>some data</td>
                <td>some data</td>
                <td>some data</td>
                <td>
                  <div class="btn-group">
                    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        Action <span class="caret"></span>
      </button>
                    <ul class="dropdown-menu">
                      <li><a href="#">Action</a></li>
                      <li><a href="#">Another action</a></li>
                      <li><a href="#">Something else here</a></li>
                      <li role="separator" class="divider"></li>
                      <li><a href="#">Separated link</a></li>
                    </ul>
                  </div>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>

【问题讨论】:

【参考方案1】:

你有三个我能想到的选择:

    div.dataTables_scrollBody 元素的 css 和/或 javascript 覆盖 overflow。 将 datatables-settings 中的 scrollY 设置为固定值(如 600,对于 600 像素)。 编写您自己的下拉元素,将打开的下拉列表呈现在表格元素的外部/上方。

前两个选项可以很简单的实现。

这是选项 1 的示例:

由于将溢出设置为可见会产生一些我们通常不想要的损坏滚动行为,因此我们必须从引导下拉菜单中监听事件并动态应用溢出样式。

$(function()        
  $('#tblTest').DataTable(
    dom: 'Blfrtip',
    scrollX: true,
    paging: true,
    responsive: true
  );
  
  $('#tblTest').on('show.bs.dropdown', function () 
    $('.dataTables_scrollBody').addClass('dropdown-visible');
  )
  .on('hide.bs.dropdown', function () 
    $('.dataTables_scrollBody').removeClass('dropdown-visible');
  );
);
div.dataTables_scrollBody.dropdown-visible 
  overflow: visible !important;
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<link href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet"/>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>

<div class="container-fluid">
  <div class="row">
    <div class="col-md-12">
      <table id="tblTest">
        <thead>
          <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
            <th>Col4</th>
            <th>Col5</th>
            <th>Col6</th>
            <th>Col7</th>
            <th>Col8</th>
            <th>Col9</th>
            <th>Col10</th>
            <th>Col11</th>
            <th>Col12</th>
            <th>Col13</th>
            <th>Col14</th>
            <th>Col15</th>
            <th>Col16</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>some data</td>
            <td>some data</td>
            <td>
<div class="btn-group">
  <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    Action <span class="caret"></span>
  </button>
  <ul class="dropdown-menu">
    <li><a href="#">Action</a></li>
    <li><a href="#">Another action</a></li>
    <li><a href="#">Something else here</a></li>
    <li role="separator" class="divider"></li>
    <li><a href="#">Separated link</a></li>
  </ul>
</div>
            </td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
</div>

【讨论】:

【参考方案2】:

使用属性 data-container="body"

<select data-container="body">
...
</select>

http://jsfiddle.net/IceManSpy/Y9hyD/2/

【讨论】:

【参考方案3】:

对我来说最简单的解决方法是为 dataTables_scrollBody 设置一个最小高度。您可以根据下拉列表中的项目列表增加最小高度。只需将其添加到您的样式表中即可。

.dataTables_scrollBody 
 min-height: 250px !important;

【讨论】:

以上是关于启用 scrollX 时,包含按钮下拉列表的行会导致垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

使用AngularJS在下拉列表中按选定值启用/禁用按钮

使用 Google Chrome 启用 scrollX 或 scrollY 时,数据表中出现重复的空标题

启用/禁用选择/下拉菜单和下拉单选按钮?

JQuery数据表隐藏引导下拉菜单

如何在js中选择下拉项目时启用按钮?

如何在Angular 7中单击按钮时获取下拉列表的选定选项[重复]