CSS-对齐

161 阅读4分钟

一、flex对齐

flex的对齐比较简单,直接使用属性align-items:center就可以对齐了。

1、二个元素大小一致对齐

image.png

image.png

看看效果

2、二个元素大小不一致对齐

image.png

image.png

看看效果

3、文字行高不一致

image.png

image.png

看看效果

二、行内元素对齐

vertical-align 用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式

相对父元素的值

这些值使元素相对其父元素垂直对齐:

  • baseline

    使元素的基线与父元素的基线对齐。HTML 规范没有详细说明部分可替换元素的基线,如<textarea> ,这意味着这些元素使用此值的表现因浏览器而异。

  • sub

    使元素的基线与父元素的下标基线对齐。

  • super

    使元素的基线与父元素的上标基线对齐。

  • text-top

    使元素的顶部与父元素的字体顶部对齐。

  • text-bottom

    使元素的底部与父元素的字体底部对齐。

  • middle

    使元素的中部与父元素的基线加上父元素 x-height(译注:x 高度)的一半对齐。

  • <length>

    使元素的基线对齐到父元素的基线之上的给定长度。可以是负数。

  • <percentage>

    使元素的基线对齐到父元素的基线之上的给定百分比,该百分比是line-height属性的百分比。可以是负数。

相对行的值

下列值使元素相对整行垂直对齐:

  • top

    使元素及其后代元素的顶部与整行的顶部对齐。

  • bottom

    使元素及其后代元素的底部与整行的底部对齐。

1、大小行高一致对齐

image.png

image.png

2、大小行高不一致对齐

image.png

image.png

三、对齐场景示例

文字的前面或者后面有一个标签,文字可以换行

父级display: inline-block;文字增加vertical-align属性

image.png

父级display: inline-block;标签增加vertical-align属性

image.png

为什么border没有切合下面,因为有行高

image.png

标签的行高等于字号

image.png

标签里面的字号和外侧文字的字号和行高不一致

image.png

行高是由基线(baseline)到基线之间的距离来度量的,基线是字母 x 的底部。行高由上升部分(字母的上部分)、下降部分(字母的下部分)以及字体本身的高度组成

左右flex布局需要左侧的图标和右侧第一行的文字对齐

<div class="parent2">
  <div class="img-warp">
    <img src="@/assets/star2.png" >
  </div>
  <div>
    <div>这个是文字文字文字</div>
    <div style="height: 200px;background-color: rgb(215, 170, 170);">             </div>
  </div>
</div>
.parent2{
  display: flex;
  font-size: 16px;
  line-height: 24px;
  font-weight: bold;
  text-decoration: underline overline;

}
.img-warp{
  height: 24px;
  display: flex;
  align-items: center;
}
img{
  flex-shrink: 0;
  width: 16px;
  height: 16px;
}

image.png

安卓手机里面 line-height文字没有居中

image.png

导致这个问题的本质原因可能是Android在排版计算的时候参考了primyfont字体的相关属性(即HHead Ascent、HHead Descent等),而primyfont的查找是看font-family里哪个字体在fonts.xml里第一个匹配上,而原生Android下中文字体是没有family name的,导致匹配上的始终不是中文字体,所以解决这个问题就要在font-family里显式申明中文,或者通过什么方法保证所有字符都fallback到中文字体。

1.针对Android 7.0+设备:上设置 lang 属性:,同时font-family不指定英文。

比较常用的是设置font-family: sans-serif

这个方法是利用了浏览器的字体fallback机制,让英文也使用中文字体来展示。blink早期的内核在fallback机制上存在问题,Android 7.0+才能ok,早期的内核下会导致英文fallback到Noto Sans Myanmar,这个字体非常丑。

2.针对MIUI 8.0+设备:设置font-family: miui

这个方案就是显式申明中文的方案,MIUI在8.0+上内置了小米兰亭,同时在fonts.xml里给这个字体指定了family name:miui,所以我们可以直接设置。

测试上述方案是否可行(给标签增加font-family)

电脑上:

image.png 小米手机上:

image.png

结论:在小米手机上设置font-family: miui起作用了

总结【给设计建议】

  • 可以使用flex布局的尽量使用flex布局;
  • 如果要行内对齐,标签的字体字号和行高需要和外侧文字的字体和行高一致,才可对齐。