127

如何对齐两个内联块,使一个在左侧,另一个在同一行右侧?为什么这么难?是否有类似 LaTeX 的 \hfill 可以消耗它们之间的空间来实现这一点?

我不想使用浮点数,因为使用内联块我可以排列基线。当窗口对于他们俩来说都太小时,使用内联块我可以将 text-align 更改为 center ,它们将彼此居中。相对(父)+ 绝对(元素)定位与浮动有相同的问题。

HTML5:

<header>
    <h1>Title</h1>
    <nav>
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </nav>
</header>

的CSS:

header {
    //text-align: center; // will set in js when the nav overflows (i think)
}

h1 {
    display: inline-block;
    margin-top: 0.321em;
}

nav {
    display: inline-block;
    vertical-align: baseline;
}

他们就在彼此旁边,但我想要nav在右边。

图表

4

9 回答 9

165

编辑:自从我回答这个问题以来已经过去了 3 年,我想需要一个更现代的解决方案,尽管目前的解决方案可以做到这一点:)

1.弹性盒

它是迄今为止最短和最灵活的。应用display: flex;到父容器并调整其子容器的位置,justify-content: space-between;如下所示:

.header {
    display: flex;
    justify-content: space-between;
}

可以在这里在线看到 - http://jsfiddle.net/skip405/NfeVh/1073/

但请注意,flexbox 支持是 IE10 和更新版本。如果您需要支持 IE 9 或更早版本,请使用以下解决方案:

2.你可以使用text-align: justify这里的技术。

.header {
    background: #ccc; 
    text-align: justify; 

    /* ie 7*/  
    *width: 100%;  
    *-ms-text-justify: distribute-all-lines;
    *text-justify: distribute-all-lines;
}
 .header:after{
    content: '';
    display: inline-block;
    width: 100%;
    height: 0;
    font-size:0;
    line-height:0;
}

h1 {
    display: inline-block;
    margin-top: 0.321em; 

    /* ie 7*/ 
    *display: inline;
    *zoom: 1;
    *text-align: left; 
}

.nav {
    display: inline-block;
    vertical-align: baseline; 

    /* ie 7*/
    *display: inline;
    *zoom:1;
    *text-align: right;
}

工作示例可以在这里看到:http: //jsfiddle.net/skip405/NfeVh/4/。此代码适用于 IE7 及更高版本

如果 HTML 中的 inline-block 元素没有用空格分隔,则此解决方案将不起作用 - 请参见示例http://jsfiddle.net/NfeVh/1408/。当您使用 Javascript 插入内容时,可能会出现这种情况。

如果我们不关心 IE7,只需忽略 star-hack 属性。使用您的标记的工作示例在这里 - http://jsfiddle.net/skip405/NfeVh/5/。我只是添加了header:after部分并证明了内容。

为了解决使用after伪元素插入的额外空间的问题,可以font-size将父元素设置为 0 并将子元素重置为 14px。这个技巧的工作示例可以在这里看到:http: //jsfiddle.net/skip405/NfeVh/326/

于 2012-04-23T08:33:26.367 回答
5

利用@skip405的回答,我为它制作了一个Sass mixin:

@mixin inline-block-lr($container,$left,$right){
    #{$container}{        
        text-align: justify; 

        &:after{
            content: '';
            display: inline-block;
            width: 100%;
            height: 0;
            font-size:0;
            line-height:0;
        }
    }

    #{$left} {
        display: inline-block;
        vertical-align: middle; 
    }

    #{$right} {
        display: inline-block;
        vertical-align: middle; 
    }
}

它接受 3 个参数。容器,左右元素。例如,为了适合这个问题,您可以像这样使用它:

@include inline-block-lr('header', 'h1', 'nav');
于 2015-11-04T18:29:25.293 回答
3

如果你不想使用浮动,你将不得不包装你的导航:

<header>
<h1>Title</h1>
<div id="navWrap">
<nav>
    <a>A Link</a>
    <a>Another Link</a>
    <a>A Third Link</a>
</nav>
</div>
</header>

...并添加一些更具体的 css:

header {
//text-align: center; // will set in js when the nav overflows (i think)
width:960px;/*Change as needed*/
height:75px;/*Change as needed*/
}

h1 {
display: inline-block;
margin-top: 0.321em;
}

#navWrap{
position:absolute;
top:50px; /*Change as needed*/
right:0;
}

nav {
display: inline-block;
vertical-align: baseline;
}

你可能需要做更多的事情,但这是一个开始。

于 2012-04-22T22:33:30.457 回答
3

对于这两个元素使用

display: inline-block;

'nav' 元素使用

float: right;
于 2017-07-01T08:57:34.680 回答
2

正确对齐项目的新方法:

网格

.header {
        display:grid;
        grid-template-columns: 1fr auto;
    }

演示

Bootstrap 4. 右对齐

<div class="row">
      <div class="col">left</div>
      <div class="col">
          <div class="float-right">element needs to be right aligned</div>
      </div>
</div>

演示

于 2018-10-02T19:13:50.137 回答
1

如果您已经在屏幕太小时使用 JavaScript 将内容居中(根据您对标题的评论),为什么不使用 JavaScript 撤消浮动/边距并正常使用浮动和边距。

您甚至可以使用 CSS 媒体查询来减少您使用的 JavaScript 数量。

于 2012-04-22T22:26:37.330 回答
1

我认为一种可能的解决方案是使用display: table

.header {
  display: table;
  width: 100%;
  box-sizing: border-box;
}

.header > * {
  display: table-cell;
}

.header > *:last-child {
  text-align: right;  
}

h1 {
  font-size: 32px;
}

nav {
  vertical-align: baseline;
}

JSFiddle:http: //jsfiddle.net/yxxrnn7j/1/

于 2016-05-11T07:16:17.127 回答
0

给它 float: right 和 h1 float:left 并在它们之后放置一个带有 clear:both 的元素。

于 2012-04-22T22:22:08.950 回答
0

显示父母的左中和右。如果您有 3 个以上的元素,则为它们使用 nth-child() 。

在此处输入图像描述

HTML 示例:

<body>
    <ul class="nav-tabs">
        <li><a  id="btn-tab-business" class="btn-tab nav-tab-selected"  onclick="openTab('business','btn-tab-business')"><i class="fas fa-th"></i>Business</a></li>
        <li><a  id="btn-tab-expertise" class="btn-tab" onclick="openTab('expertise', 'btn-tab-expertise')"><i class="fas fa-th"></i>Expertise</a></li>
        <li><a  id="btn-tab-quality" class="btn-tab" onclick="openTab('quality', 'btn-tab-quality')"><i class="fas fa-th"></i>Quality</a></li>
    </ul>
</body>

CSS 示例:

.nav-tabs{
  position: relative;
  padding-bottom: 50px;
}

.nav-tabs li {
  display: inline-block;  
  position: absolute;
  list-style: none;
}
.nav-tabs li:first-child{
  top: 0px;
  left: 0px;
}
.nav-tabs li:last-child{
  top: 0px;
  right: 0px;
}
.nav-tabs li:nth-child(2){
  top: 0px;
  left: 50%;
  transform: translate(-50%, 0%);
}
于 2020-07-05T13:35:05.833 回答