Mike Me
Mike Me

Reputation: 2392

Mat-icon does not center in its div

I am very new to css and I cannot align the mat-icon (the thought bubble) to the div class=img (the green square on the left) - see the attached image. At this moment the icon is a little bit near the top

For adding the svg icon I used Material Angular - MatIconRegistry class (don't know if it matters)

My result: enter image description here

Here is my html:

<div class="container">
  <div class="img"><mat-icon svgIcon="info"></mat-icon></div>
  Some text here!
</div>

Here is my css:

$conainer-min-width: 256px !default;
$conainer-max-width: 512px !default;
$conainer-height: 50px !default;

div.container {
  max-width: $container-max-width;
  min-width: $container-min-width;
  height: $container-height;
  margin: auto;
  color: #000000;
  background-color: #ffffff;
  line-height: $container-height;
  text-align: center;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  border-width: 1px;
  border-style: solid;
  border-color: #9e9e9e;
  padding-right: 20px;
  position: fixed;
  z-index: 1000;
  left: 0;
  right: 0;
  top: 30px;
}


div.img {
  width: $container-height;
  height: $container-height;
  float: left;
  display: block;
  margin: 0 auto;
  border-right-width: 1px;
  border-right-style: solid;
  border-right-color: #9e9e9e;
  line-height: $container-height;
  justify-content: center;
  background-color: #3f9c35;
}

Any thoughts on how to fix this?

Upvotes: 55

Views: 119211

Answers (5)

angabriel
angabriel

Reputation: 5048

2024

With angular18 you should use the special directive matListItemIcon:

<mat-list-item routerLink="/myItem">
  <mat-icon matListItemIcon>category</mat-icon> My Item
</mat-list-item>

Upvotes: 1

The.Bear
The.Bear

Reputation: 5855

Using FLEX with a container element for each icon/text: Stackblitz

CSS:

.icon-text {
    display: flex;
    align-items: center;
}

HTML:

<div class="icon-text">
   <mat-icon>home</mat-icon>
   <span>Some text here 1</span>
</div>

You can add vertical align to the mat-icon element or .mat-icon class:

To override all material icons with global CSS: Stackblitz

.mat-icon {
    vertical-align: middle;
}

ATENTION: If your text have capital letters, add negative margin to prevent visual issues on some browsers (Stackblitz demo).
Also you can simply use vertical-align: sub or vertical-align: bottom if fits better with your requirements. Check following alignment MDN demo


To style a particular material icon with utility class: Stackblitz

In some global css file:

.v-align-middle { 
    vertical-align: middle;
}

HTML:

<div>
   <mat-icon class="v-align-middle">home</mat-icon>
   <span class="v-align-middle">Some text here 1</span>
</div>

** some css frameworks already have classes like this, eg: bootstrap 4 **


To style a particular material icon: Stackblitz

CSS:

.custom-class mat-icon {
    vertical-align: middle;
}

/** or using the class .mat-icon */
.custom-class .mat-icon {
    vertical-align: middle;
}

HTML:

<div class="custom-class">
   <mat-icon>home</mat-icon>
   <span>Some text here 1</span>
</div>

Upvotes: 115

Felix
Felix

Reputation: 4595

What works for me is to use flex-container (justify-content / align-items to center) along with these properties font-size, widthand height - depending on your font size, which drives the other two properties:

::ng-deep .mat-icon {
  font-size: 48px;
  width: 48px;
  height: 48px;
}

Upvotes: 2

Novak254
Novak254

Reputation: 549

You can use the flex Layout to align the icon

<div fxLayout="row" fxLayoutAlign="center">
  <mat-icon fxFlexAlign="center">supervisor_account</mat-icon>
</div>

Read more about flexLayout in the documentation, fxLayout row is the same as:

div {
  display:flex;
  flex-direction:row;
  justify-content:center; /* For fxLayoutAlign="center" */
}

Then you further align the flex item to center i.e fxFlexAlign="center"

mat-icon {
  display:flex;             
  align-self:center; 
}

Upvotes: 9

A. U.
A. U.

Reputation: 52

I believe your problem is typo on these variable names:

$conainer-min-width: 256px !default;
$conainer-max-width: 512px !default;
$conainer-height: 50px !default;

which doesn't match the variables used here:

div.container {
max-width: $container-max-width;
min-width: $container-min-width;
height: $container-height; }

I think it should work once you change conainer to container :)

Upvotes: 0

Related Questions