Box-sizing:小身材,大拳头!
国庆回来,很久没写博客了。一来是自己毫无时间,二是最近开发任务特别紧,三是节后综合症,脑子一片空白没有找到写作的原材料。今天,在加完班回来的22点,忙里偷闲,分享一下最近学到的一个小知识点如题。标题的灵感来自于暴雪的一款卡牌游戏:炉石传说中的一张卡牌的上场台词,觉得很契合本篇博客要表达的含义,身材小小,拳头大大呢!
盒子模型
Box-sizing属性一直比较陌生,在露珠平时的开发过程中一直都没机会见识,以前遇到应该用它解决的问题,很无耻的用了其他偷工减料,拿驴凑马的招来完成。后来才通过网上资料查到,原来它是设置box模型的计算方式的一种属性。说到box模型,了解w3c的同学一定不会陌生,它对盒子模型的定义如下:把每一个网页中的元素都看作是一个盒子,这个盒子有边框(border),有内容(content),有和在其他外面的盒子的间距(margin),有和在其内盒子的边距(padding)。它的高度和宽度,取决于它的内容和边框以及内边距的总和。在浏览器中,通过开发者工具,我们可以很容易地看到一个元素的盒子模型:
从上图可以看到,这个元素的宽和高分别是100px和100px。查看css代码,我们也可以看到它的width和height分别为100px和100px。到此为止,一切都很简单,没有问题。但是,如果我们接下来给它设置一个border呢?那么他的宽和高是多少呢?
通过查看元素,我们发现,这个元素虽然设置了100px的宽度和100px的高度,但实际上,在添加了内边距和边框后,它的宽度和高度变成了104px和104px;所以,元素实际的宽度和高度是在设置的width和height属性后加上padding和border的宽度和高度的。虽然只是一个小小的知识点,但常常会给我们造成一些麻烦。
小问题,大麻烦
来看一个经常遇到的切换导航。在手机端经常的设计中经常可以遇到此问题,顶部的tab切换标签。设计给的标注是左右对半分,并且拥有各自的边框,然后自由伸缩和切换。像下面那样。
一开始,你会感觉这很容易,因为无非是两个宽度为50%的div并排排列了。但是开始做的时候,你才会知道被设计师的边框坑了。因为如果你设置了width为50%,那么两个div是100%,除此之外还有两个div的左右边框的长度是没地方放置的!也就是说,当你把它们并排放置在一起的时候,实际上它们总宽度是100% + 4px!,多出了4个px,这导致了右边的box会掉下去(如果你用的float)。如果你用box布局,在使用了flex自由延伸后属性(请见我之前的博客)不会出现这个情况,但如果你还不会box布局,而又希望简单解决此问题(尤其是在考虑padding的固定填充距离后box布局也无法完美解决),那么是时候该学习box-sizing了(只需要1000ms)。
box-sizing:
box-sizing是css3中出现的属性,它允许你设置或检索对象的盒模型组成模式,通过修改属性的值对盒子模型的概念做设置。我们知道,标准的盒子模型的宽是content+borderwidth+padding。box-sizing属性的值中有一个就是解释标准模型的值,它是默认的content-box,一般情况下,我们不使用它。我们使用的是它的其他值,比如:border-box,含义是将盒子的border和padding计算到设置的width中,而不是实际宽度中。所以,如果你设置width为100px,而border为1px的时候,盒子的实际大小仍旧是100px而不是102px。用这个属性,我们就可以完美地解决上面遇到的难题了:只需要在给两个div的css上写下box-sizing:border-box就可以了,保证两个div等宽,拥有1px长度,至于它们的框度是不是50%,你可以喊设计师自己量。除了以上两个值外,box-sizing还有一个padding-box值,顾名思义,就是把内边距计算在设置的框度内,而border是不计算的。
兼容性
box-sizing 目前被大多数浏览器支持, 但IE家族只有IE8版本以上才支持,虽然现代浏览器支持box-sizing,但有些浏览器还是需要加上自己的前缀,Mozilla需要加上-moz-,Webkit内核需要加上-webkit-,Presto内核-o-,IE8-ms-,所以box-sizing兼容浏览器时需要加上各自的前缀。当然,对于需要在i8以下的浏览器中解决上面提到过的tab排列问题,你是不需要这个属性的,因为它们对盒子模型的解释默认值就是border-box。这也是IE这个逐渐失势的顽固的老古董和w3c对盒子模型解释的差异。就像下面那张图一样:
结束语
对于box-sizing的属性从无知到了解,最后到运用自如,得益于老大的提点,简单的属性在实际生产中解决了很多布局问题。从根本上说还是自己见识和基础知识太少了,写这篇博客放到此处提醒自己,多学一点知识就多解决一点难题。
Box-sizing:小身材,大拳头!的更多相关文章
- 小身材大用途,用PrimusUI驾驭你的页面
“PrimusUI”是自己在借鉴了如今网上很多开源的UI库,再经过自己整理加工的一个简单代码集合. 每个功能块的CSS代码都很少,力求简单易懂,低门槛,代码可根据自己实际情况轻易修改,改到符合自己场景 ...
- [小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)
[小细节,大BUG] 6.问题描述:当从Plist文件加载数据,放入到tableView中展示时,有时有数据,有时又没有数据.这是为什么呢?相信很多大牛都想到了:我们一般将加载的数据,转换成模型,放入 ...
- android FakeWindow的小应用大用途
android FakeWindow的小应用大用途 在windowmanager里面有一个FakeWindow,细致一看也就是一个透明的应用覆盖到屏幕的最前端,这样有什么优点呢?首先我们还是从应用的需 ...
- safari 与 chrome 的小区别大BUG
safari 与 chrome 的小区别大BUG 时间:2016-11-01 17:33:19 作者:zhongxia 原文地址:https://github.com/zhongxia245/blog ...
- 搜索条件两个时间,通过php数组排序,保证select语句between时间 前小后大
//搜索条件两个时间,通过数组排序,保证select语句between时间 前小后大 $sort_array=[$_POST['clockDate1'],$_POST['clockDate2']]; ...
- c++小学期大作业攻略(一)环境配置
UPDATE at 2019/07/20 20:21 更新了Qt连接mysql的方法,但是是自己仿照连VS的方法摸索出来的,简单测试了一下能work但是不保证后期不会出问题.如果你在尝试过程中出现了任 ...
- SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次
//SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...
- 手摸手教你如何在 Python 编码中做到小细节大优化
手摸手教你如何在 Python 编码中做到小细节大优化 在列表里计数 """ 在列表里计数,使用 Python 原生函数计数要快很多,所以尽量使用原生函数来计算. &qu ...
- Taro -- Swiper的图片由小变大3d轮播效果
Swiper的图片由小变大3d轮播效果 this.state = ({ nowIdx:, swiperH:'', imgList:[ {img:'../../assets/12.jpg'}, {img ...
随机推荐
- 设计模式之单例模式Singleton(三创建型)
1.什么事单例模式? 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须 ...
- 大数据平台架构(flume+kafka+hbase+ELK+storm+redis+mysql)
上次实现了flume+kafka+hbase+ELK:http://www.cnblogs.com/super-d2/p/5486739.html 这次我们可以加上storm: storm-0.9.5 ...
- Android自定义组件
[参考的原文地址] http://blog.csdn.net/l1028386804/article/details/47101387效果图: 实现方式: 一:自定义一个含有EditText和Butt ...
- Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决方法
问题描述: Eclipse启动时发生An internal error occurred during: "Initializing JavaTooling".错误的解决方法 解决 ...
- 视图views粗略理解
>>>>>> >>>> 创建视图: create view goodsavgview as select cat_id,avg(shop_ ...
- struts2注解
一.配置web.xml <filter> <filter-name>struts2</filter-name> <filter-class>org.ap ...
- lamp
Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立 的程序,但是因为常被放在一起使用,拥有了越来越高的 ...
- 本地xdebug调试搭建 Laravel+homestead+phpstorm
1.在homestead virtual box安装和配置xdebug 先在终端运行vagrant up 和 vagrant ssh,ssh远程到homestead,然后复制以下代码到一个shell文 ...
- NOIP提高模拟题 完全平方数
完全平方数 (number.***(c/cpp/pas),1000ms,128mb) [问题描述] 一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称 ...
- QGis、Gdal本地中文路径问题
编译qgis完整项目后,由于Gdal库的原因,中文路径下通过添加矢量数据中数据库中是没有OGR的Oracle数据库功能的: 最开始打算通过重新编译gadl库从内部支持中文的(有成功的麻烦也请告诉我), ...