【问题标题】:How to center icons horizontally above text (no flexbox/grid)?如何在文本上方水平居中图标(无弹性框/网格)?
【发布时间】:2020-12-11 23:59:03
【问题描述】:

我正在处理 psd 转换,我需要在不使用弹性框和网格的情况下将字体真棒图标水平居中于文本上方。包裹它们的 ul 将在移动设备上垂直堆叠。

我需要通过仅使用 css 来完成此操作。任何帮助表示赞赏。

 <div class="info-section">
      <!-- <div class="wrapper clearfix"> -->
        <section class="info-section-container">
          <ul>
            <li><a href="#" class="info-link"><i class="fas fa-location-arrow contact-icons" aria-hidden="true"></i>Locations</a></li>
            <li><a href="#" class="info-link"><i class="fas fa-ticket-alt contact-icons" aria-hidden="true"></i>Tickets</a></li>
           <li><a href="#" class=info-link><i class="fas fa-phone contact-icons" aria-hidden="true"></i>Reach Out</a></li>
        </ul>
      <!-- </div> -->
      </div>
/* this centers the entire container  */
 .info-section-container {
    /* width: 50%; */
    text-align: center;
    margin: 0 25%;

  }

  /* to position the li horizontally */
  .info-section-container ul li {
    float: left;
  }

  .info-link  {
  font-family: 'Montserrat', sans-serif;
  font-size: 3rem;
  font-weight: 700;
  text-transform: uppercase;
  text-align: center;
  /* for accesability */
  padding: 10px;
  /* width: 30%;
  display: inline-block; */
 }

  .contact-icons {
    display: block;
    text-align: center;
    padding-bottom: 20px;
  }

【问题讨论】:

    标签: html css layout responsive-design


    【解决方案1】:

    如果您只想将所有&lt;li&gt; 项目和图标居中,那么您只需进行很少的更改。您真正需要做的就是添加以下规则:

    .info-section-container {  margin: 0 auto; }
    .info-section-container ul { list-style: none; padding: 0; }
    .info-link {  text-align: center; display: inline-block; /* and your own styles here */ }
    .fas.contact-icons { display:block; }
    

    它们的工作原理:

    • 最大的问题是info-section-container 的左右边距为 25% - 这在移动设备上太大了,文本不适合,它会突出到右边。
      要使整个容器居中,请使用margin: 0 auto;。如果你想限制它的大小,你可以使用max-width
    • &lt;ul&gt; 元素左侧有填充,会影响居中对齐,所以需要设置为 0
    • info-link 元素设置为 inline-block 和 text-align center
    • 您需要在 .contact-icons 选择器中包含 .fas 以覆盖默认 CSS

    您可以在下面看到它的工作原理 - 请注意,我添加了一个 650 像素的媒体查询,因此您可以看到它堆叠在此处,并且在您查看展开的 sn-p 时是水平的。

    /* this centers the entire container  */
    .info-section-container {
      max-width: 1000px;
      text-align: center;
      margin: 0 auto;
    }
    
    .info-section-container ul {
      list-style: none;
      display: inline-block;
      padding: 0;
    }
    
    .info-section-container ul li {
      text-align: center;
      margin: 20px 0;
      display: inline-block;
    }
    
    .info-link {
      font-family: 'Montserrat', sans-serif;
      font-size:3em;
      font-weight: 700;
      text-transform: uppercase;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      /* for accesability */
      padding: 10px;
    }
    
    .fa.contact-icons, /* for this demo only */
    .fas.contact-icons {
      display: block;
      padding-bottom:10px;
    }
    
    @media screen and (max-width: 650px){
      .info-section-container ul li { display: block;}
    }
    <link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
    
    <div class="info-section">
      <section class="info-section-container">
        <ul>
          <li><a href="#" class="info-link"><i class="fa fa-location-arrow contact-icons" aria-hidden="true"></i>Locations</a></li>
          <li><a href="#" class="info-link"><i class="fa fa-ticket contact-icons" aria-hidden="true"></i>Tickets</a></li>
          <li><a href="#" class=info-link><i class="fa fa-phone contact-icons" aria-hidden="true"></i>Reach Out</a></li>
        </ul>
      </section>
    </div>

    仅供参考,我使用上面的 Font Awesone 4.7,因为 5 在 CDN 上不可用。主要区别在于类是.fa 而不是.fas

    【讨论】:

    • 这太好了,我真的很感激!它就像一个魅力。关于 .fas 选择器的快速问题 - 此处覆盖了哪个 CSS 规则。如果我不使用它,图标仍然有显示:阻止规则,但它实际上不起作用。
    • @KarmenSalim 很高兴为您提供帮助!在这种情况下,.contact-block {display:block} 不起作用的原因是 Font Awesome 样式被包含在 这个 CSS 之后并覆盖了您的显示设置。通过使用.fas.contact-block,我们使选择器更加具体,因此它不会被覆盖。您可以了解更多关于CSS specificity here
    【解决方案2】:

    在你的 ul 上添加一些 flex 容器

    <ul class="flex-container">
        <li><a href="#" class="info-link"><i class="fas fa-location-arrow contact-icons" aria-hidden="true"></i>Locations</a></li>
        <li><a href="#" class="info-link"><i class="fas fa-ticket-alt contact-icons" aria-hidden="true"></i>Tickets</a></li>
        <li><a href="#" class=info-link><i class="fas fa-phone contact-icons" aria-hidden="true"></i>Reach Out</a></li>
    </ul>
    

    还有几个新的 flex 类

    .flex-container {
        display: flex;
    }
    .flex-container li {
        display: flex;
        flex-direction: column;
    }
    

    应该让图标在文字上方

    【讨论】:

    • 我需要用纯 css 来完成这个,没有 flexbox。
    • @KarmenSalim flexbox is CSS...如果您有不想使用它的原因,那么您应该在问题中提及它,否则它就是一个有效的答案。
    • @KarmenSalim 是否有您需要支持的旧目标浏览器?如果不像其他人所说的那样,Flexbox 就是 CSS。如果您仍然怀疑,请检查caniuse.com/#feat=flexbox 的兼容性
    • 对不起,我没有澄清,我正在为我的课程做一个项目,他们不允许我们只使用 flexbox 的 CSS 和浮动。
    【解决方案3】:

    我将您的代码编辑为:

    .info-section-container {
         align-items: center;
         justify-content: center;
         text-align: center;
         position: absolute;
         left: 25%;
    }
    
    .info-link {
         width: 50vw;
         height: 30vh;
         display: flex;
         flex-direction: column;
    
         margin-top: 5%;
         margin-bottom: 5%;
      
         font-family: 'Montserrat', sans-serif;
         font-size: 3rem;
         font-weight: 700;
         text-transform: uppercase;
    }
    <div class="info-section">
            <div class="info-section-container">
                <a href="#" class="info-link"><i class="fas fa-location-arrow contact-icons" aria-hidden="true"></i>Locations</a>
                <a href="#" class="info-link"><i class="fas fa-ticket-alt contact-icons" aria-hidden="true"></i>Tickets</a>
               <a href="#" class=info-link><i class="fas fa-phone contact-icons" aria-hidden="true"></i>Reach Out</a>
          </div>
     </div>

    首先,我将信息链接的宽度调整为 50vw。它覆盖了屏幕宽度的一半。因此,它从左右两边都有 25% 的边距。你想让它们居中,所以我给了额外的 left,它是绝对位置的 25%,并在 .info-section-container 中添加了 justify-conter: center 以使三个文本水平居中。

    我选择 display as flex 来设置列的 flex 方向。

    然后,在 .info-section-container 中,我添加了 align-items: center 以垂直居中这三个项目。

    希望我能帮上忙。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 2020-12-11
      • 2011-03-29
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多