怎么用css加div实现多栏布局的数据分组?(就是把一组数据分成两行六列,是数据不是文本)

多行文本展开收起是一个很常见的交互, 如下图演示

实现这一类布局和交互难点主要有以下几点

  1. 位于多行文本右下角的“展开收起”按钮
  2. “展开”和“收起”两种状态的切换
  3. 当文本不超过指定行数时,不显示“展开收起”按钮

说实话,之前单独看这个布局,即使借助 JavaScript 也不是一件容易的事啊(需要计算文字宽度动态截取文本,就是这么做的),更别说下面的交互和判断逻辑了,不过经过我的一番琢磨,其实纯 CSS 也能完美实现的,下面就一步一步来看看如何实现吧~

一、位于右下角的“展开收起”按钮

很多设计同学都喜欢这样的设计,把按钮放在右下角,和文本混合在一起,而不是单独一行,视觉上可能更加舒适美观。先看看多行文本截断吧,这个比较简单

假设有这样一个 html 结构

正如我们前面提到的那样,当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。

多行文本超出省略大家应该很熟悉这个了吧,主要用到用到line-clamp,关键样式如下

提到文本环绕效果,一般能想到浮动 float,没错,千万不要以为浮动已经是过去式了,具体的场景还是很有用的。比如下面放一个按钮,然后设置浮动

正如我们前面提到的那样,当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。

这时已经有了环绕的效果了,只是位于右上角,如何将按钮移到右下角呢?先尝试一下margin

可以看到,虽然按钮到了右下角,但是文本却没有环绕按钮上方的空间,空出了一大截,无能为力了吗?

虽然margin不能解决问题,但是整个文本还是受到了浮动按钮的影响,如果有多个浮动元素会怎么样呢?这里用伪元素来::before代替

现在按钮到了伪元素的左侧,如何移到下面呢?很简单,清除一下浮动clear: both;就可以了

可以看到,现在文本是完全环绕在右侧的两个浮动元素了,只要把红色背景的伪元素宽度设置为0(或者不设置宽度,默认就是 0),就实现了右下角环绕的效果

上面虽然完成了右下加环绕,但是高度是固定的,如何动态设置呢?这里可以用到calc计算,用整个容器高度减去按钮的高度即可,如下

很可惜,好像并没有什么效果,打开控制台看看,结果发现calc(100% - 24px)计算高度为 0

原因其实很容易想到,就是高度 100% 失效的问题,关于这类问题网上的分析有很多,通常的解决方式是给父级指定一个高度,但是这里的高度是动态变化的,而且还有展开状态,高度更是不可预知,所以设置高度不可取。

除此之外,其实还有另一种方式,那就是利用flex 布局。大概的方法就是在flex 布局的子项中,可以通过百分比来计算变化高度,具体可参考 w3.org 中关于的描述

正如我们前面提到的那样,当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。

这样下来,刚才的计算高度就生效了,改变文本的行数,同样位于右下角~

除此之外,动态高度也可以采用负的 margin 来实现(性能会比 calc 略好一点)

到这里,右下角环绕的效果就基本完成,省略号也是位于展开按钮之前的,完整代码可以查看

4.其他浏览器的兼容处理

上面的实现是最完美的处理方式。原本以为兼容性没什么大问题的,毕竟只用到了文本截断和浮动,-webkit-line-clamp虽然是-webkit-前缀,不过firefox也是支持的,打开一看傻了眼,safarifirefox居然全乱了!

这就有点难受了,前面那么多努力都白费了吗?不可能不管这两个,不然就只能是 demo 了,无法用于生产环境。

赶紧打开控制台看看是什么原因。一番查找,结果发现是display: -webkit-box!设置该属性后,原本的文本好像变成了一整块,浮动元素也无法产生环绕效果,去掉之后浮动就正常了

其实上面的努力已经实现了右下角环绕的效果,如果在知道行数的情况下设置一个最大高度,是不是也完成了多行截断呢?为了便于设置高度,可以添加一个行高 line-height,如果需要设置成3行,那高度就设置成line-height * 3

为了方便更好的控制行数,这里可以把常用的行数通过属性选择器独立出来(通常不会太多),如下

可以看到基本上正常了,除了没有省略号,现在加上省略号吧,跟在展开按钮之前就可以了,可以用伪元素实现

