首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSS flex布局:添加填充或页边距时换行

CSS flex布局:添加填充或页边距时换行
EN

Stack Overflow用户
提问于 2017-10-30 05:57:19
回答 2查看 2.3K关注 0票数 1

我正在尝试创建一个导航栏,在左侧创建一个徽标,并在剩余空间居中显示链接。我遵循了这个线程中的说明:In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?,并对ul使用了margin:auto;,以使其居中。到目前为止,这一切都运行得很好,但是当我在ul中添加marginpadding anywhere时,链接列表就会打包。我在ul上试用了box-sizing:border-box;,但没有成功。我该如何解决这个问题呢?小提琴:http://jsfiddle.net/30sy5dmy/5/

代码语言:javascript
运行
复制
nav img {
  height: 60px;
}

nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.links {
  margin: auto;
}

nav ul li {
  display: inline-block;
  list-style: none;
  margin: 0 2%;
}
代码语言:javascript
运行
复制
<nav>
  <img src="https://teststein.000webhostapp.com/Logo.png">
  <ul class="links">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
  </ul>
</nav>

EN

回答 2

Stack Overflow用户

发布于 2017-10-30 07:18:42

列表项是换行的,因为您使用的是百分比边距。

当您将项目的水平边距设置为2%时,浏览器将在确定容器大小后计算该2%的长度。换句话说,百分比不会计入容器宽度。

因此,当将2%的长度添加到物品上时,总长度超过容器的总长度,并发生包装。

解决方案#1:white-space: nowrap

解决此问题的一种方法是使用the property在容器中隐藏换行符。这会强制所有项保持在同一行上,必要时会溢出容器。

代码语言:javascript
运行
复制
nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border: 1px dashed black;   /* for demo only */
}

nav img {
  height: 60px;
}

.links {
  margin: auto;
  white-space: nowrap;     /* NEW */
  padding: 0;              /* optional; remove default indentation on list elements */
  border: 1px dashed red;  /* for demo only */
}

nav ul li {
  display: inline-block;
  list-style: none;
  margin: 0 2%;
}
代码语言:javascript
运行
复制
<nav>
  <img src="http://lorempixel.com/output/nature-q-c-60-60-1.jpg">
  <ul class="links">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
  </ul>
</nav>

解决方案#2:不要使用百分比值

如果使用百分比以外的任何值,列表项将不会换行,因为与百分比值不同的是,它们可以扩展容器以便于容纳。

代码语言:javascript
运行
复制
nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border: 1px dashed black;   /* for demo only */
}

nav img {
  height: 60px;
}

.links {
  margin: auto;
  padding: 0;              /* optional; remove default indentation on list elements */
  border: 1px dashed red;  /* for demo only */
}

nav ul li {
  display: inline-block;
  list-style: none;
  margin: 0 1em;            /* adjustment */
}
代码语言:javascript
运行
复制
<nav>
  <img src="http://lorempixel.com/output/nature-q-c-60-60-1.jpg">
  <ul class="links">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
  </ul>
</nav>

解决方案#3:使用flexbox

flex容器的初始设置是flex-direction: rowflex-wrap: nowrap。这意味着flex项目将水平排列,不能换行。

代码语言:javascript
运行
复制
nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border: 1px dashed black;   /* for demo only */
}

nav img {
  height: 60px;
}

.links {
  margin: auto;
  padding: 0;              /* optional; remove default indentation on list elements */
  border: 1px dashed red;  /* for demo only */
  display: flex;           /* new */
}

nav ul li {
  display: inline-block;
  list-style: none;
  margin: 0 1em;            /* adjustment; avoid percentage margins on flex items;
                               see this post:
                               https://stackoverflow.com/q/36783190/3597276 */
}
代码语言:javascript
运行
复制
<nav>
  <img src="http://lorempixel.com/output/nature-q-c-60-60-1.jpg">
  <ul class="links">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
  </ul>
</nav>

解决方案#4:干净有效的方法

此解决方案尝试使用尽可能少的代码来实现此目标。希望能有所帮助。

代码语言:javascript
运行
复制
nav             { display: flex; align-items: center; }
nav img         { height: 60px; }
a:first-of-type { margin-left: auto; }
a:last-of-type  { margin-right: auto; }
a + a           { margin-left: 1em; }
代码语言:javascript
运行
复制
<nav>
    <img src="http://lorempixel.com/output/nature-q-c-60-60-1.jpg">
    <a href="#">Link 1</a>
    <a href="#">Link 2</a>
    <a href="#">Link 2</a>
    <a href="#">Link 2</a>
</nav>

票数 2
EN

Stack Overflow用户

发布于 2017-10-30 06:12:43

只需将display: flex添加到links,然后,因为使用百分比作为flex项目的边距不会呈现相同的跨浏览器,所以使用例如视口单位。

代码语言:javascript
运行
复制
nav img {
  height: 60px;
}
nav {
  display: flex;
  align-items: center;
}
.links {
  display: flex;
  margin: auto;
}
nav ul li {
  list-style: none;
  margin: 0 2vw;
}
代码语言:javascript
运行
复制
<nav>
  <img src="http://lorempixel.com/output/nature-q-c-60-60-1.jpg">
  <ul class="links">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 2</a></li>
  </ul>
</nav>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47005656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档