在使用flex 进行伸缩布局的时候,经常会给子盒子设置边框,这时经常会出现上下边框对不齐的情况。本篇文章来探讨并解决这个问题。

具体出现的问题如下图所示

具体代码如下

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body {
font-size: 16px;
} .fa {
height: 18.75em;
width: 31.25em;
margin: 0 auto;
display: flex;
flex-direction: column;
} .l1,
.l2 {
flex: 1;
background-color: aqua;
display: flex;
border: 0.25em solid black;
border-right: none;
} .l2 {
border-top: none;
background-color: deeppink;
} .son1,
.son2,
.son3,
.son4,
.son5 {
box-sizing: border-box;
border-right: 0.25em solid black;
flex: 1;
} .son5 {
flex: 2;
}
</style>
</head> <body>
<div class="fa">
<div class="l1">
<div class="son1"></div>
<div class="son2"></div>
<div class="son5"></div>
</div>
<div class="l2">
<div class="son1"></div>
<div class="son2"></div>
<div class="son3"></div>
<div class="son4"></div>
</div> </div> </body> </html>

可以发现我们在分配盒子的时候明明除了.son5 设置为flex:2外, 都是设置了 flex:1 ;按照我们预想的结果应该是对齐的,但是事实上在添加边框之后,边框并不能对齐。

产生这个问题的主要原因如下:

首先我们知道flex :n 是flex:n n 0 的简写,主要的作用是将剩余的空间进行按比例划分。

而我们在指定了边框大小后,边框将会占用固定的大小,那么可分配的剩余大小就会改变。

如上例(计算原理不清楚的同学可以参考CSS 小结笔记之伸缩布局 (flex)):

蓝色区域

共有四个竖边框,大小共为4*0.25*16=16px;

那么剩下可分配区域的大小为:31.25*16-16=484px

所以蓝色区域的三块大小分别是:1*484/4=121px、1*484/4=121px、2*484/2=242px

红色区域

共有五个竖边框,大小共为5*0.25*16=20px;

那么剩下可分配区域的大小为:31.25*16-20=480px

所以红色区域的四块大小都是:1*480/4=120px

因此红色区域和蓝色区域的子盒子大小实际上是不对等的,因此边框出现了偏移。

下面将给出这个问题的解决方法:

1、最基本的方法

  使用伸缩基准值(flex-basis)即flex 值中的百分比+border-box 来实现

  首先把右边框都设置为子盒子的边框,接着给子盒子添加属性 box-sizing: border-box,最后将flex:1 改为 flex:0 0 25%,将flex:2改为 flex:0 0 50%。

  这么做的原理是,将子盒子的盒子计算大小模式改为 border-box ,即分配或计算式,边框和内边距也被视为盒子大小的一部分。

  之后再设置每个盒子的起始长度,这样就可以解决这个问题。

  具体代码如下

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body {
font-size: 16px;
} .fa {
height: 18.75em;
width: 31.25em;
margin: 0 auto;
display: flex;
flex-direction: column;
} .l1,
.l2 {
flex: 1;
background-color: aqua;
display: flex;
border: 0.25em solid black;
border-right: none;
} .l2 {
border-top: none;
background-color: deeppink;
} .son1,
.son2,
.son3,
.son4,
.son5 {
box-sizing: border-box;
border-right: 0.25em solid black;
flex: 0 0 25%;
} .son5 {
flex: 0 0 50%;
}
</style>
</head> <body>
<div class="fa">
<div class="l1">
<div class="son1"></div>
<div class="son2"></div>
<div class="son5"></div>
</div>
<div class="l2">
<div class="son1"></div>
<div class="son2"></div>
<div class="son3"></div>
<div class="son4"></div>
</div> </div> </body> </html>

  结果图为

  

  这种方法的优点是简单直观,缺点是不够灵活,而且每个盒子的设置都要计算其所占百分比。

2、将边框画出

  我们知道在不给出边框的时候,是不会出现问题的,而且即使不给出边框,盒子与盒子之间也是有分界线的,因此我们可以自己在盒子的边线上通过定位画出一个边框。

  通过::after伪元素选择器,设置其高度100%,宽度为0.25em,定位靠右。这样只要给需要边框效果的盒子增加这个类,则相当于给盒子增加了右边框。 

        .bd-r {
position: relative;
} .bd-r::after {
content: "";
width: 0.25em;
height: 100%;
position: absolute;
background-color: black;
top:;
right:;
}

  完整代码如下:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body {
font-size: 16px;
} .fa {
height: 18.75em;
width: 31.25em;
margin: 0 auto;
display: flex;
flex-direction: column;
} .l1,
.l2 {
flex: 1;
background-color: aqua;
display: flex;
border: 0.25em solid black;
border-right: none;
} .l2 {
border-top: none;
background-color: deeppink;
} .son1,
.son2,
.son3,
.son4,
.son5 {
flex: 0 0 25%;
} .son5 {
flex: 0 0 50%;
} .bd-r {
position: relative;
} .bd-r::after {
content: "";
width: 0.25em;
height: 100%;
position: absolute;
background-color: black;
top: 0;
right: 0;
}
</style>
</head> <body>
<div class="fa">
<div class="l1">
<div class="son1 bd-r"></div>
<div class="son2 bd-r"></div>
<div class="son5 bd-r"></div>
</div>
<div class="l2">
<div class="son1 bd-r"></div>
<div class="son2 bd-r"></div>
<div class="son3 bd-r"></div>
<div class="son4 bd-r"></div>
</div> </div> </body> </html>

  效果图为

  

  可以发现和方法一显示结果一样。这个方法更加便捷,可重用性更高,而且这种写法可以广泛应用于分割线,边框等。

  