这样,SafariFirefox的兼容布局基本上就完成了,完整代码可以查看

二、“展开”和“收起”两种状态

提到 CSS 状态切换,大家都能想到input type="checkbox"吧。这里我们也需要用到这个特性,首先加一个input,然后把之前的button换成label ,并且通过for属性关联起来

正如我们前面提到的那样,当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。

这样,在点击label的时候,实际上是点击了input元素,现在来添加两种状态,分别是只显示 3 行和不做行数限制

兼容版本可以直接设置最大高度max-height为一个较大的值,或者直接设置为none

这里还有一个小问题,“展开”按钮在点击后应该变成“收起”,如何修改呢?

有一个技巧,凡是碰到需要动态修改内容的,都可以使用伪类content生成技术,具体做法就是去除或者隐藏按钮里面的文字,采用伪元素生成

兼容版本由于前面的省略号是模拟出来的,不能自动隐藏,所以需要额外来处理

基本和本文开头的效果一致了,完整代码可以查看,


还有一点,如果给max-height设置一个合适的值,注意,是合适的值,具体原理可以参考,还能加上过渡动画

上面的交互已经基本满足要求了,但是还是会有问题。比如当文本较少时,此时是没有发生截断,也就是没有省略号的,但是“展开”按钮却仍然位于右下角,如何隐藏呢?

通常 js 的解决方式很容易,比较一下元素的scrollHeightclientHeight即可,然后添加相对应的类名。下面是伪代码

那么,CSS 如何实现这类判断呢?

可以肯定的是,CSS 是没有这类逻辑判断,大多数我们都需要从别的角度,采用“障眼法”来实现。比如在这个场景,当没有发生截断的时候,表示文本完全可见了,这时,如果在文本末尾添加一个元素(红色小方块),为了不影响原有布局,这里设置了绝对定位

可以看到,这里的红色小方块是完全跟随省略号的。当省略号出现时,红色小方块必定消失,因为已经被挤下去了,这里把父级overflow: hidden暂时隐藏就能看到是什么原理了

然后,可以把刚才这个红色的小方块设置一个足够大的尺寸,并且降低透明度,比如100% * 100%

可以看到,红色的块块把右下角的都覆盖了,现在把背景改为白色(和父级同底色),父级overflow: hidden重新加上

现在看看点击展开的效果吧

现在展开以后,发现按钮不见(被刚才那个伪元素所覆盖,并且也点击不了),如果希望点击以后仍然可见呢?添加一下:checked状态即可,在展开时隐藏覆盖层

这样,就实现了在文字较少的情况下隐藏展开按钮的功能

最终完整代码可以查看,


需要注意的是,兼容版本可以支持到IE 10+(这就过分了啊,居然还支持 IE),但是由于 IE 不支持 codepen,所以测试 IE 可以自行复制在本地测试。

总的来说,重点还是在布局方面,交互其实相对容易,整体实现的成本其实是很低的,也没有比较生僻的属性,除了布局方面-webkit-box貌似有点 bug (毕竟是-webkit-内核,火狐只是借鉴了过来,难免有些问题),幸运的是可以通过另一种方式实现多行文本截断效果,兼容性相当不错,基本上全兼容(IE10+),这里整理一下实现重点

  1. 文本环绕效果首先考虑浮动 float
  2. flex 布局子元素可以通过百分比计算高度
  3. 多行文本截断还可以结合文本环绕效果用max-height模拟实现
  4. CSS 改变文本可以采用伪元素生成
  5. 多利用 CSS 遮挡“障眼法”

多行文本展开收起效果可以说是业界一个老大难的问题了,有很多 js 解决方案,但是感觉都不是很完美,希望这个全新思路的 CSS 解决方式能给各位带来不一样的启发,感谢阅读,欢迎点赞、收藏、转发~


"尚硅谷"教育自成立以来,发展迅猛,凭借优秀的教学团队、前沿的课程体系、务实的教育理念,现已成为有口皆碑的IT培训品牌。

前端前景是很不错的,像前端这样的专业还是一线城市比较好,师资力量跟得上、就业的薪资也是可观的,学习前端可以按照路线图的顺序,

现在学习前端的平台有很多,B站或者是腾讯课堂都是可以的,我们在B站分享了很多经典的前端视频教程,都是开源的,你可以去看看。


· 有一些普通的科技小锦囊

千锋网站有全套的前端教程,还有源码、笔记、路线这些,可以去下载学习试试

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

五、布局页面——头部和导航 

有了上边的基础,下面的任务就是要利用html和css制作完成一个完整的网页了。先从头部开始,第三小节时我们已经把整体框架给搭建好了,就像盖房子一样,整体结构已经出来了,下面就需要填砖分割空间了。先分析下头部:分为两部分,一个是logo靠左侧显示,一个是搜索靠右侧显示,那么布局时插入两个div,一个向左浮动,一个向右浮动的方式来完成。另外还有很多种实现方法,比如logo用h1标签,搜索用span,或者把logo做为背景图片也是可以的,不管采用哪种方法,要根据页面的需求选用一种最合理的方法。如果要在logo加上链接的话,那么就不能用背景图片的方法了。

先在header里插入以上两块元素。然后分别插入相应的内容,在logo里插入我们事先切割好的logo图片,在search里插入一个表单,一个文本框和一个按钮,插入后如下:

接下来定义css吧,在ps里测量,头部的高度是71px,logo距顶部18px,搜索产品距顶部30px,下面在css里把这些参数都给定义上,看显示的效果和效果图中的效果是不是一样呢?

这两项的位置已经差不多了。预览你会发现,搜索框和按钮跟效果图中的不一样,这是因为我们还没对它设置样式,接下来把文本框增加一个class为inp_srh样式,按钮增加btn_srh的样式,然后定义这两个样式的属性。

我们给search增加了高度和文字颜色,这点不用多解释,但高度为什么是24px,是为了照顾 IE6,大家去掉测试下就知道了;

inp_srh的宽度和高度并不是实际效果图中的宽高,是因为默认情况下文本框带有内边距造成的。另外就是padding的值也会算到总宽度上的;

btn_srh就是应用背景图像来实现的,说明一点这里的border的值为none指的是无边框,cursor定义鼠标样式为手形,之前许多朋友用hand,但这个通不过w3c认证。text-indent:-999em这个属性许多朋友可能不理解是干什么用的了,它的作用相当于word中的首行缩进,这里设置成-999,意思是向左侧缩进-999em,这样是不是就看不到文字啦,所以它的作用是将按钮上的文字隐藏,当然也可以在html代码中插入空格代替文字,但这样做有点不太好,在不支持css的设备上查看时,用户不知道这个按钮是干什么的了。所以建议采用这种形式;

有必要解释下最后一行,它的特殊之处在样式名和大括号之间加了一个*号,这里兼容所用的,属于css hack部分内容,是定义这些元素都垂直居中对齐。css hack本身就是无意思的东西,所以不做过多解释,知道当需要垂直居中对齐时就采用这种写法就行了,但是一定不要滥用,这个属性也是有缺陷的,当有英文和中文同时出现时,英文会靠上显示的。有关css hack更多的内容,请参考

这些设置完后,把最初搭建框架时设置的header的背景色和底部外边距给去掉吧。

至此,头部的样式就完成了,下边该制作导航了。分析一下,导航分为一级导航和二级导航,所以我需要在nav下再插入nav_main和nav_son两个块元素。

先设置nav的高度及背景图片样式。

完了之后该一级菜单和二级菜单的样式了

这些样式的作用就不多讲了,以前的课程当中已详细讲解过了,只不过本例使用了双导航菜单而已。现在在浏览器下预览一下吧,看看效果怎么样,是不是和效果图差不多了,但还有最后一步就是两端的圆角没实现,实现圆角的方法也不复杂,只需再增加两行代码和两个样式即可。在nav下nav_main之前增加如下两行代码:

然后用样式表定义一个左侧的圆角,一个右侧的圆角。css样式如下:

预览一下吧,看看头部和导航是不是和效果图中的一样呢


  提示:可以先修改部分代码后再运行

六、布局页面——侧边栏

主体部分涉及side和main两部分,的内容比较多,但都不难,本节教程没有增加什么新的知识点,学起来并不吃力。主体部分先从侧边栏说起,讲解如何切图时已经说过,侧边栏可以共用一个样式,下面就先做一个通用的,插入如下html代码

这里的标题采用h2标签,没必要再用个div,还有“产品导购”中“产品”二字是红色字体,这里用strong标签,这样可以省去很多没必要的定义,所以在页面布局当中一定要合理利用每一个标签。讲到这里,有必要说一下第一节教程中讲的为什么不能叫div+css而应该叫xhtml+css了,因为div只是xhtml中的一个标签,叫div+css会让许多朋友误认为遇到块级元素就得用div,造成了div的滥用,而合理利用每个标签,才是web标准设计的一个准则。回过头来定义侧边栏的样式如下:

预览一下效果吧,是不是整体效果出来了,下边就需要定义里边各个部分了。

先看下产品导购部分,内容分为三部分,可以用ul、li列表的形式实现,前边的图标用背景图片来实现,可以在li上设置背景图片,但这样麻烦一点,每个都需要设置,而且还得定位,有个更简便的方法是定义ul的背景图片,因为在切图标时,每个图标之间的间距是按照效果图的间距来切的。

细心的用户已发现,这里的class后跟了两个样式名称,说明一个元素是可以定义多个样式的,中间用空格分开。也可以把product样式定义在ul上。

说到可以定义多个样式,强调一点:许多新手朋友常常大量使用,如一个块元素需要设置边框,绿色文字和灰色背景所以就在css里定义:

其实这是一个非常不好的写法,这样表面看似达到了代码重用性,但实际当中,当需要把其中一个元素的的边框改为2px,怎么改?如果把.border的边框改了,那么所有应用这一样式的元素都改了。如果再在代码中增加一个样式,那么又得去改html代码,和代码和结构分离的理念相违背了。一个好的代码布局,不管以后怎么改风格,只用改样式表,而不用去改html代码,这才真正做到两者分离了。

扯远了,不过这点很重要,新手很容易犯这个毛病。回到刚才的问题上,给第三个li定义了一个product3样式,然后在样式表中定义它的底部边框为无,因为前边定义li的底边框为1px的虚线,而最后一个不需要,所以单独定义个样式把它取消掉,这里的product根据需要自己定义的名称,一般用能表达这块内容意思的简洁英文来表示,或者用拼音。有关样式命名上请参考:。“产品导购”的样式定义如下:

“产品导购”完成后,下边该“使用问答”了。“使用问答”部分都是一问一答的形式,问答各采用不同的图标,而且问的文字加粗了。所以这部分采用dl、dt、dd的形式来完成。

“使用问答”完成后,侧边栏就剩下“联系我们”了,这个更简单,直接插入图片就行了,然后调整一下位置就可以了。

七、布局页面——主体部分

主体部分可以分三大部分,顶部是幻灯和热点新闻,中间是图片列表,下边是左右两块,先来布局主体部分的顶部。顶部实际上还是个左右两列布局,没什么复杂之处,就不再贴代码了,本节结尾会提供实例的源代码。讲解一点:热点新闻列表中的日期,是用一个span标签写在了内容的前边,然后把span向右浮动就实现了,“个人登录”和“商户登录”的实现方法也是如此。

之前许多朋友问,像标准之路主页的幻灯是怎么实现的?其实实很简单,只要你动动手,就知道怎么做的了。但许多同学遇到个问题不去考虑靠自己能力能否解决,而是上来就问,这是一个很不好的学习态度?先找找办法,如果实在解决不了,再来问也不迟。方法是查看标准之路主页源代码,找到幻灯部分,你会发现有如下一段js代码,而且代码中有几个设置参数的地方,那么要想在自己网站实现这样的功能,直接把这部分代码插入到自己网站相应位置,修改参数中的大小为自己的大小、图片地址为自己的图片地址,还有就是下载swf文件,并改为相应正确的地址。如果你有html基础的话,这些一点都不难,还是那句话,一定要多动手,多动脑。

把如上一段代码拷贝到本例的幻灯图片位置,下载实现幻灯的swf文件到本地images文件夹下,地址为:,接下来修改/v3/images/indexpic.swf为images/indexpic.swf;修改swf_width和swf_height的值为269和210;files的值为图片路径,links为图片的链接地址,texts为标题名称,中间也是用|分隔,这样就实现了幻灯图片展示了。

幻灯实现后,接下来该中间部分图片列表了,和第六天学习的横向图文列表是一样的。唯一区别就是多了一个标题。在index_top下插入如下代码:

这次没做鼠标划过时边框效果,相对之前的简单一点,需要了解鼠标划过改变边框效果的请学习。本例中“热门产品”的图标采用了背景图片,也可以采用一个图片直接插入,但从用户体验的角度来讲,这些图片还是以背景图片插入为好,因为背景图片在整个页面加载过程中后来加载的。

图片列表完了之后,主体部分就剩下“企业历史”和“招商加盟”两块了。这两块也是应用左右浮动的方式实现。这两块的代码就不贴出来了,一会儿看实例。强调一点是这里的more:hover的写法,因为more直接加在a上,所以鼠标进过的样式就不用再写a了,或者写成a.more:hover。

底部比较简单,灰色背景部分可以用h类标签完成,也可以用dl、dt、dd来完成,再或者其它标签也可以,其它的就不再赘述。

底部完成后,最后的步骤是要做一些细节调整,比如该对齐的地方是否对齐,图片的alt属性是否都加上了,在各种浏览器下是否显示一样等等。至此整个前台页面算制作完成了下面的任务就是该用程序来读取数据库里的内容了,来完成整个站点的制作。

浏览器兼容问题一直是让新手朋友头疼的地方,其实只要掌握几个常用浏览器的特性后,不需要过多的css hack就可以解决问题的。本例中使用的css hack大致有:

zoom=1:用来解决自适应高度时IE6的兼容问题(这个属性通不过w3c认证);

*:在样式名和属性中间加*,这个常用在需要垂直居中时使用;

IE6 3像素bug:在布局时采用左右都浮动的办法避免了这个问题;

另外还有一些做法也是为了解决兼容问题而写的,比如固定高度,就是因为各浏览器之间解释差异,为了使显示效果尽可能一样而采用的折中办法。总之遵循一点,css hack能少用尽量少用,这样便于以后维护。

完成这样一个布局方法有多种,本例中所讲解的方法,只是本人的观点,不一定是最好的方法,希望大家通过本本例的学习能做到举一反三,掌握更多的方法。

本侧是左宽右窄型的布局,如果想把两个调换个位置,太简单不过了,只需把#main和#side的向左向右浮动调换一下就实现,这是表格布局所不及的。所以不管#main和#side在html代码中是谁先谁后,而让它们显示在哪里完全是css来完成的。这里建议#main的代码写在#side前边,因为这要在页面加载的过程中会先加载main部分,用户首先看到的是主要内容,搜索引擎收录时也会先找到main部分的内容。


  提示:可以先修改部分代码后再运行

九、相对路径和相对于根目录路径

上边的例子学完后,你会发现在html中插入的图片路径是images/pic4.gif,而在css中插入的图片路径是这样的../images/nav_bg.gif,后者比前者多出了../,这是什么意思呢?

这就是相对路径和绝对路径,../表示返回上一级,因为css文件在css文件夹里,图片在images文件夹下,那么layout.css就需要返回上一级找到images文件夹才能找到相应的图片。直接文件夹名或是./开头表示和当前平级,因为index.html和images文件夹平级。不管是带../还是不带,这种写法都叫相对路径;另一种叫相对于根目录路径,它的写法必须以/开始,意思是从根目录开始一级一级向下查找,不管在哪里,要使用pic4.gif这个图片,路径都必须是/images/pic4.gif;还有一种写法叫绝对路径,是以http://加域名开始的,这个不多多说了。

使用相对路径时,当根目录放到一个二级目录下时,文件仍然可以正常访问,而使用相对于根目录路径时,其中一个页面放到其它位置时,照样能关联么相关的图片和其它文件,比如:本例如果用相对于根目录路径的话,把index.html放到一个文件夹下后,还是可以正常访问的。总之两种方法各有优劣,根据你的需要采用一种合适的方法。相对路径和相对于根目录路径是可以相互更改的,在站点管理——编辑——高级设置的本地信息里有链接相对于,如下图,默认为文档(就是所说的相对路径),也可以改为站点根目录,相对路径一般为直接目录名,需要返回上级时用../,向上返回两级时用../../;相对于根目录路径始终以/开头,不管该文件现在在哪一级,它都是以根目录开始向下找。

我要回帖

更多关于 html多个div横向排列 的文章

 

随机推荐