一个box-sizing: border-box和felx混合使用中遇到的问题

rock-roll 2018-07-04 原文

一个box-sizing: border-box和felx混合使用中遇到的问题

之前在项目中遇到一个布局上很趣的问题(也可能是笔者才疏学浅,哈哈)。布局大概是这样的:

 

  • 外层包裹器:采用flex布局,并指定内部子弹性盒子元素水平显示
  • 侧边栏:flex盒子的子元素,可收起和展开。展开时显示菜单图标和菜单名称,收起时仅显示菜单图标。点击菜单图标或者文字(整个菜单项)跳转到预设置的路由上。展开时宽度为200px,收起时宽度为45px
  • 头部与内容区域:flex盒子的子元素。设置为flex: 1,宽度由外层包裹器flex盒子和侧边栏宽度决定。
  • 项A、项B:flex盒子容器的子元素,水平显示,外层被flex布局的盒子容器包裹

看似是一个很平常的flex布局,但是收起来的时候却出现了横向滚动条,当时有点懵逼,所有元素都实现应用了box-sizing: border-box;的设置,怎么还会有这个情况,而且只是出现在侧边栏收起的时候才会。

排查过程中,首先想到的就是:是不是内容区域撑开了,导致总宽度增加了,一看还真是的:

外层盒子容器的宽度为1920px,侧边栏为45px,内容区域为1876px,计算结果:45 + 1876 – 1920 = 1,多了一个像素,TMD还有这奇葩情况。

好吧,再深入内容区域,发现内容区域内并没有自己溢出宽度,而是由保持充满外层宽度:

 

 

一行,也就是图中’fs-dashboard-row’类的元素的宽度为1856px,row里面水平排布的flex子元素项A和项B为923px宽度,刚好为1856。也就是说是这里超出了1px。为什么呢?

我试着把项A和项B的计算完成后的宽度设置为922.5px,也就是让一行row的宽度为1845px,但是我去改写的时候浏览器报了个错在控制台,重点来了:

报错信息:

For elements with box-sizing: border-box, only absolute content area dimensions can be applied

翻译过来就是:

对于具有框大小的元素:边界框,只能应用绝对内容区域维度。

然后笔者再次双击修改width的宽度的地方,再退出修改,宽度就被还原回了923px。

也就是说,如果给一个盒子元素设置了box-sizing: border-box,它的宽度必须是一个整数,而在笔者的这个情况下,项A和项B被flex要实现宽度正真均分的话,是922.5px,但flex布局分配给它们的却是923px,各多出了0.5px,最后就多出了1px,而导致了横向滚动条的出现。罪魁祸首就是flex布局在计算宽度的时候,按照box-sizing: boder-box属性的这个原则,把922.5px的宽度给向上取整了。

一口老血喷了出来。因为我们不敢保证用户会把浏览器宽度弄成偶数还是奇数,弄成奇数就没这个问题,弄成偶数就有这个问题,我们单纯地在代码中调整宽度是没用的。

 

好吧,怎么解决这个问题,

笔者用了个最暴力的办法,给出现横向滚动条的那一层盒子元素设置overflow-x: hidden。

发表于 2018-07-04 15:51 james·von 阅读() 评论() 编辑 收藏

 

版权声明:本文为rock-roll原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rock-roll/p/9263629.html

一个box-sizing: border-box和felx混合使用中遇到的问题的更多相关文章

  1. BlazeDS 整合 Flex HelloWorld 示例

    开发环境: System:Windows WebBrowser:IE6+、Firefox3+ JavaEE S […]...

  2. Flex 布局教程:语法篇[转]

    网页布局(layout)是CSS的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display属性 […]...

  3. CSS3 之 RGBa 可透明颜色

    在 CSS3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity 已被主流 […]...

  4. 小程序开发必看!一篇文章让你了解 Flex 布局 – alt80

    小程序开发必看!一篇文章让你了解 Flex 布局 转自: https://blog.csdn.net/qq_3 […]...

  5. 2022最新Html5+Css3笔记

    VsCode快捷键Chrome调试工具思维导图Html渲染引擎渲染引擎:浏览器中,专门用来对代码进行解析渲染的部分。Can I use注意:渲染引擎不同,导致解析相同的代码,速度,效果也不同。而且由于渲染引擎的不同,导致各个浏览器...

  6. CSS背景处理

    CSS背景处理 背景样式 背景颜色   如果想让一个区域具有纯色的背景,可以使用background-colo […]...

  7. css3 3d旋转图片立方体特效代码

    一、什么是css3 3d旋转 ?        形成一个3D空间: transform-style:prese […]...

  8. CSS3 的box-shadow进阶之 – 动画篇 – 制作辐射动画

    本篇文章是上一篇讲box-shadow基础知识的延伸,建议先花几分钟阅读那篇文章,点击阅读,再来看这篇。 除了 […]...

随机推荐

  1. 《机电传动控制》——直流电机调速仿真作业

     ...

  2. http请求的headers详解

    关于http请求的headers详解:这里以HTTP1.1为例结合postman返回的信息 1、Server  […]...

  3. Spring入门(九):运行时值注入

    Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Sprin […]...

  4. Mac截屏快捷键总结

    Mac截屏快捷键总结 1)Command-Shift-3: 将整个屏幕拍下并保存到桌面。 2)Command- […]...

  5. 文件上传到tomcat服务器 commons-fileupload的详细介绍与使用

    三个类:DiskFileUpload、FileItem和FileUploadException。这三个类全部位 […]...

  6. 百度地图添加带数字标注

    百度地图添加带数字标注 <!DOCTYPE html> <html> <head […]...

  7. Docker容器基础介绍

      Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 G […]...

  8. HTTP 深入详解(HTTP Web 的基础)

    1.0.1. HTTP概述: HTTP 是超文本传输协议的简称,英文是(Hypertext Tansfer P […]...

展开目录

目录导航