如何动态定位绝对div?

网络领域

假设我有一个 1000 像素的页面宽度,我的页眉包含 10 个使用justify-content: space-between. 如果我悬停nav 1链接,绝对菜单 div 将显示宽度为特定宽度left: 0,如果我悬停nav 2,另一个菜单 div 将显示为left: 0. 但是,当我悬停nav 7或 时nav 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%;
}
JBES

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

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

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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章