Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于vertical-align; flex: 0 1 auto; #14

Open
lizheng0515 opened this issue Apr 22, 2020 · 0 comments
Open

关于vertical-align; flex: 0 1 auto; #14

lizheng0515 opened this issue Apr 22, 2020 · 0 comments
Labels
Css Something isn't working

Comments

@lizheng0515
Copy link
Owner

lizheng0515 commented Apr 22, 2020

1.vertical-align

2.flex: 0 1 auto

vertical-align

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

不能用它垂直对齐 块级元素

语法

/* Keyword values */
vertical-align: baseline;
vertical-align: sub;
vertical-align: super;
vertical-align: text-top;
vertical-align: text-bottom;
vertical-align: middle;
vertical-align: top;
vertical-align: bottom;

/* <length> values */
vertical-align: 10em;
vertical-align: 4px;

/* <percentage> values */
vertical-align: 20%;

/* Global values */
vertical-align: inherit;
vertical-align: initial;
vertical-align: unset;

设置其值,对准基线

基线的位置并不是固定的:

  • 在文本之类内联元素中,基线是字符x的下边缘位置

  • 在像img元素中基线就是下边缘。

  • 在inline-block元素中,也分两种情况:

    如果该元素中有内联元素,基线就是最后一行内联元素的基线。

    如果该元素内没有内联元素或者overflow不是visible,其基线就是margin的地边缘。

基线相关的设置:

  • baseline:默认值,就是基线对齐

  • sub:元素的基线向下移

  • super:元素的基线向上移

  • 具体的长度值

    是正值基线就向上移动,如果是负值基线向下移动。

<div style="background: #398dee">
    <span style="vertical-align: -10px">负值效果</span>
    x
    <span style="vertical-align: 10px">正向移动10px</span>
</div>
  • 百分比值:正负情况和长度值一样,需要知道的值是相对于行高(line-height)的百分比。
<div style="background: #398dee;line-height: 50px">
    <span style="vertical-align: -10%">负值效果</span>
    x
    <span style="vertical-align: 10%;">正向移动10px</span>
</div>
  • top:(内联)元素的顶边和行内最高元素的顶边对齐
  • bottom:元素的底边和行的底边对齐。
  • middle:元素上下边的中心点和行基线向上1/2x的高度位置对齐。

middle并不是我们理解的居中,而是近似。而且会受字体大小的影响偏移。

  • text-top:元素顶边和父级的内容区域顶边对齐
  • text-bottom:元素底部和父级的内容区域底部对齐

flex

众所周知,flex 是 flex-growflex-shrinkflex-basis的缩写。其取值可以考虑以下情况:

flex 的默认值是以上三个属性值的组合。假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 auto。
同理,如下是等同的:

.item {flex: 2333 3222 234px;}
.item {
    flex-grow: 2333;
    flex-shrink: 3222;
    flex-basis: 234px;
}

当 flex 取值为 none,则计算值为 0 0 auto,如下是等同的:

.item {flex: none;}
.item {
    flex-grow: 0;
    flex-shrink: 0;
    flex-basis: auto;
}

当 flex 取值为 auto,则计算值为 1 1 auto,如下是等同的:

.item {flex: auto;}
.item {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: auto;
}

当 flex 取值为一个非负数字,则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下是等同的:

.item {flex: 1;}
.item {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}

当 flex 取值为一个长度或百分比,则视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字):

.item-1 {flex: 0%;}
.item-1 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 0%;
}
.item-2 {flex: 24px;}
.item-1 {
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 24px;
}

当 flex 取值为两个非负数字,则分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%,如下是等同的:

.item {flex: 2 3;}
.item {
    flex-grow: 2;
    flex-shrink: 3;
    flex-basis: 0%;
}

当 flex 取值为一个非负数字和一个长度或百分比,则分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1,如下是等同的:

.item {flex: 2333 3222px;}
.item {
    flex-grow: 2333;
    flex-shrink: 1;
    flex-basis: 3222px;
}

flex-basis 规定的是子元素的基准值。所以是否溢出的计算与此属性息息相关。flex-basis 规定的范围取决于 box-sizing。这里主要讨论以下 flex-basis 的取值情况:

  • auto:首先检索该子元素的主尺寸,如果主尺寸不为 auto,则使用值采取主尺寸之值;如果也是 auto,则使用值为 content。

  • content:指根据该子元素的内容自动布局。有的用户代理没有实现取 content 值,等效的替代方案是 flex-basis 和主尺寸都取 auto。

  • 百分比:根据其包含块(即伸缩父容器)的主尺寸计算。如果包含块的主尺寸未定义(即父容器的主尺寸取决于子元素),则计算结果和设为 auto 一样。

举一个不同的值之间的区别:

<div class="parent">
    <div class="item-1"></div>
    <div class="item-2"></div>
    <div class="item-3"></div>
</div>

<style type="text/css">
    .parent {
        display: flex;
        width: 600px;
    }
    .parent > div {
        height: 100px;
    }
    .item-1 {
        width: 140px;
        flex: 2 1 0%;
        background: blue;
    }
    .item-2 {
        width: 100px;
        flex: 2 1 auto;
        background: darkblue;
    }
    .item-3 {
        flex: 1 1 200px;
        background: lightblue;
    }
</style>

主轴上父容器总尺寸为 600px

子元素的总基准值是:0% + auto + 200px = 300px,其中

  • 0% 即 0 宽度
  • auto 对应取主尺寸即 100px
    故剩余空间为 600px - 300px = 300px

伸缩放大系数之和为: 2 + 2 + 1 = 5

剩余空间分配如下:

  • item-1 和 item-2 各分配 2/5,各得 120px

  • item-3 分配 1/5,得 60px
    各项目最终宽度为:

  • item-1 = 0% + 120px = 120px

  • item-2 = auto + 120px = 220px

  • item-3 = 200px + 60px = 260px
    当 item-1 基准值取 0% 的时候,是把该项目视为零尺寸的,故即便声明其尺寸为 140px,也并没有什么用,形同虚设

而 item-2 基准值取 auto 的时候,根据规则基准值使用值是主尺寸值即 100px,故这 100px 不会纳入剩余空间

@lizheng0515 lizheng0515 added the Css Something isn't working label Apr 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Css Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant