浅谈图标布局

标题中的图标布局,其实指的是在一个块级容器中,从左至右水平罗列若干大小、间距相等的图标,一行排列满了后自动换行到下一行继续从左至右水平罗列。至于这个布局具体应该叫什么我也不清楚,总之他有点像我们的苹果或者安卓的桌面,也有点像微软的磁贴,还有点像已经被被关闭的webqq,如果你还是不知道我说的布局是什么,看一个图你马上就清楚了。

例图出自于hoorayos

图标布局初看是很简单的,前提是你已经确定了一行图标的个数,或者确定了容器的宽带。当容器的宽带不固定,而图标的大小固定时(也就是一行的图标个数不是固定时),那么如果仅靠css来做的话就困难了,很多桌面软件都是用js计算加绝对定位布局的方式实现,下面笔者分享一下项目中用纯css实现图标布局的几种方式。

1.浮动布局和行内块级元素布局

例子:浮动布局行内块级元素布局

我以前都是用浮动布局或者行内块级元素布局做这种,但是无论哪种布局都有一个问题,那就是右侧会有填不满的bug,会空出不到一个图标宽度的距离。

当然这两种布局的好处也很明显,就是图标的间距不会随着容器宽带变化而变化。

此外,如果是行内块级元素布局,要注意行内元素之间会产生距离,解决办法是将容器的字体大小设置为0;而浮动布局会造成容器不能被撑起来的现象,需要使用清除浮动clear:both。相信这些用法大家也都很熟悉了。

2.行内块级元素的text-align: justify布局

为了解决上述两种方法的问题,可以利用属性text-align: justify。这个属性是表示文字自动调整间距使其能够占满一整行,其实他不止对文字起作用,对于行内块级元素通用起作用。然而这样写虽然解决了空隙分配不均的问题,不过会出现另一个问题,那就是最后一行显示完全混乱掉了。

其实也是有解决办法的,参考张鑫旭老师在讲解vertical-align时候,使用的用0高度的元素占位的方法,可以比较完美的解决这个问题。我们需要确定容器支持的最大宽度,用这个宽带除以一个图标的宽带,就得到了最大的列数。然后在最后一个图标的后面,补出这些个0高度的元素来占位。

请查看完整的例子

这个解决方案已经比较完美了,唯一的缺点是容器和图标元素之间,没有留出空隙,这样会显得布局过于死板,尤其是当一行只有一个图标的时候,就能很明显的看出问题来了(那已经不算图标布局了,所有出现那种情况的可能性很低,如果需要可以用响应式布局处理)。

3.flex布局

为了解决text-align: justify布局的问题,我们还有一种可以采用的方式,那就是flex布局。

flex布局大家应该很熟悉了,尽管现在的主流浏览器都已经支持这个布局了,但是在不同浏览器中还是有兼容、标准不相同等问题。但是,如果在合理使用的情况下,绝大多数浏览器都已经很好地支持flex布局了,我们没有必要再对他避而远之了。

flex布局对于这种情况有什么决解方法呢?这个可以参考justify-content属性。justify-content属性用于设置弹性盒子元素在主轴(横轴)方向上的对齐方式,这里列举我们需要的几个可选择值。

flex-start 默认值。项目位于容器的开头。
space-between 项目位于各行之间留有空白的容器内。
space-around 项目位于各行之前、之间、之后都留有空白的容器内。

其中当justify-content值为flex-start,图标布局表现效果如浮动布局,所有图标元素都靠向左边,右边也会留出分配不下的一小段距离;而当justify-content值为space-between的效果和text-align: justify差不多,留出分配不下的一小段距离会自动的分配到各个图标元素之间;而space-around,留出的空隙不但会分配到各个图标元素之间,还会分配到容器与图标元素之间,这样布局看起来就更自然了。

那么仅用justify-content就能够解决了我们问题了吗?还不能,从上图我们可以看出,当容器justify-content值为space-between或者是space-around,最后一行没有填满时候,容器会调整最后一行元素之间的间隙,让剩余元素平均分配到这最后一整行中。这显然是有问题的,如何解决呢?同样使用0高度的元素占位,可以很好的解决这样的问题。

请查看完整的例子

4.响应式布局

上述两个布局也是不够完美的,主要是需要设置0高度的元素去占位,这让dom结构不够简洁,毕竟通过改变dom的结构去完成布局的要求,是不符合语义化思想的。而使用响应式布局就没有这样的问题了。

响应式布局利用css3的media query媒体查询功能,在不同显示器的分别率下,分别去设置不同套的css,以实现屏幕适配问题。同时,响应式布局比flex布局兼容性好,除了ie8外的所有主流浏览器都兼容。

响应式布局不是真正的图标布局,事实上他就是浮动布局加百分比布局,只是不同分辨率下的参数不一样,以达到不同分辨率下一行图标个数不同的目的。因为是百分百布局,所以无需考虑剩余空隙分配的问题。而且现在主流框架都提供了一些写好的响应式布局的class,使用这种现成的class开发使用都简单了不少。

基于响应式布局的图标布局缺点也很明显,就是不能使用现成的框架,需要开发者自己去计算各个屏幕的适配情况,是需要一定的计算量的。同时当图标大小发生变化的时候,又需要重新计算,尤其要支持高分辨率的屏幕的时候,需要计算的工作就更多了。同时响应式布局只能根据整个页面的分辨率变化,不能根据一个局部容器的大小变化,也是其不足之处。

