一个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。
一个box-sizing: border-box和felx混合使用中遇到的问题的更多相关文章
- Vagrant 手册之 box - 创建基础 box
原文地址 有一种特殊的 box 被称为"base box".这些 box 包含 Vagrant 运作所需的最低限度,通常不是对现有的 Vagrant 环境("base b ...
- 如何拥有一个自己的Vagrant box
这是一个关于Vagrant的学习系列,包含如下文章: Vagrant入门 创建自己的Vagrant box 用Vagrant搭建Jenkins构建环境 用Vagrant和Ansible搭建持续交付平台 ...
- Qt学习笔记-制作一个计算器-对话框Message Box
在做计算器的前提先做一个加法器. 设计界面. 在点击计算的时候,获取前两个输入框中的数据相加后显示在第三个输入框. toInt是将字符串转换为数字.number静态函数是将数字转化为字符串. 加法器已 ...
- 制作一个vagrant的win7 box
准备: 1.win7镜像文件 2.vagrant安装文件 3.virtual box安装文件 步骤: 1.先在本机上安装virtualbox和vagrant,本机为win7,安装虚机也为win7 2. ...
- [UE4]Vertical Box结合Horizontal Box创建出类似微信的经典手机界面
头部标题,中部为自动填充,底部为一个Horizontal Box,其中的“通讯录”文字比较宽,需要设置Size.Fill=1.5
- 解读SSD中的Default box(Prior Box)
1:SSD更具体的框架如下: 2: Prior Box 缩进在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box ...
- 【移动适配】一个像素的border怎么实现
一个像素里复杂纷扰的世界 文 | 啃先生 Mar.3rd.2016 首发于微信公众号(啃先生) 上一篇发了<[移动适配]移动Web怎么做屏幕适配> 壹 | Fisrt 在CSS的世界里P ...
- 关于line box,inline box,line-height,vertical-align之间的关系
1.content area 围绕着文字的一种box,高度由font-size和font-family决定.在chrome控制器里,你用鼠标志向某个内敛元素,显示的高度值. 2.inline box的 ...
- [04-05]box框模型(Box Model)定义了元素框处理元素内容、内边距、边框和外边距的方式
实际占有的宽 = width + 2padding(内边距) + 2border(边框) + 2margin(外边距) 实际占有的高 = height + 2padding + 2border + 2 ...
随机推荐
- 【最小生成树】UVA1494Qin Shi Huang's National Road System秦始皇修路
Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven ki ...
- BZOJ_3872_[Poi2014]Ant colony_dfs
BZOJ_3872_[Poi2014]Ant colony_dfs Description There is an entrance to the ant hill in every chamber ...
- 使用limit查询的同时取得总的记录数:SQL_CALC_FOUND_ROWS和FOUND_ROWS()
通常我们都用如下的sql来进行列表 SELECT COUNT(*) FROM users WHERE name LIKE 'a%';SELECT name, email FROM users WHER ...
- java 基础知识小结
1. java 有三个求整的函数 math.floor () (floor 是地板的意思) 向下求整 math.ceil () (ceil 是天花板的意思 ) 向上求整 math.round() ...
- H5移动端项目案例、web手机微商城实战开发
自微信生态圈一步步强大后,关于移动端购物的趋势,逐渐成为大众关心的内容,目前市场上关于移动商城的制定就有大量版本,比如.微商城.移动商城.移动webAPP.微信商城各等各种定义层出不穷,这就对于移动端 ...
- netty源码学习
概述 Netty is an asynchronous event-driven network application framework for rapid development of main ...
- KnockoutJS知识规整目录
对于Web开发来讲,前端接触是避免不了的,特别是对于中小公司,没有严格的职位区分,前后端人员互相身兼是常有的事情,使用一些好的框架,能够帮助我们快速开发并完成需要的功能,对于前端的JS框架来讲MVVM ...
- Java日志正确使用姿势
前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...
- Mqtt学习指南
MQTT是物联网应用当中一种非常重要的,轻量级的协议,现将该协议的重要学习资源整理一下,希望能为初学者提供一个完整的学习资源. MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议.它的设计思 ...
- hashCode()方法以及集合中Set的一些总结
一.前言 本篇文章没有什么主题,就是一些零散点的总结.周末没事看了几道蚂蚁金服的面试题,其中有好几道都是特别简单的,基础性的题目,就是我们平时用到的,但是发现要是完全说出来还是有一些不清楚的地方,所以 ...