一个元素的垂直对齐基于相邻元素的内容而变化

时间:2016-05-29 15:19:55

标签: html css

以下是我无法重新创建的内容:enter image description here

link to jsfiddle for reference

这是我遇到的问题,“BBC”似乎根据下一个div块中是否包含登录而上下跳跃。我不能让边界保持在40px内,或者将“登录”或“BBC”文本放在中心或BBC中心。我花了几个小时测试各种项目,我无法让它工作 - 如果你能解释代码和正在发生的行为(为什么HTML呈现它的方式,我将非常感激) )。为什么BBC和Sign In的左边界溢出40px高度?

html, body, p {
  margin: 0;
  padding: 0;
}
.container {
  width: 1000px;
  margin: 0 auto;
}
.top-nav-bar {
  height: 40px;
  border-bottom: 1px firebrick solid;
  margin-bottom: 30px;
}
.top-nav-logo-area {
  display: inline-block;
  padding-right: 25px;
}
.logo {
  background-color: black;
  color: white;
  font-family: monospace;
  font-size: 25px;
}
.top-nav-link-div {
  display: inline-block;
  border-left: 1px #cccccc solid;
  height: 40px;
}
<!-- WITH CONTENT NEXT TO LOGO -->

<div class="container top-nav-bar">

  <div class="top-nav-logo-area">
    <span class="logo">B</span>
    <span class="logo">B</span>
    <span class="logo">C</span>
  </div>

  <div class="top-nav-link-div">
    hello
  </div>
</div>


<!--WITHOUT CONTENT NEXT TO LOGO -->

<div class="container top-nav-bar">

  <div class="top-nav-logo-area">
    <span class="logo">B</span>
    <span class="logo">B</span>
    <span class="logo">C</span>
  </div>

  <div class="top-nav-link-div">
    <!-- empty -->

  </div>
</div>

3 个答案:

答案 0 :(得分:1)

我认为这是你想要实现的目标:

JSFiddle

我使用float left因此徽标不受文字影响。我也做了一些你想要的改进:

html,
body,
p {
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
}

.container {
    width: 1000px;
    margin: 0 auto;
}

.top-nav-bar {
    height: 40px;
    border-bottom: 1px firebrick solid;
    margin-bottom: 30px;
}

.top-nav-logo-area {
    display: inline-block;
    padding: 7px 7px 0 20px;
    float: left;
}

.logo {
    background-color: #222;
    color: white;
    font-family: monospace;
    font-size: 22px;
    padding: 0 5px;
    margin: 0 0 0 3px;
    line-height: 26px;
    cursor: default;
}

.top-nav-link-div {
    display: inline-block;
    border-left: 1px #cccccc solid;
    height: 40px;
    line-height: 40px;
    padding: 0 7px;
}
<div class="container top-nav-bar">

  <div class="top-nav-logo-area">
    <span class="logo">B</span><span class="logo">B</span><span class="logo">C</span>
  </div>

  <div class="top-nav-link-div">
    hello
  </div>
</div>

答案 1 :(得分:1)

您正在处理inline-block元素。

适用于内联级元素的vertical-align属性的默认值为baseline。这将获取徽标容器(.top-nav-logo-area)并使其基线(或底部边距边缘,如果没有基线)与父框的基线(.top-nav-bar)对齐。

除此之外,您已使用height: 40px约束父级的高度(自然高度为46px)。

这会强制徽标框溢出父母的底部。

是否缩短了父级的高度,vertical-align属性应该适用于徽标容器。

来自规范:

  

vertical-align

     

此属性会影响行框内的垂直定位   由内联级元素生成的框。

     

<强> 基线

     

将框的基线与父框的基线对齐。如果   框没有基线,将底边边缘对齐   父母的基线。

     

<强> 中间

     

将框的垂直中点与父级的基线对齐   框加上父母的x高度的一半。

&#13;
&#13;
* { box-sizing: border-box; }

html, body, p {
    margin: 0;
    padding: 0;
}

.container {
    width: 1000px;
    margin: 0 auto;
}

.top-nav-bar {
    height: 40px;             /* height constrained; natural height 46px */
    border-bottom: 1px firebrick solid;
    margin-bottom: 30px;
}

.top-nav-logo-area {
    display: inline-block;
    padding-right: 25px;
    border: 1px dashed red;
    vertical-align: top;     /* other options include `baseline`, `bottom` and `middle` */
}

.logo {
    background-color: black;
    color: white;
    font-family: monospace;
    font-size: 25px;
}

.top-nav-link-div {
    display: inline-block;
    border-left: 1px #cccccc solid;
    height: 40px;
}
&#13;
<!-- WITH CONTENT NEXT TO LOGO -->
<div class="container top-nav-bar">
    <div class="top-nav-logo-area">
        <span class="logo">B</span>
        <span class="logo">B</span>
        <span class="logo">C</span>
    </div>
    <div class="top-nav-link-div">
        hello
    </div>
</div>

<!--WITHOUT CONTENT NEXT TO LOGO -->
<div class="container top-nav-bar">
    <div class="top-nav-logo-area">
        <span class="logo">B</span>
        <span class="logo">B</span>
        <span class="logo">C</span>
    </div>
    <div class="top-nav-link-div"><!-- empty --></div>
</div>
&#13;
&#13;
&#13;

jsFiddle

答案 2 :(得分:-1)

不确定问题是什么,但你可以尝试添加box-sizing:border-box; -moz-箱尺寸:边界盒;你的元素:)

也试试float:left;它可以解决它。

请添加一个jsfiddle,很容易为你解决问题。