Flexbox 忽略链接上的填充和宽度

Posted

技术标签:

【中文标题】Flexbox 忽略链接上的填充和宽度【英文标题】:Flexbox ignores padding & width on links 【发布时间】:2017-12-10 16:08:06 【问题描述】:

基本上,我有一个使用 flexbox 的导航,并且一切正常。但是,最近回顾它时,我注意到 Li 中的 <a> 与 Li 本身的大小不同,因此不能使整个 Li 可点击。

我尝试了许多不同的方法来使<a> 的大小相同,当我向它们在检查器中显示为具有填充但填充不可点击的链接添加填充时...

.header .navigation 
  display: block;
  width: 100%;
  position: relative;


.header .navigation ul 
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: row;


.header .navigation ul li 
  float: none;
  display: inline-block;
  background-color: #9dabc0;
  border-right: 1px solid #7e899a;
  border-left: 1px solid #bdc6d4;
  text-align: center;
  flex-grow: 1;


.header .navigation ul li:last-child 
  background-color: #b4a042;
  border-right: none;


.header .navigation ul li:last-child:hover 
  background-color: #b49242;


.header .navigation ul li:last-child a 
  padding: 0 5px;
  text-align: center;


.header .navigation ul li:first-child 
  border-left: none;


.header .navigation ul li:hover 
  background: #3a495e;


.header .navigation ul li a 
  font-size: 16px;
  font-family: "Open Sans";
  color: #fff;
  font-weight: bold;
  line-height: 59px;
  text-shadow: 0.5px 0.866px 0 rgba(1, 1, 1, 0.39);
  padding: 0 5px;
  text-align: center;
  width: 100%;


.header .navigation ul li ul 
  left: 0px;
  top: 0px;
  margin-left: 0px;
  display: none;
  /* hide all sub menus from view */
  position: absolute;
  z-index: 100;
  background: #9dabc0;
  top: 59px;
  /* this should be the same height as the top level menu -- height + padding + borders */
  margin-left: 0px;
  width: 100%;


.header .navigation ul li ul li 
  border-top: 1px solid #7e899a;
  border-bottom: 1px solid #bdc6d4;
  border-left: none;
  border-right: none;
  background-color: #9dabc0;
  height: 42px;
  display: block;


.header .navigation ul li ul li:last-child 
  border-bottom: none;
  background-color: #9dabc0;


.header .navigation ul li ul li:last-child a 
  padding: 10px 24px;


.header .navigation ul li ul li a 
  font-size: 16px;
  font-family: "Open Sans";
  width: 100%;
  color: #fff;
  font-weight: bold;
  text-shadow: 0.5px 0.866px 0px rgba(1, 1, 1, 0.39);
  display: block;
  line-height: 18px;
  padding: 10px 24px;


.header .navigation ul li ul li:hover 
  background: #3a495e;


.header .navigation ul li 
  position: relative;


.header .navigation ul li:hover>ul 
  display: block;


.header .navigation ul li li.has-children>a:after 
  color: green;
  content: ' ►';
  font-size: 10px;
  float: right;
  padding-right: 10px;
  vertical-align: 1px;


.header .navigation ul .current-menu-item:after 
  color: green;
  content: '▲';
  position: absolute;
  top: 100%;
  left: 30%;


.header .navigation ul .sub-menu .current-menu-item:after 
  content: none;


.header .navigation ul li.has-children>a:after 
  color: green;
  content: '▼';
  font-size: 10px;
  padding-left: 5px;
  vertical-align: 1px;



<div class="header">
  <div class="navigation">
    <ul>
      <li><a href="">Home</a></li>
      <li><a href="">Engineering Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li><a href="">Architectural Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li><a href="">Decorative Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li>
        <a href="">Downloads</a></li>
      <li>
        <a href="">Gallery</a></li>
      <li>
        <a href="">Contact</a></li>
      <li>
        <a href="">Blog</a></li>
      <li>
        <a href="">FREE Castings Guide</a></li>
    </ul>
  </div>
</div>

这是代码笔:https://codepen.io/danielvickerssa/pen/ZyjqRr

【问题讨论】:

【参考方案1】:

如果将display: flex 添加到列表项,它们将强制子元素(在本例中为&lt;a&gt;)拉伸容器的整个高度。

这是 flex 容器中的默认设置 - align-items: stretch

只需将其添加到您的代码中:

li 
    display: flex;

https://codepen.io/anon/pen/JJBePq

【讨论】:

经过测试并且可以工作,谢谢 :) 我一定是在之前的工作中删除了这段代码。 这里的答案很好。【参考方案2】:

您可以制作链接inline-block,然后您可以给它们垂直填充/高度。 display: inline-block; height: 100%; 使它们填充父 li

.header .navigation 
  display: block;
  width: 100%;
  position: relative;


.header .navigation ul 
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: row;


.header .navigation ul li 
  float: none;
  display: inline-block;
  background-color: #9dabc0;
  border-right: 1px solid #7e899a;
  border-left: 1px solid #bdc6d4;
  text-align: center;
  flex-grow: 1;


.header .navigation ul li:last-child 
  background-color: #b4a042;
  border-right: none;


.header .navigation ul li:last-child:hover 
  background-color: #b49242;


.header .navigation ul li:last-child a 
  padding: 0 5px;
  text-align: center;


.header .navigation ul li:first-child 
  border-left: none;


.header .navigation ul li:hover 
  background: #3a495e;


.header .navigation ul li a 
  font-size: 16px;
  font-family: "Open Sans";
  color: #fff;
  font-weight: bold;
  line-height: 59px;
  text-shadow: 0.5px 0.866px 0 rgba(1, 1, 1, 0.39);
  padding: 0 5px;
  text-align: center;
  width: 100%;
  display: inline-block;
  height: 100%;


.header .navigation ul li ul 
  left: 0px;
  top: 0px;
  margin-left: 0px;
  display: none;
  /* hide all sub menus from view */
  position: absolute;
  z-index: 100;
  background: #9dabc0;
  top: 59px;
  /* this should be the same height as the top level menu -- height + padding + borders */
  margin-left: 0px;
  width: 100%;


.header .navigation ul li ul li 
  border-top: 1px solid #7e899a;
  border-bottom: 1px solid #bdc6d4;
  border-left: none;
  border-right: none;
  background-color: #9dabc0;
  height: 42px;
  display: block;


.header .navigation ul li ul li:last-child 
  border-bottom: none;
  background-color: #9dabc0;


.header .navigation ul li ul li:last-child a 
  padding: 10px 24px;


.header .navigation ul li ul li a 
  font-size: 16px;
  font-family: "Open Sans";
  width: 100%;
  color: #fff;
  font-weight: bold;
  text-shadow: 0.5px 0.866px 0px rgba(1, 1, 1, 0.39);
  display: block;
  line-height: 18px;
  padding: 10px 24px;


.header .navigation ul li ul li:hover 
  background: #3a495e;


.header .navigation ul li 
  position: relative;


.header .navigation ul li:hover>ul 
  display: block;


.header .navigation ul li li.has-children>a:after 
  color: green;
  content: ' ►';
  font-size: 10px;
  float: right;
  padding-right: 10px;
  vertical-align: 1px;


.header .navigation ul .current-menu-item:after 
  color: green;
  content: '▲';
  position: absolute;
  top: 100%;
  left: 30%;


.header .navigation ul .sub-menu .current-menu-item:after 
  content: none;


.header .navigation ul li.has-children>a:after 
  color: green;
  content: '▼';
  font-size: 10px;
  padding-left: 5px;
  vertical-align: 1px;



<div class="header">
  <div class="navigation">
    <ul>
      <li><a href="">Home</a></li>
      <li><a href="">Engineering Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li><a href="">Architectural Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li><a href="">Decorative Castings</a>
        <ul>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
          <li><a href="">Example</a></li>
        </ul>
      </li>
      <li>
        <a href="">Downloads</a></li>
      <li>
        <a href="">Gallery</a></li>
      <li>
        <a href="">Contact</a></li>
      <li>
        <a href="">Blog</a></li>
      <li>
        <a href="">FREE Castings Guide</a></li>
    </ul>
  </div>
</div>

【讨论】:

@DanielVickers 我在写答案之前就看到了。这是另一种方式。

以上是关于Flexbox 忽略链接上的填充和宽度的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox:如何让 div 在不换行的情况下填充 100% 的容器宽度?

IE10 flexbox 宽度包括填充,导致溢出。 box-sizing:边框框不修复

Flexbox 不考虑宽度

带有 flexbox 的引导列在 iOS 和 Safari 上的宽度不合适

获取 flexbox 项目以填充剩余空间 [重复]

由于填充,Flexbox 无法使文本居中