【问题标题】:Dropdown list moves other elements下拉列表移动其他元素
【发布时间】:2021-06-27 03:32:28
【问题描述】:

这里我有一个完全使用 vanilla JavaScript 制作的下拉菜单。 但是当我点击下拉按钮时,它会移动其他元素。

let dropdownBtn = document.querySelector("button.dropdown-btn");
let itemListWrapper = document.querySelector("div.item-list-wrapper");

dropdownBtn.addEventListener("click", () => {
  if (itemListWrapper.style.display === "none") {
    itemListWrapper.style.display = "block";
  } else {
    if (itemListWrapper.style.display === "block" || itemListWrapper.style.display === "") {
      itemListWrapper.style.display = "none";
    }
  }
});

function continuouslyClickDropdownBtn() {
  dropdownBtn.click();
  setTimeout(() => {
    continuouslyClickDropdownBtn();
  }, 750);
}

continuouslyClickDropdownBtn();
.container {
  background-color: lightblue;
  height: 200px;
  padding: 0 2em;
}

.dropdown-wrapper {
  width: fit-content;
  background-color: hsla(0, 0%, 95%, 0.9);
  padding: 0.3em;
  border-radius: 0.3em;
  position: relative;
}

.dropdown-btn {
  border-radius: 0.3em;
  width: 100%;
  height: 1.75em;
  font-size: 1.25em;
  cursor: pointer;
}

.item-list-wrapper {
  margin-top: 0.5em;
}

.dropdown-item-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 0.1em
}

.dropdown-item {
  font-size: 1em;
  width: 100%;
  padding: 0.2em 0;
  display: flex;
  flex-direction: row;
  cursor: pointer;
}

.dropdown-item:hover {
  background-color: hsla(0, 0%, 80%, 1);
  font-weight: bold;
}

.dropdown-item span {
  flex-grow: 1;
  padding: 0 1empx;
}
<div class="container">
  <p>upper text</p>
  <div class="dropdown-wrapper">
    <button class="dropdown-btn">Media Quality</button>
    <div class="item-list-wrapper">
      <ul class="dropdown-item-list">
        <li class="dropdown-item">
          <span>360p</span>
        </li>
        <li class="dropdown-item">
          <span>720p</span>
        </li>
        <li class="dropdown-item">
          <span>1080p</span>
        </li>
      </ul>
    </div>
  </div>
  <p>bottom text</p>
</div>

我尝试添加这个 CSS:

.item-list-wrapper {
  margin-top: 0.5em;
  position: absolute;
}

然后它会从所有项目中删除背景颜色。 即使将 background-color: hsla(0, 0%, 95%, 0.9); 添加到类中,它也只会将其添加到项目的宽度中。 一旦打开,我无法让背景颜色环绕整个下拉菜单。

如何解决这个问题?

【问题讨论】:

    标签: javascript html css drop-down-menu


    【解决方案1】:

    .item-list-wrapper 使用绝对定位,添加额外的规则来规范这个下拉菜单的显示。将此选择器与 css 规则一起使用:

    .item-list-wrapper {
        position: absolute;
        left: 0;
        right: 0;
        background-color: inherit;
        padding: inherit;
        border-radius: 0 0 0.3em 0.3em;
    }
    

    通过这些规则,您可以继承背景颜色,使宽度相对于父级,并为下拉菜单的底部设置边框半径。

    let dropdownBtn = document.querySelector("button.dropdown-btn");
    let itemListWrapper = document.querySelector("div.item-list-wrapper");
    
    dropdownBtn.addEventListener("click", () => {
        if (itemListWrapper.style.display === "none") {
            itemListWrapper.style.display = "block";
        } else {
            if (itemListWrapper.style.display === "block" || itemListWrapper.style.display === "") {
                itemListWrapper.style.display = "none";
            }
        }
    });
    
    function continuouslyClickDropdownBtn() {
        dropdownBtn.click();
        setTimeout(() => {
            continuouslyClickDropdownBtn();
        }, 750);
    }
    
    continuouslyClickDropdownBtn();
    .container {
        background-color: lightblue;
        height: 200px;
        padding: 0 2em;
    }
    
    .dropdown-wrapper {
        width: fit-content;
        background-color: hsla(0, 0%, 95%, 0.9);
        padding: 0.3em;
        border-radius: 0.3em;
        position: relative;
    }
    
    .dropdown-btn {
        border-radius: 0.3em;
        width: 100%;
        height: 1.75em;
        font-size: 1.25em;
        cursor: pointer;
    }
    
    .item-list-wrapper {
        position: absolute;
        left: 0;
        right: 0;
        background-color: inherit;
        padding: inherit;
        border-radius: 0 0 0.3em 0.3em;
    }
    
    .dropdown-item-list {
        list-style: none;
        padding: 0;
        margin: 0;
        display: flex;
        flex-direction: column;
        gap: 0.1em;
    }
    
    .dropdown-item {
        font-size: 1em;
        width: 100%;
        padding: 0.2em 0;
        display: flex;
        flex-direction: row;
        cursor: pointer;
    }
    
    .dropdown-item:hover {
        background-color: hsla(0, 0%, 80%, 1);
        font-weight: bold;
    }
    
    .dropdown-item span {
        flex-grow: 1;
        padding: 0 1empx;
    }
    <div class="container">
        <p>upper text</p>
        <div class="dropdown-wrapper">
            <button class="dropdown-btn">Media Quality</button>
            <div class="item-list-wrapper">
                <ul class="dropdown-item-list">
                    <li class="dropdown-item">
                        <span>360p</span>
                    </li>
                    <li class="dropdown-item">
                        <span>720p</span>
                    </li>
                    <li class="dropdown-item">
                        <span>1080p</span>
                    </li>
                </ul>
            </div>
        </div>
        <p>bottom text</p>
    </div>

    【讨论】:

    • 谢谢!。完美运行。这正是我想要的。
    • @DostArora,很高兴为您提供帮助!
    【解决方案2】:

    一种方法是拥有一个inner-wrapper 并将其设置为position:fixed 您必须设置 dropdown-wrapper 的高度,以便该元素在页面上仍然存在块

    let dropdownBtn = document.querySelector("button.dropdown-btn");
    let itemListWrapper = document.querySelector("div.item-list-wrapper");
    
    dropdownBtn.addEventListener("click", () => {
      if (itemListWrapper.style.display === "none") {
        itemListWrapper.style.display = "block";
      } else {
        if (itemListWrapper.style.display === "block" || itemListWrapper.style.display === "") {
          itemListWrapper.style.display = "none";
        }
      }
    });
    
    function continuouslyClickDropdownBtn() {
      dropdownBtn.click();
      setTimeout(() => {
        continuouslyClickDropdownBtn();
      }, 750);
    }
    
    continuouslyClickDropdownBtn();
    .container {
      background-color: lightblue;
      height: 200px;
      padding: 0 2em;
    }
    
    .dropdown-wrapper {
      position: relative;
      height: 40px;
    }
    
    .inner-wrapper {
      position: fixed;
      width: fit-content;
      background-color: hsla(0, 0%, 95%, 0.9);
      padding: 0.3em;
      border-radius: 0.3em;
    }
    
    .dropdown-btn {
      border-radius: 0.3em;
      width: 100%;
      height: 1.75em;
      font-size: 1.25em;
      cursor: pointer;
    }
    
    .item-list-wrapper {
      margin-top: 0.5em;
    }
    
    .dropdown-item-list {
      list-style: none;
      padding: 0;
      margin: 0;
      display: flex;
      flex-direction: column;
      gap: 0.1em
    }
    
    .dropdown-item {
      font-size: 1em;
      width: 100%;
      padding: 0.2em 0;
      display: flex;
      flex-direction: row;
      cursor: pointer;
    }
    
    .dropdown-item:hover {
      background-color: hsla(0, 0%, 80%, 1);
      font-weight: bold;
    }
    
    .dropdown-item span {
      flex-grow: 1;
      padding: 0 1empx;
    }
    <div class="container">
      <p>upper text</p>
      <div class="dropdown-wrapper">
        <div class="inner-wrapper">
          <button class="dropdown-btn">Media Quality</button>
          <div class="item-list-wrapper">
            <ul class="dropdown-item-list">
              <li class="dropdown-item">
                <span>360p</span>
              </li>
              <li class="dropdown-item">
                <span>720p</span>
              </li>
              <li class="dropdown-item">
                <span>1080p</span>
              </li>
            </ul>
          </div>
        </div>
      </div>
      <p>bottom text</p>
    </div>

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多