cod*_*oob 6 javascript css z-index
当菜单在彼此之上展开时,我有一些代码最初会出现故障。
如果您在第一个菜单中选择选项二,则会出现第二个选项。如果您随后打开第一个菜单,您会看到它在打开时出现故障 - 几乎有类似快门的延迟。也许它与 z 索引设置有关,我不确定?
在 Firefox 和 chrome 中,没有(明显的)故障。在 safari 中,下面的代码段有一个小故障。
为什么会出现故障?
const selected = document.querySelectorAll(".selected");
const optionsContainer = document.querySelectorAll(".options-container");
for (let i = 0; i < selected.length; i++) {
selected[i].addEventListener("click", () => {
optionsContainer[i].classList.toggle("open");
selected[i].classList.toggle("open");
for (let j = 0; j < selected.length; j++) {
if (i != j && selected[j].classList.contains("open")) {
optionsContainer[j].classList.toggle("open");
selected[j].classList.toggle("open");
}
}
});
}
for (let i = 0; i < optionsContainer.length; i++) {
let optionsList = optionsContainer[i].querySelectorAll(".options");
for (let j = 0; j < optionsList.length; j++) {
optionsList.forEach(o => {
o.addEventListener("click", () => {
selected[i].innerHTML = o.querySelector("label").innerHTML;
optionsContainer[i].classList.remove("open");
selected[i].classList.remove("open");
if (document.getElementById("level").innerText.indexOf('one') === -1) {
document.getElementById("tier").style.display = "grid";
} else {
document.getElementById("tier").style.display = "none";
}
});
});
}
}Run Code Online (Sandbox Code Playgroud)
.filter-filterbox-row {
display: grid;
grid-template-columns: auto auto;
grid-template-areas: "question select-box";
padding: 5px 5px;
margin-top: -2px;
}
.filter-filterbox-row .question {
grid-template-areas: "question";
width: 100px;
padding-top: 5px;
padding-bottom: 10px;
padding-left: 15px;
text-align: right;
}
.filter-filterbox-row .select-box {
margin-left: -100px;
grid-template-areas: "select-box";
}
.select-box {
width: 200px;
}
.select-box .options-container {
background: #fff;
width: 200px;
display: none;
transition: all 0.4s;
position: absolute;
max-height: 240px;
border: 1px solid #253e5c;
border-radius: 0 0 4.5px 4.5px;
}
.selected {
position: relative;
border: 1px solid #cdcccc;
border-radius: 4.5px;
padding: 4px 15px;
cursor: pointer;
transition: all 0.4s;
}
.selected.open {
border-bottom: none;
border-radius: 4.5px 4.5px 0 0;
transition: all 0.4s;
border-color: #253e5c
}
.selected::after {
content: "";
background: url(media/dropdown-black.png);
background-size: contain;
background-repeat: no-repeat;
position: absolute;
height: 100%;
width: 12px;
right: 13px;
top: 10px;
transition: all 0.4s;
}
.selected.open::after {
transform: rotateX(180deg);
top: -11px;
}
.select-box .options-container.open {
border-color: #253e5c;
display: block;
z-index: 99;
}
.select-box .options-container.open .options:nth-child(n+2) {
border-top: 1px solid #253e5c;
}
.select-box .options-container .options {
padding-top: 5px;
padding-bottom: 5px;
padding-left: 15px;
}
.select-box .options:hover {
background: #76bc6b;
cursor: pointer;
}
.select-box label {
cursor: pointer;
}
.select-box .options .radio {
display: none;
}
#tier {
display: none;
}Run Code Online (Sandbox Code Playgroud)
<div class="filter-filterbox-row" id="level">
<div class="question"> Level </div>
<div class="select-box">
<div class="selected">
Select level
</div>
<div class="options-container">
<div class="options">
<input type="radio" class="radio" id="1" name="level">
<label for="1">one</label>
</div>
<div class="options">
<input type="radio" class="radio" id="2" name="level">
<label for="2">two</label>
</div>
</div>
</div>
</div>
<div class="filter-filterbox-row" id="tier">
<div class="question"> Select tier </div>
<div class="select-box">
<div class="selected">
Select tier
</div>
<div class="options-container">
<div class="options">
<input type="radio" class="radio" id="bronze" name="tier">
<label for="bronze">Bronze</label>
</div>
<div class="options">
<input type="radio" class="radio" id="silver" name="tier">
<label for="silver">silver</label>
</div>
</div>
</div>
</div>Run Code Online (Sandbox Code Playgroud)
小智 1
将添加position: relative;到类.filter-filterbox-row中将立即修复 Safari 的问题:
.filter-filterbox-row {
display: grid;
grid-template-columns: auto auto;
grid-template-areas: "question select-box";
padding: 5px 5px;
margin-top: -2px;
position: relative;
}
Run Code Online (Sandbox Code Playgroud)
position: static;如果没有明确说明,则为文档的默认正常流程。z-index: 99由于您已经在子 div 上声明了a :
.select-box .options-container.open {
border-color: #253e5c;
display: block;
z-index: 99;
}
Run Code Online (Sandbox Code Playgroud)
...声明 z-index 假设 div 处于绝对位置,因此我们需要为父 div 声明一个位置,即.filter-filterbox-row. 此外,position: absolute;如果您需要声明top、或属性bottom,则需要在子 div 上添加 。leftright
为父 div 声明显式位置是防止此类不同浏览器行为故障的一种方法。当我们在子 div 上声明 z-index 并将位置声明为相对位置时,我们总是这样做,同样的做法也应该声明父 div 以及相对或绝对位置,以便子 div 做出相应的行为。
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |