Search code examples
htmlcssvue.jsflexboxbulma

How do I vertically center text and icons in Bulma?


I'm trying to center an icon and text using Bulma and flexbox in a vue.js project, I tried to follow the answer from this question (How to vertically center elements in Bulma?). My icon vertically centers but the text elements seem to be off-center with a few pixels of white space under them. They are both on the same baseline but means they aren't in line with my icon (see image below).

Text off centre with icon

I'm not sure where I am going wrong, I've included my code below, I'd appreciate any help possible please

 <template>
   <div class="singleProjectContainer" :key="project.id">
     <ul class="columns is-flex projectPreview" style="border-bottom: 0.5px solid #c1c1c1;">
       <div class="column is-1 is-flex projectIcon">
         <li>
          <div v-if="project.projectType === 'Identity'"class="projectIcon" >
           <img src="../static/SVG/Identity-Circle.svg" alt="circle icon for branding & identity" />
         </div>
     </li>
   </div>
   <div class="projectTitle column is-4">
     <li> <h3>{{ project.Name }}</h3> </li>
     </div>
     <div class="projectSummary column is-7">
       <li> <p>{{ project.Summary }}</p> </li>
     </div>
   </ul>
 </div>
</template>

<script>
export default {
  name: 'ProjectItem',
  props: ['project'],
 }
</script>

<style scoped>

.columns {
  height: 100%;
  padding: 0;
  margin: 0;
 }

.singleProjectContainer {
 height: 72x;
 margin: 0px;
 }

.columns.projectPreview {
 -webkit-box-align: center;
 -ms-flex-align: center;
  align-items: center;
 }

.projectIcon {
 padding: 0 0 0 10px;
 height: 100%;
 }

.projectTitle {
 height: 100%;
}

.projectIcon img {
height: 20px;
width: 20px;
}

.projectTitle h3 {
 font-size: 1.2em;
 font-family: 'Sporting Grotesque_Regular';
 color: black;
}

</style>

Solution

  • .is-vcentered selector related only to columns: https://bulma.io/documentation/columns/options/#vertical-alignment

    .columns.is-vcentered {
        align-items: center;
    }
    

    Bulma >= 0.9.1

    Since Bulma, 0.9.1 we can use flexbox helpers:

    Combined with is-flex, all of the Flexbox CSS properties are available as Bulma helpers:

    • flex-direction
    • flex-wrap
    • justify-content
    • align-content
    • align-items
    • align-self
    • flex-grow
    • flex-shrink

    Example:

    <div class="is-align-items-center is-flex"></div>
    

    Snippet:

    <div class="container">
      <ul class="list">
        <li class="box list-item is-flex is-align-items-center  ">
          <span class="icon has-text-danger">
            <i class="fas has-text-success fa-2x fa-adjust"></i>
          </span>
          <h2 style="margin-left: 10px; font-size: 60px;  line-height: 1;">Hello world</h2>
          <h3 style="margin-left: auto;">Right text</h3>
        </li>
        <li class="box list-item  is-flex is-align-content-center">
          <span class="icon has-text-danger">
            <i class="fas has-text-danger fa-2x fa-exclamation-triangle"></i>
          </span>
          <h2 style="margin-left: 20px; font-size: 20px;">Item 2</h2>
          <h3 style="margin-left: auto;">Right text</h3>
        </li>
      </ul>
    </div>
    
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css">

    Bulma < 0.9.1 (Old answer)

    For lists - No "built-in" way (by helpers) to align icons and text (yet). One solution - use core is-flex and one CSS custom style (For align-items: center;) .

    Snippet:

    /* one custom class (not from bulma core) */
    li.vcenter{
      align-items: center;
    }
    <div class="container">
      <ul class="list">
        <li class="list-item is-flex vcenter">
          <span class="icon has-text-danger">
            <i class="fas has-text-success fa-2x fa-adjust"></i>
          </span>
          <h2 style="margin-left: 10px; font-size: 60px;  line-height: 1;">Hello world</h2>
          <h3 style="margin-left: auto;">Right text</h3>
        </li>
        <li class="list-item  is-flex vcenter">
          <span class="icon has-text-danger">
            <i class="fas has-text-danger fa-2x fa-exclamation-triangle"></i>
          </span>
          <h2 style="margin-left: 20px; font-size: 20px;">Item 2</h2>
          <h3 style="margin-left: auto;">Right text</h3>
        </li>
      </ul>
    </div>
    
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css">

    Related: How to center text vertically with a large font-awesome icon?