【问题标题】:CSS drop-down menu with search function - pinning search bar to top具有搜索功能的 CSS 下拉菜单 - 将搜索栏固定在顶部
【发布时间】:2020-11-25 01:36:36
【问题描述】:

我正在尝试使此下拉菜单中的搜索框 (#myInput) 在用户滚动选择菜单时固定在顶部,类似于在 Excel 中“冻结”一行。

是否可以在不将搜索框与菜单选项完全分离的情况下使用 CSS 实现此功能?还是我必须查看其他选项以保持搜索框固定?

function myFunction() {
  document.getElementById("myDropdown").classList.toggle("show");
}

function filterFunction() {
  var input, filter, ul, li, a, i;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  div = document.getElementById("myDropdown");
  a = div.getElementsByTagName("a");
  for (i = 0; i < a.length; i++) {
    txtValue = a[i].textContent || a[i].innerText;
    if (txtValue.toUpperCase().indexOf(filter) > -1) {
      a[i].style.display = "";
    } else {
      a[i].style.display = "none";
    }
  }
}
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">.dropbtn {
  background-color: #A41E34;
  color: white;
  padding: 16px;
  font-size: 18px;
  border: none;
  cursor: pointer;
}

.dropdown:hover .dropdown-content {
  display: block;
}

#myInput {
  box-sizing: border-box;
  background-color: #FFFFFF;
  min-width: 100%;
  font-size: 18px;
  padding: 14px 20px 12px 20px;
  border: none;
}

#myInput:focus {outline: 1px solid #ddd;}

.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f6f6f6;
  min-width: 100%;
  max-height: 420px;
  overflow: auto;
  font-size: 18px;
  border: 1px solid #ddd;
  z-index: 1;
}

.dropdown-content a {
  color: black;
  padding: 16px 20px;
  min-width: 100%;
  text-decoration: none;
  display: block;
}

.dropdown a:hover {background-color: #ddd;}

.show {display: block;}
</style>
<div class="dropdown"><button class="dropbtn" onclick="myFunction()">Select an Option</button>
    <div class="dropdown-content" id="myDropdown"><input id="myInput" onkeyup="filterFunction()" placeholder="Search..." type="text"> <a href="https://www.google.com">Option 1</a> <a href="https://www.google.com">Option 2</a> <a href="https://www.google.com">Option 3</a> <a href="https://www.google.com">Option 4</a> <a href="https://www.google.com">Option 5</a> <a href="https://www.google.com">Option 6</a> <a href="https://www.google.com">Option 7</a> <a href="https://www.google.com">Option 8</a> <a href="https://www.google.com">Choice 1</a> <a href="https://www.google.com">Choice 2</a> <a href="https://www.google.com">Choice 3</a> <a href="https://www.google.com">Choice 4</a></div>

【问题讨论】:

    标签: css


    【解决方案1】:

    要修改您的代码,我所做的只是在 CSS 中为 #myInput 元素添加两行代码。如果不移除上边距,滚动列表时会显示一些文本。我还根据文本大小 + 顶部和底部填充的值向第二个子元素添加了填充。

    function myFunction() {
      document.getElementById("myDropdown").classList.toggle("show");
    }
    
    function filterFunction() {
      var input, filter, ul, li, a, i;
      input = document.getElementById("myInput");
      filter = input.value.toUpperCase();
      div = document.getElementById("myDropdown");
      a = div.getElementsByTagName("a");
      for (i = 0; i < a.length; i++) {
        txtValue = a[i].textContent || a[i].innerText;
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
          a[i].style.display = "";
        } else {
          a[i].style.display = "none";
        }
      }
    }
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">.dropbtn {
      background-color: #A41E34;
      color: white;
      padding: 16px;
      font-size: 18px;
      border: none;
      cursor: pointer;
    }
    
    .dropdown:hover .dropdown-content {
      display: block;
    }
    
    #myInput {
      box-sizing: border-box;
      background-color: #FFFFFF;
      width: initial;
      font-size: 18px;
      padding: 14px 20px 12px 20px;
      border: none;
      position: sticky;
      display: block;
      top: 0;
      margin-top: 0;
    }
    
    #myInput:focus {outline: 1px solid #ddd;}
    
    .dropdown {
      position: relative;
      display: inline-block;
    }
    
    .dropdown-content {
      display: none;
      position: absolute;
      background-color: #f6f6f6;
      min-width: 100%;
      max-height: 420px;
      overflow: auto;
      font-size: 18px;
      border: 1px solid #ddd;
      z-index: 1;
    }
    
    .dropdown-content a {
      color: black;
      padding: 16px 20px;
      min-width: 100%;
      text-decoration: none;
      display: block;
    }
    
    .dropdown a:hover {background-color: #ddd;}
    
    .show {display: block;}
    </style>
    <div class="dropdown"><button class="dropbtn" onclick="myFunction()">Select an Option</button>
        <div class="dropdown-content" id="myDropdown"><input id="myInput" onkeyup="filterFunction()" placeholder="Search..." type="text"> <a href="https://www.google.com">Option 1</a> <a href="https://www.google.com">Option 2</a> <a href="https://www.google.com">Option 3</a> <a href="https://www.google.com">Option 4</a> <a href="https://www.google.com">Option 5</a> <a href="https://www.google.com">Option 6</a> <a href="https://www.google.com">Option 7</a> <a href="https://www.google.com">Option 8</a> <a href="https://www.google.com">Choice 1</a> <a href="https://www.google.com">Choice 2</a> <a href="https://www.google.com">Choice 3</a> <a href="https://www.google.com">Choice 4</a></div>

    【讨论】:

    • 感谢您的回复!我将这两行添加到该元素的 CSS 中,但它似乎将搜索栏分层放在第一个菜单项的顶部,使其不可见。
    • 我为第二个子元素添加了内边距——现在可以正常显示了。
    • 完美!这可以按我的意愿工作。感谢您的解决方案。现在我注意到搜索栏的边界在选择供文本输入时延长了菜单。此外,当使用搜索功能时,第一行结果隐藏在搜索栏下方。
    • OK——添加了另一个小修改——定位从固定变为粘性。
    • 这似乎可以解决问题 - 我只需要添加 top: 0;为了让它在 Safari 上运行,我添加了以下内容: position: -webkit-sticky;但是,当我在 iPhone 上使用最新版本的 Safari 进行测试时,搜索栏并没有保持粘性。可能是由于溢出:自动;在下拉元素中?
    【解决方案2】:

    作为其他方式,您可以使用 Bootstrap-Select 插件。它拥有一切。 检查它here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多