首页 > 其他分享 >flex-shrink计算上的一些细节

flex-shrink计算上的一些细节

时间:2024-01-24 11:44:06浏览次数:19  
标签:box flex 盒子 200 像素 细节 宽度 shrink

<!DOCTYPE html>
<html lang="cmn-hans">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .test {
            width: 600px;
            height: 600px;
            border: 1px solid black;
            display: flex;
        }
        .test .content {
            width: 200px;
            height: 200px;
            box-sizing: border-box;
            border: 1px solid red;
        }
        .content.unique {
            width: 400px;
            flex-shrink: 3;
        }
    </style>
</head>
<body>
    <div class="test">
        <div class="content">1</div>
        <div class="content">2</div>
        <div class="content unique">3</div>
    </div>
</body>
</html>

在这个环境下,先计算一下每个盒子压缩之后的宽度,首先,三个盒子的宽度比为 200:200:400,即 1:1:2,乘以其各自的 flex-shrink,得到的比例为 1:1:6,所以超出的比例是按照 1:1:6的比例压缩的,容器宽度为 600,弹性项总宽度为 800,超出了 200,这 200 分成 1+1+6=8 份,每一份 25像素,1 号占一份,被压缩 25 像素,宽度为 200-25=175 像素,2 号占 1 份,被压缩 25 像素,也剩 175 像素,三号占 6 份,被压缩 150 像素,宽度为 400-150=250 像素

image

但最终结果却不尽如意,我们会发现这里每一个盒子和我们算出来的虽然大差不差,但总会有那么一丢丢误差。

image

如果我在控制台取消掉 box-sizing:border-box; 以及 border 属性之后,发现其结果又正常了。这里其实就是计算上的一个细节,在计算权重的时候,我们需要把盒子宽度的比值和其对应的 flex-shrink 乘起来,得到最终的权值,但这个盒子宽度的比值应该是盒子内容区宽度的比值,或者说是 content-box 的宽度,而非 border-box 的宽度。

在上面的例子中,由于有 1 像素的边框,所以盒子内容区宽度的比值应该是 198:198:398,乘以对应的 flex-shrink 应该是 198:198:1194,超出来的这 200 像素会按照这个比例被压缩,即第一个盒子压缩 (198/1590)*200, 剩下 175.09433962264150943396226415094 px,第二个盒子也一样,第三个盒子被压缩 (1194/1590)*200,剩下 249.81132075471698113207547169811 px

读者可以看到,这已经很接近实际的数字了,但总会差那么一丁点,这实际上就是浏览器本身的问题了,因为不同浏览器其最终渲染效果也各不相同,主要的差异是对 CSS 中小数的处理,例如 chrome 中前两个盒子的宽度都是 175.09 px,第三个盒子为 249.83 px,这一点和上面 firefox 的数值就不一样,但这一丁点误差也并不会影响开发,读者只需要理解,在计算最终比值时所用到的宽度应该是 content-box 的,而非 border-box

标签:box,flex,盒子,200,像素,细节,宽度,shrink
From: https://www.cnblogs.com/zhangyunling/p/17984341

相关文章

  • 数组的使用和细节
    数组数组是可以存放多个同一类型的数据。在GO中,数组是值类型。也是一种数据结构。数组的简单案例:funcmain(){ //定义一个数组 varhens[3]float64 //给数组每一个元素赋值从下标为0开始共3个元素 hens[0]=1.0 hens[1]=2.0 hens[2]=3.0 //遍历数组 varto......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】[MySQL 用户变量/Pandas]面向过程编程;
    目录题目地址MySQL代码等效pandas代码题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/MySQL代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip......
  • MSFlexGrid应用
    SubOnLButtonDown(ByValItem,ByValFlags,ByValx,ByValy)DimobjConnectionDimobjCommandDimobjRecordsetDimstrConnectionStringDimstrSQL,sSQLDimkWh,PFC,kW,A1,A2,A3,V1,V2,V3,Line_Name,Meter_ID,Line_IDDimstrkWh,strkW,strPFC,strA1,strA2,strA3,st......
  • Java小细节之数组什么情况下相等,什么情况下不相等
    int[]a={1,2,3};int[]b=a;System.out.println(a==b);此时输出trueint[]a={1,2,3};int[]b={1,2,3};System.out.println(a==b);此时输出为false这是因为数组的机制,int[]b=a,相当于让b和a同时管理这个数组,a和b都是代表同一个数组,所以a==b是正确的,此时对数......
  • [源码分析] - flex 标准文档导读与 一个rust实现解析
    本文是w3中css-flexbox[标准文档](CSSFlexibleBoxLayoutModuleLevel1(w3.org)解读.(2023.1),并对一些开源实现进行调研分析.文档导读csslayoutmodecsslayout模式用于确定在盒模型中的元素如何排布(大小与位置),在css2.1中有如下几种方式.blocklayout,块级别......
  • Java小细节之循环标号
    importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intn=in.nextInt();out:for(inti=0;i<=n;i++){for(intj=0;j<=n/2;j++){for(intz=0;z<=n/5;z++){if(i+j......
  • Flex&Bison
    Flex与Bison《Flex与Bison》阅读笔记Flex和Bison简介第一个flex程序%{intchars=0;intwords=0;intlines=0;%}%%[^\t\n\r\f\v]+{words++;chars+=strlen(yytext);}\n{chars++;lines++;}.{chars++;}%%intmain(int......
  • Java小细节之缩进中if 和else的对应关系
    importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);System.out.print("请输入数字:");intn=in.nextInt();System.out.print("请输入分数:");intcount=in.nextInt();if(n==......
  • Android 14 新特性代码 UUID.fromString & Matcher.matches 的细节改动(扒源码)
    文章目录前言UUID处理的更改正则表达式的更改结束前言Android14已经出来好久好久了…今天其他的暂且不论,单纯的讲一下OpenJDK17更新的两点变更(扒源代码)~对正则表达式的更改UUID处理首先,正则表达式的更改:现在,为了更严格地遵循OpenJDK的语义,不允许无效的组引用。您可能会......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multise
    题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip_address,logoutastick......