CSS 小结笔记之解决flex布局边框对不齐的更多相关文章

  1. CSS 小结笔记之浮动

    在css中float是一个非常好用的属性,float最基本用法是用来做文字环绕型的样式的. 基本用法:float:left | right 例如 <!DOCTYPE html> <h ...

  2. CSS实例详解:Flex布局

    本文由云+社区发表 本文将通过三个简单的实例,实际应用上篇文章的基础理论知识,展示下Flex布局是如何解决CSS布局问题. 一.垂直居中 这里同时用非flex布局和flex布局两种方式来实现,可以对比 ...

  3. Css animation 与 float 、flex 布局问题

    1. 有这样一段css html 代码 <div class="container"> <div class="float-left"> ...

  4. 解决flex布局下, elementui table组件不能跟随父组件的宽度而变化的bug

    bug: 我在flex布局的元素中使用了elementui的table组件,饿了么的table上会被加一个动态的宽度, 当第一次改变flex元素宽度的时候.table的动态宽度会变化,第二次和以后就不 ...

  5. css 位置居中篇,flex布局【转】

    最近看到沅老师的博客,关于flex布局的,觉得不错,http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

  6. CSS 小结笔记之伸缩布局 (flex)

    CSS flex 是一种伸缩布局,之前块级元素布局在同一行,可以通过display或position或float来实现,而本篇介绍一个新的方法——flex(弹性布局). flex 为和模型布局提供了极 ...

  7. CSS 小结笔记之em

    1.为什么使用em em也是css中的一种单位,和px类似.很多人会疑惑为什么有了px之后还要使用em,而且em使用起来相对于px来讲比较麻烦. em主要是应用于弹性布局,下面给出一个小栗子说明em的 ...

  8. CSS 小结笔记之BFC

    BFC 即为Block formatting context 的缩写,BFC 主要用来将一个盒子设置为一个隔离的容器,不管盒子内部的元素具有什么属性,都不会影响到盒子的外面. 1.哪些元素能产生BFC ...

  9. CSS 小结笔记之图标字体(IconFont)

    本篇主要介绍一种非常好用的图标大法——图标字体(IconFont). 什么是图标字体?顾名思义,它是一种字体,只不过这个字体显示的并不是具体的文字之类的,而是各种图标. 网站上经常会用到各种图标,之前 ...

随机推荐

  1. IdentityServer-Protecting an API using Client Credentials

    使用客户凭证保护API 这篇快速开始将展示使用IdentityServer保护APIs的最基本使用场景. 在此场景中我们将定义一个API和一个要访问此API的客户端. 客户端将向IdentitySer ...

  2. 一对一Socket简单聊天的实现

    今天终于调试通了Socket一对一的聊天,每次发送连接请求后,将用户名发送到Socket中去,然后将用户名和新建的socket存到map中,然后根据用户名来确定接收方是谁,以实现一对一的聊天功能. 上 ...

  3. 执行bin/hdfs haadmin -transitionToActive nn1时出现,Automatic failover is enabled for NameNode at bigdata-pro02.kfk.com/192.168.80.152:8020 Refusing to manually manage HA state的解决办法(图文详解)

    不多说,直接上干货! 首先, 那么,你也许,第一感觉,是想到的是 全网最详细的Hadoop HA集群启动后,两个namenode都是standby的解决办法(图文详解) 这里,nn1,不多赘述了.很简 ...

  4. Font Awesome 4.0.3 提供了369个网页常用的矢量字体图标,新浪、人人 的矢量图标也到其中哟

    要求 必备知识 本文要求基本了解html与css前端代码. 运行环境 普通浏览器,兼容IE7 源码下载 下载地址 Font Awesome 为您提供了一套可缩放的字体矢量图标,可以快速自定义图标的大小 ...

  5. css outline实践研究

    outline具有和border很相似的属性,但多少又有些区别,就是因为这些区别才让它闪闪发光,先目睹一下. <style> div{ width:100px; height:100px; ...

  6. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  7. (转)第十一篇:springboot集成swagger2,构建优雅的Restful API

    声明:本部分内容均转自于方志明博友的博客,因为本人很喜欢他的博客,所以一直在学习,转载仅是记录和分享,若也有喜欢的人的话,可以去他的博客首页看:http://blog.csdn.net/forezp/ ...

  8. 管理git生成的多个ssh key

    http://www.bootcss.com/p/git-guide/ 问题阐述 当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git ...

  9. TensorFlow-实战Google深度学习框架 笔记(上)

    TensorFlow TensorFlow 是一种采用数据流图(data flow graphs),用于数值计算的开源软件库.在 Tensorflow 中,所有不同的变量和运算都是储存在计算图,所以在 ...

  10. JS中for循环变量作用域--解决for循环异步执行的问题

    被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...