gpt4 book ai didi

html - 如何动态定位绝对div?

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:59 24 4
gpt4 key购买 nike

假设我有一个 1000 像素的页面宽度,我的页眉包含 10 个使用 justify-content: space-between 的水平导航元素。如果我将鼠标悬停在 nav 1 链接上,绝对菜单 div 将显示一个特定宽度和 left: 0,如果我将鼠标悬停在 nav 2 上,另一个菜单 div 仍将显示为 left: 0。但是,当我将鼠标悬停在 nav 7nav 8 时,如何自动使菜单右对齐 (right: 0)?

这是我的 html 和 css 的代码片段:

<nav>
<ul>
<li>
<a href="#">Nav menu1</a>
<div class="menu">Content menu 1</div>
</li>
<li>
<a href="#">Nav menu2</a>
<div class="menu">Content menu 2</div>
</li>
<li>
<a href="#">Nav menu3</a>
<div class="menu">Content menu 3</div>
</li>
<li>
<a href="#">Nav menu4</a>
<div class="menu">Content menu 4</div>
</li>
<li>
<a href="#">Nav menu5</a>
<div class="menu">Content menu 5</div>
</li>
<li>
<a href="#">Nav menu6</a>
<div class="menu">Content menu 6</div>
</li>
<li>
<a href="#">Nav menu7</a>
<div class="menu">Content menu 7</div>
</li>
<li>
<a href="#">Nav menu8</a>
<div class="menu">Content menu 8</div>
</li>
<li>
<a href="#">Nav menu9</a>
<div class="menu">Content menu 9</div>
</li>
<li>
<a href="#">Nav menu10</a>
<div class="menu">Content menu 10</div>
</li>
</ul>
</nav>


ul {
display: flex;
font-size: 15px;
height: 100%;
border: solid 1px #ccc;
max-width: 1200px;
margin: 0 auto;
padding: 24px;
align-items: center;
justify-content: space-between;
}

ul > li {
display: flex;
position: relative;
cursor: pointer;
padding-left: 6px;
padding-right: 6px;
height: 40px;
align-items: center;
white-space: nowrap;
list-style: none;
}

.menu {
display: block;
position: absolute;
visibility: hidden;
color: #333;
width: 500px;
background: #fff;
padding: 18px;
min-height: 80px;
box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12);
opacity: 0;
transition: all .4s ease;
transition-delay: .3s;
left: 0;
top: 140%;
z-index: 99999;
}

ul > li:hover .menu {
display: block;
visibility: visible;
opacity: 1;
top: 100%;
}

最佳答案

您的问题缺少很多信息,包括您正在使用的代码。看来您可能正在寻找第 n 个子伪类来定义范围。

以下是通用的,因为您没有提供 HTML 示例,并且会影响第 6 个到第 10 个 child 。

CSS:

 li:nth-child(n+6):nth-child(-n+10){
right:0;
}

编辑:更新答案,现在问题更清楚了......

请参阅下面添加了(普通)Javascript 的示例。

<!doctype html>
<html>
<head>

<style>
ul{
display:flex;
font-size:15px;
height:100%;
border:solid 1px #ccc;
max-width:1200px;
margin:0 auto;
padding:24px;
align-items:center;
justify-content:space-between;
}
ul > li{
display:flex;
position:relative;
cursor:pointer;
padding-left:6px;
padding-right:6px;
height:40px;
align-items:center;
white-space:nowrap;
list-style:none;
}
.menu{
display:block;
position:absolute;
visibility:hidden;
color:#333;
width:500px;
background:#fff;
padding:18px;
min-height:80px;
box-shadow:0px 2px 1px -1px rgba(0,0,0,0.2), 0px 1px 1px 0px rgba(0,0,0,0.14), 0px 1px 3px 0px rgba(0,0,0,0.12);
opacity:0;
transition:all .4s ease;
transition-delay:.3s;
top:140%;
}
ul > li:hover .menu{
display:block;
visibility:visible;
opacity:1;
top:100%;
}
</style>

</head>
<body>

<nav>
<ul>
<li>
<a href="#">Nav menu1</a>
<div class="menu">Content menu 1</div>
</li><li>
<a href="#">Nav menu2</a>
<div class="menu">Content menu 2</div>
</li><li>
<a href="#">Nav menu3</a>
<div class="menu">Content menu 3</div>
</li><li>
<a href="#">Nav menu4</a>
<div class="menu">Content menu 4</div>
</li><li>
<a href="#">Nav menu5</a>
<div class="menu">Content menu 5</div>
</li><li>
<a href="#">Nav menu6</a>
<div class="menu">Content menu 6</div>
</li><li>
<a href="#">Nav menu7</a>
<div class="menu">Content menu 7</div>
</li><li>
<a href="#">Nav menu8</a>
<div class="menu">Content menu 8</div>
</li><li>
<a href="#">Nav menu9</a>
<div class="menu">Content menu 9</div>
</li><li>
<a href="#">Nav menu10</a>
<div class="menu">Content menu 10</div>
</li>
</ul>
</nav>

<script>
var elems=document.querySelectorAll('div.menu'); //Get NodeList of elements
elems.forEach(function(elem){ //Iterate
var pos=elem.getBoundingClientRect(); //Get element info
let stat=document.elementFromPoint(pos.right,0); //Check position
if(stat===null){ //Will be null if out of viewport
elem.style.right='0'; //Add the right:0; style
}else{
elem.style.left='0'; //Add the left:0; style
}});
</script>

</body>
</html>

编辑 2:根据要求,只需更改 JavaScript 以检查容器。

现在这将匹配第一个 <ul>在文档中找到。你可能想要 <ul id="cont">并与 id 匹配:

<script>
//var cont=document.getElementById('cont'); //Match by ID
var cont=document.querySelector('ul'); //Match first <ul>

var posc=cont.getBoundingClientRect(); //Get container info
var elems=document.querySelectorAll('div.menu'); //Get NodeList of elements
elems.forEach(function(elem){ //Iterate
var posv=elem.getBoundingClientRect(); //Get element info
var offset=posc.right-posv.right; //Calculate difference
if(offset<0){ //Will be <0 if out of container
elem.style.right='0'; //Add the right:0; style
}else{
elem.style.left='0'; //Add the left:0; style
}});
</script>

关于html - 如何动态定位绝对div?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com