下拉列表移动其他元素
Dropdown list moves other elements
这里我有一个完全使用 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);
添加到 class,它也只是将其添加到项目的宽度。
打开后,我无法让背景色环绕整个下拉菜单。
如何解决这个问题?
一种方法是使用 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>
对 .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>
这里我有一个完全使用 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);
添加到 class,它也只是将其添加到项目的宽度。
打开后,我无法让背景色环绕整个下拉菜单。
如何解决这个问题?
一种方法是使用 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>
对 .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>