在移动端中的flex布局

时间:2022-06-28 05:26:32

flex布局介绍:

  flex布局很灵活, 这种布局我们也可以称之为弹性布局,  弹性布局的主要优势就是元素的宽或者高会自动补全;

flex布局实例:

  比如有两个div,一个div的宽度为100px, 想让另外一个div的占据剩下的宽度:

在移动端中的flex布局

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
margin:
0;

}
.box{
display:flex;
flex
-direction:row;
}
.box .child{
width:40px;
background:#f00;
}
.box .child1{
flex:
1;
background:#0f0
}
</style>
</head>
<body>
<div class="box">
<div class="child">child</div>
<div class="child1">child1</div>
</div>
</body>
</html>
View Code

  或者有两个div,一个高度为100px, 另外一个高度自动补全当前界面下剩余的高度:

在移动端中的flex布局

  

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
html,body,.box{
height:
100%;
}
body{
margin:
0;

}
.box{
display:flex;
flex
-direction:column;
}
.box .child{
height:40px;
background:#f00;
}
.box .child1{
flex:
1;
background:#0f0
}
</style>
</head>
<body>
<div class="box">
<div class="child">child</div>
<div class="child1">child1</div>
</div>
</body>
</html>
View Code

  所以说flex布局是很灵活, flex布局没出现之前,这种布局不好实现, 只能通过-webkit-calc的方式, 或者使用javascript的方式动态修改元素的样式,还有水平方向元素自动适应布局等, 用了flex,css的布局方式更加多样化了;

  flex布局也可以实现未知宽高的元素自动居中, 以前用的比较多的居中布局方式主要为固定宽高的负margin居中:

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
html,body,.parent{
height:
100%;
}
.parent{
justify
-content:center;/*水平居中*/
align
-items: center; /*垂直居中*/
display:
-webkit-flex;
/*
flex-direction:排版方向
flex-wrap:如果宽度超出父级宽度, 是否折行
flex-flow:flex-direction和flex-wrap的缩写
*/ }
.child{
}
</style>
</head>
<body>
<div class="parent">
<div class="child">
hehe
</div>
</div>
</body>
</html>
View Code

  子元素css的样式flex:auto或者flex:1的时候, 该子元素会自动适应当前宽高:

  如果一个父元素为flex布局, 内部元素的宽度会根据各自的flex属性值进行等比切分:

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:
0;
padding:
0;
}
</style>
</head>
<body>
<style>
.box{
display:flex;
flex
-direction:row
}
.box .child{
flex:
1;
}
.box .chi{
flex:
3;
}
</style>
<div class="box">
<div class="child">
child
</div>
<div class="chi">
chi, child占用1
/4的百分比, chi占用3/4的百分比
</div>
</div>
<br>
<br>
<style>
.box1{
display:flex;
flex
-direction:row;
}
.box1 .child{
width:40px;
}
.box1 .chi{
flex:
1;
}
</style>
<div class="box1">
<div class="child">
child
</div>
<div class="chi">
chi, child固定长度, chi自动适应
</div>
</div>
<br>
<br>
<style>
.box2 {
display:flex;
flex
-direction:row;
}
.box2 .child1{
width:40px;
}
.box2 .child2{
flex:auto;
}
.box2 .child3{
width:40px;
}
</style>
<div class="box2">
<div class="child1">child1</div>
<div class="child2">child2, 两边固定宽度, 中间自动适应</div>
<div class="child3">child3</div>
</div>
</body>
</html>
View Code

  高度自动适应的demo:

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:
0;
padding:
0;
}
html,body,.box{
height:
100%;
}
.box{
display:flex;
flex
-direction:column;
}
.box .header{
height:40px;
background:#f00;
}
.box .bodyer{
flex:
1;
background:#0f0;
}
.box .footer{
height:40px;
background:#00f;
}
</style>
</head>
<body>
<div class="box">
<div class="header">header</div>
<div class="bodyer">bodyer</div>
<div class="footer">footer</div>
</div>
</body>
</html>
View Code

  通过flex布局可以模拟一个微信的聊天窗口:

在移动端中的flex布局

在移动端中的flex布局在移动端中的flex布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<style>
*{
margin:
0;
padding:
0;
}
html,body,.box{
height:
100%;
}
.box{
display:
-webkit-flex;
display:flex;
flex
-direction:column;
font
-family:"microsoft yahei";
font
-size:18px;
}
.box .header{
height:40px;
line
-height:40px;
text
-align:center;
background:#3498DB;
color:#fff;
}
.box .body{
display: block;
border
-bottom:1px solid #eee;
overflow:auto;
flex:
1;
}
.box .send
-left {
align
-self:flex-end;
margin
-top:10px;
position:relative;
height:35px;
background:#F8C301;
border
-radius:5px; /* 圆角 */
line
-height:35px;
margin
-left:10px;
padding:
0 10px;
float:left;
}
.box .send
-left .arrow {
position:absolute;
top:5px;
left:
-15px;
width:
0;
height:
0;
font
-size:0;
border:solid 8px;
border
-color:#fff #F8C301 #fff #fff;
}
.box .send {
align
-self:flex-end;
margin
-top:10px;
position:relative;
height:35px;
background:#2ECC71;
border
-radius:5px; /* 圆角 */
line
-height:35px;
margin
-right:10px;
padding:
0 10px;
float:right;
}
.box .send .arrow {
position:absolute;
top:5px;
right:
-15px;
width:
0;
height:
0;
font
-size:0;
border:solid 8px;
border
-color:#fff #fff #fff #2ECC71;
}
.box .clear{
clear:both;
}
.box .footer{
height:40px;
line
-height:40px;
display:
-webkit-flex;
display:flex;
}
.box .footer input{
flex:auto;
border:none;
border
-right:1px solid #eee;
font
-size:18px;
padding
-left:4px;
}
.box .footer button{
width:50px;
font
-size:18px;
}
</style>
</head>
<body>
<!--
容器属性
flex
-direction
flex
-wrap
flex
-flow
justify
-content
align
-items
align
-content
项目属性:
order
flex
-grow
flex
-shrink
flex
-basis
flex
align
-self
-->
<div class="box">
<div class="header">
消息
</div>
<div class="body">
<div class="send-left">
hehe我哟我去
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
hehe
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
hehe我哟我去
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
<div class="clear"></div>
<div class="send">
来啊, 哈哈
<div class="arrow"></div>
</div>
</div>
<div class="footer">
<input type="text">
<button>发送</button>
</div>
</div>
</body>
<script>

</script>
</html>
View Code

flex布局的其它css属性:

  Flex 容器属性:

  Flex 条目属性:

 

兼容:

  android 4.4以上版本支持display:flex。低版本不支持。

  安卓4.1,以及4.1以下不支持flex布局, 必须考虑别的方案;

  android的低版本无法使用display:flex, 但是可以使用display:box替代;

  要记得加浏览器前缀, 兼容写法如下:

  display: -webkit-box;
display:
-moz-box;
display:
-webkit-flex;
display:
-ms-flexbox;
display: flex;

   

 参考:

  caniuse:http://caniuse.com/#feat=flexbox

  MDN:https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes

  MDN参考资料:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Advanced_layouts_with_flexbox

  ruanyifeng:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html