【问题标题】:How to align divs so top right of child touches bottom left of parent?如何对齐div,使孩子的右上角接触父母的左下角?
【发布时间】:2018-02-01 12:05:34
【问题描述】:

我正在尝试在我的网站上创建一个消息框,以便当用户单击收件箱图标时会出现一个带有消息的框。类似于stackoverflow如何做到这一点。 Stackoverflow 通过在包含收件箱、成就等的有序列表之外放置一个 div,然后绝对定位该 div,使其看起来从收件箱图标中删除。

我也在尝试这样做,但我希望消息框成为列表项的子项。

.list {
  display: flex;
  position: relative;
}

div.messages {
  display: block;
  position: absolute;
}
<ol class="list">
  <ul> inbox
    <div class="messages"> some message<br> blah blah another message
    </div>
  </ul>
  <ul> another </ul>
</ol>

有没有一种简单的方法来确保消息框的右上角接触到列表项的左下角,而不管消息框的宽度如何?

也许我在想这个错误,这真的不是亲子情况(因为我想要做的基本上是将孩子放在父母之外......)。但是对于我网站部分的概念组织,我确实希望将其作为父母的孩子来处理。

【问题讨论】:

  • 你的代码很薄。你知道消息框的宽度吗?你知道身高吗?如果没有,你愿意使用 javascript 吗?如果你知道宽度/高度,那就很简单了。
  • 我看到你在使用 flexbox,这让这有点棘手。查看 CSS 网格。 css-grid 将使这项工作变得超级简单。
  • 嗨,我愿意使用 javascript,事实上这就是我计划显示/隐藏框的方式(使用 display:block 和 display:hide)。我想我可以设置消息框的固定宽度,但高度会改变。谢谢,布赖恩
  • 啊,好吧,所以 css-grid 本质上看起来像表格。也许我会试一试。谢谢!
  • 顺便说一句,您的 HTML 无效。只有&lt;li&gt; 元素可以是&lt;ul&gt; 元素的子元素。

标签: html css flexbox css-position


【解决方案1】:

喜欢这个

 $(".nav_link").on('click',function() {

   $(this).next('.container').addClass("block_container");
 })
    .list {
      	display: inline-block
      	position: relative;
    }
    li{
        list-style: none;
    }
    .list .dropdown_ancker{
      	display: inline-block;
      	width: 50px;
      	background-color: red;
        list-style: none;
        margin-right: 12px;
      	position: relative;
    }
    .container{
        position: absolute;
        display: none;

      }
      .block_container{
        display: block;

      }

      .container{
      background-color: green;
      right:50px;

      }

      .container li{
        color: #252525;
        padding: 12px 20px;


      }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ol class = "list"> 

       <li class="dropdown_ancker">another</li>
       <li class="dropdown_ancker">
        <span class="nav_link">inbox</span>
        <ul class="container">
          <li class="m">something</li>
          <li class="m">something</li>
        </ul>

       </li><!--
    --><li class="dropdown_ancker">another</li>
    </ol>

.container right= dropdown_ancker 宽度

【讨论】:

  • 这似乎不符合 OP 的要求。你有孩子的左上角,而不是右上角,触摸父母的左下角。
  • 这样好吗@TylerH
  • 你可以使用jQ .toggleClass()@Brian
  • 好的,我知道如何调整框的右上角与父级的左下角接触。谢谢。我将不得不考虑这对在手机屏幕上观看意味着什么。也许我需要媒体查询,或者 css3 有一些其他属性(flex 或其他东西)将有助于实现这一目标。再次感谢,布赖恩
  • 点击,因为您无法将鼠标悬停在链接“消息框的右上角触及左下角”@TylerH
【解决方案2】:

您的父级ul 也应该有position: relative;,然后您可以将right: 0; 设置为您的下拉列表div.messages。另外,我认为不需要设置 .list 在这里作为flexbox

.list {
  display: flex;
  position: relative;
}

div.messages {
  display: block;
  position: absolute;
  right: 0;
  border: 1px solid blue; /*for testing only, easier to see the element*/
}

ul {
  border: 1px solid red; /*for testing only, easier to see the element*/
  position: relative;
  padding: 0 10px;
}

li {
  list-style: none; /*to remove the bullet symbol from li*/
}
<ol class="list">
  <li>
    <ul>
      <li>
        inbox
        <div class="messages"> some message<br> blahblahblahblah blah another message
        </div>
      </li>
    </ul>
  </li>
  <li>
    <ul>
      <li>another</li>
    </ul>
  </li>
</ol>

【讨论】:

    【解决方案3】:

    如果你知道如何使用正确的 html 结构、元素定位、css 调整和 jquery,你就可以做到这一点。这是我为您创建的示例。它在每个li 之后使用一个简单的ulmenu-box div 来实现所需的结果。

    $(function(){
      
     $('.main-menu li > a').click(function(){
        $('.menu-box').hide();
        $(this).next().show();
      });
      
      $(document).mouseup(function(e) 
    {
        var container = $(".menu-box");
    
        // if the target of the click isn't the container nor a descendant of the container
        if (!container.is(e.target) && container.has(e.target).length === 0) 
        {
            container.hide();
        }
    });
      
    });
    @import url(//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css);
    
    body{
      padding:0px;
      margin:0px;
    }
    
    .fa {
    position: relative;
    display: table-cell;
    width: 60px;
    height: 40px;
    text-align: center;
    vertical-align: middle;
    font-size:25px;
    }
    
    .main-menu{
      width:100vw;
      height:38px;
      text-align:center;
    }
    
    .main-menu>ul {
    margin:10px;
      display:inline-block;
    }
    
    .main-menu li {
    position:relative;
    display:block;
    width:60px;
    float:left;
    }
    
    .main-menu li>a {
    position:relative;
    display:table;
    border-collapse:collapse;
    border-spacing:0;
    color:#999;
    font-family: arial;
    font-size: 16px;
    text-decoration:none;
    border:1px solid black;
    }
    
    .menu-box{
    background:gray;
    border:1px solid black;
    width:250px;
    height:350px; /*Set as necesary or auto based on content*/
    overflow:hidden;
    z-index:1000;
    display:none;
    margin-top:-1px;
    position:absolute;
    /*left:0*/  /* Use this if your want to align box to the left*/
    right:60px; /* width of icon can be set in jQuery if dynamic */
    }
    
    .hidden{
      display:none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h2>Click on any icon</h2>
    <nav class="main-menu">
                <ul>
                    <li>
                        <a>
                            <i class="fa fa-home fa-2x"></i>
                        </a>
                      <div class="menu-box"></div>
                    </li>
                    <li>
                        <a href="#">
                            <i class="fa fa-laptop fa-2x"></i>
                        </a>
                        <div class="menu-box"></div>
                    </li>
                    <li>
                        <a href="#">
                           <i class="fa fa-list fa-2x"></i>
                        </a>
                        <div class="menu-box"></div>
                    </li>
                </ul>
      </nav>

    希望这会有所帮助。快乐编码。 :)

    【讨论】:

    • 非常感谢。我对后端开发感到更加自在,并且从您和其他人那里看到这些示例确实可以理清问题并帮助提高我的前端技能。对于小宽度,我是否只使用媒体查询并将菜单框设置为相对位置?
    • 你可以试试。如果你能给我一个关于你的想法的具体结构,那么我可以提供帮助。
    • 嗨 Nasir,我的网站是 guitar-dreams.com。通知将位于主菜单项旁边的右上角。我在我的本地环境中有些工作,但试图获取通知窗口的格式,带有标题等,以及其他元素的其他样式属性只是让它变得很痛苦。无论如何,不​​要太过分。实际上,我在 upwork 上发布了一份工作请求,因为我想花更少的时间在开发上,而花更多的时间弹吉他!
    • 太好了。我是美国一家虚拟人力资源公司的经理。如果您愿意,我可以为您提供资源来满足您的开发需求。如果/当您有任何不想自己做的开发需求并想了解更多信息时,请告诉我或发送电子邮件至 nasirtariq@gmail.com。快乐的编码和吉他演奏:)
    猜你喜欢
    • 2014-05-17
    • 2017-05-13
    • 2017-07-02
    • 2013-12-22
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多