Open fayching opened 9 years ago
相信在移动端经常遇到这样的需求
需要把图片两端对齐,而不是整体居中,也不是平均分配宽度。
下面就整理4种移动端两端对齐的实现方式
首先pc时期经常使用的display:inline-block/text-align:justify的方式,不过我们不需要单独写个justify_fix了,使用after的伪类即可:
.main { text-align: justify; font-size: 0; } .main li { display: inline-block; text-align: center; } .main ul:after { content: ''; display: inline-block; width: 100%; height: 0; overflow: hidden; }
这种方式的好处是可以自动换行,但是不能控制每行显示的个数。
既然是移动端,css3肯定也会有对应的解决方案,用flexbox很容易实现两端对齐的效果,不过弹性盒子这个名称几易其名,要全部兼容也不容易:
.main2 { height: 100px; width: 100%; display: -webkit-flex; display: -webkit-box; -webkit-box-pack: justify; -webkit-justify-content: space-between; }
这种方法已经能解决大部分问题了。
有一种情形也偶尔会遇到,不仅要求图片列表两端对齐,两两之间还要加分隔线,这就需要用到下面这种方法了:
.main3 { display: -webkit-box; height: 100px; width: 100%; } .box { border-right: 1px solid #f43; -webkit-box-flex: 1; margin-left: 50px; width: 0; position: relative; } .box2 { -webkit-box-flex: 2; } .box3 { -webkit-box-flex: 2; } .box4 { -webkit-box-flex: 1; border-right: 0; } .box .img { position: absolute; left: 50%; margin-left: -50px; } .box1 .img { left: 0; } .box4 .img { left: 100%; }
每个图片的宽度用margin实现,因为margin不会计算在flex的宽度内,所以每个子元素只要计算空白处的比例即可,很容易看出来是1:2:2:1。
前几天看到km有人分享的一篇文章提到了另一种解决方案,使用padding+box-sizing解决:
.main4 { overflow: hidden; width: 100%; } .main4 ul { width: 125%; padding-right: 62.5px; /* 5/4*图片宽度 */ box-sizing: border-box; } .main4 ul li { width: 20%; height: 100px; list-style: none; float: left; }
这个方案也十分巧妙,简单点理解就是先补全最后一个元素的空白,那么一个li的宽度就是(w-a)/4,ul的宽度就是5/4(w-a),然后padding-right就设置为5/4a,ul宽度设置为5/4w,box-sizing: border-box保证ul的实际宽度是5/4w-5/4a而不是5/4w。这种方案可以实现多行的需求。
总结一下下面就几种方案列下优缺点,需要根据实际情况选择解决方案:
可以访问 http://frozenui.github.io/test/demo1.html 查看效果。
补充第5种方法使用column(多列布局)
另外对于方法1的补充: 来自
这对于多行文本(即有文本换行)除了最后一行都可以实现两端对齐,最后一行依旧左对齐。所以就需要控制最后一行文本对齐方式的CSS属性:text-align-last。
text-align-last
相信在移动端经常遇到这样的需求
需要把图片两端对齐,而不是整体居中,也不是平均分配宽度。
下面就整理4种移动端两端对齐的实现方式
1. display:inline-block/text-align:justify
首先pc时期经常使用的display:inline-block/text-align:justify的方式,不过我们不需要单独写个justify_fix了,使用after的伪类即可:
这种方式的好处是可以自动换行,但是不能控制每行显示的个数。
2.flexbox
既然是移动端,css3肯定也会有对应的解决方案,用flexbox很容易实现两端对齐的效果,不过弹性盒子这个名称几易其名,要全部兼容也不容易:
这种方法已经能解决大部分问题了。
3.flexbox + margin
有一种情形也偶尔会遇到,不仅要求图片列表两端对齐,两两之间还要加分隔线,这就需要用到下面这种方法了:
每个图片的宽度用margin实现,因为margin不会计算在flex的宽度内,所以每个子元素只要计算空白处的比例即可,很容易看出来是1:2:2:1。
4.padding+box-sizing
前几天看到km有人分享的一篇文章提到了另一种解决方案,使用padding+box-sizing解决:
这个方案也十分巧妙,简单点理解就是先补全最后一个元素的空白,那么一个li的宽度就是(w-a)/4,ul的宽度就是5/4(w-a),然后padding-right就设置为5/4a,ul宽度设置为5/4w,box-sizing: border-box保证ul的实际宽度是5/4w-5/4a而不是5/4w。这种方案可以实现多行的需求。
总结一下下面就几种方案列下优缺点,需要根据实际情况选择解决方案:
可以访问 http://frozenui.github.io/test/demo1.html 查看效果。