请查看完整的例子

以上就是笔者总结的图标布局的几种实现方式,不知道各位有没有更简单的实现方法,欢迎大家分享经验^_^。

时间: 2024-07-29 13:29:01

浅谈图标布局的相关文章

浅谈flex布局

Flex布局,俗称弹性布局,有了这个布局,咱们做的事情很多,以前那些很难实现比如说垂直居中之类都不存在了. 盒模型布局依赖于float,display,定位之类的方式来布局,这种的布局对一些特殊布局来说很不方便,就如上面的垂直居中就不太好实现. 现在就让我来介绍一个Flex布局方式 他中的一些属性: flex-direction flex-wrap flex-flow justify-content align-items align-content 在这里,声明一点,使用了display:fl

浅谈ul布局以及table布局

我个人对于某些言论说要注重html语义化在布局中的应用,我反而不怎么感冒,试试兼容IE7&&项目期相对较赶的情况下,我还是推荐快速开发为主,兼容性强为主. 如果布局中需要用户边框,推荐div或者table布局:如果不需要边框,ul其实也是不错的一种布局方式. ul布局可以很好地适应布局内容自顶向上对齐地方式,如图.table永远都是垂直居中的方式             代码 ul布局css ul{ list-style-type: none; padding-left: 0px; mar

浅谈qt 布局器

在一个颜值当道的今天,无论买衣服,买车还是追星,颜值的高低已经变成了大家最看重的(不管男性女性都一样,千万别和我说你不是):而对于程序猿来说,开发一款软件,不再只注重逻辑和稳定性,美观和用户友好性也是我们不得不关注的一个重点了. 我们进入正题,今天主要和大家分享一下Qt方面关于布局管理器的使用: 一.基本概念   Qt 提供了几种在窗口部件上管理子窗口部件的基本方式.一共有3 种方法用于管理窗体上子窗口部件的布局:绝对位置法.人工布局法和布局管理器法.相比于使用固定尺寸和位置,布局提供了功能强大

浅谈Android布局优化

在现在的开发环境中,很容易让人忘了对布局进行优化,我们只需要在IDE中调整调整,然后再setContentView()一下就行,那么让我们来看看在这个过程中他做了什么: 1.读取文件 2.解析数据 3.展开布局 如果布局结构复杂的话,花费的时间就会越长,那么我们不妨来对结构进行写简单调整: 一.使用相对布局 作为一个开发人员我们可能首先接触到的应该是LinearLayout,因为他是个默认布局,这个布局用起来也比较简单.用久了我们会发现,稍微复制一点的结构用linearlayout的话,会嵌套的

浅谈Android布局

在前面的博客中,小编介绍了Android的极光推送以及如何实现登录的一个小demo,对于xml布局页面,摆控件这块的内容,小编还不是很熟练,今天小编主要简单总结一下在Android中的布局,学习过Android的小伙伴都知道,在安卓中有五大常用的布局,如下图所示: 接着,小编就来详细介绍这几种布局,小编是初学者,还请各位小伙伴多多指教哦.首先,我们来看: 第一个LinearLayout---线性布局,线性布局是我们在开发Android项目中最常用的的一种布局方式,线性布局的方向有两种,分别是垂直

浅谈flex布局中小技巧

最近有个面试,面试官问到,在一个横向布局上,假设有三个div,每个宽度为定宽apx,如果想使两侧宽度为x,中间div间间隔为2x.x可以自适应.如下图: 怎么做很简单,两行代码就搞定: justify-content 常用属性有:flex-start | flex-end | center | space-between | space-around 前三个就是字面意思,向行起始位置对齐,向行结束位置对齐,向行中间位置对齐. 后两个中,space-between :元素会平均地分布在行里.如果最

图标字体化浅谈[转]

在做手机端Web App项目中,经常会遇到小图标在手机上显示比较模糊的问题,经过实践发现了一种比较好的解决方案,图标字体化.在微社区项目中,有很多小的Icon(图标),如分享.回复.赞.返回.话题.访问.箭头等,这些Icon(图标)一般都是纯色的.开始制作时考虑用双倍大小的Sprite图,通过CSS样式设置只显示二分之一尺寸,这样在Retina屏上显示的大小是正常的,一旦放大屏幕后图标又变得模糊不清,测试的效果不是很理想,后来又考虑多套图标适配方案.SVG矢量图等,都因为种种原因放弃掉了(如多套

浅谈Android五大布局

Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLayout(线性布局).FrameLayout(单帧布局).RelativeLayout(相对布局).AbsoluteLayout(绝对布局)和TableLayout(表格布局). LinearLayout: LinearLayout按照垂直或者水平的顺序依次排列子元素,每一个子元素都位于前一个元素之后

浅谈Android五大布局(二)——RelativeLayout和TableLayout

在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局RelativeLayout(相对布局)和TableLayout(表格布局)相对之前布局结构稍显复杂一点,所以这里另起篇幅进行介绍. RelativeLayout: RelativeLayout按照各子元素之间的位置关系完成布局.在此布局中的子元素里与位置相关的属性将生效.例如android:layout_be