下图是手Q吃喝玩乐  好友去哪儿九宫格图的图示:

 

从上图我们可以分析出如下需求:

  • 图片大小自适应;
    图片个数不同时,图片按照指定方式排列;
    图片相邻处有1px空白间隙。

我们以最复杂的6图布局为例,一步一步来看如何以纯CSS实现。

1、float布局

最容易想到的,也是最简单的方案,就是 float 布局:

图片大小自适应:宽度百分比,高度使用 padding-top 百分比
图片个数不同时,图片按照指定方式排列:使用 nth-child 伪类指定不同情况下的元素大小
图片相邻处有1px空白间隙:使用 border-box border模拟边框

这里父元素的高度未知,height使用百分比行不通,而padding的百分比值是依据父元素的宽度来计算的,我们可以使用padding-top撑开高度。

让我们一瞅伪码:

XHTML

XML/HTML Code复制内容到剪贴板
  1. <div class="float">  
  2.     <div class="item">1</div>  
  3.     ...   
  4.     <div class="item">6</div>  
  5. </div>  

 CSS

CSS Code复制内容到剪贴板
  1. .float {   
  2.     overflowhidden;   
  3. }   
  4. .item {   
  5.     floatleft;   
  6.     padding-top: 33.3%;   
  7.     width: 33.3%;   
  8.     border-right1px solid #fff;   
  9.     border-top1px solid #fff;   
  10. }   
  11. .item:nth-child(1) {   
  12.     padding-top: 66.6%;   
  13.     width: 66.6%;   
  14. }   
  15. .item:nth-child(2), .item:nth-child(3), .item:nth-child(6) {   
  16.     border-right: 0 none;   
  17. }   
  18. .item:nth-child(1), .item:nth-child(2) {   
  19.     border-top: 0 none;   
  20. }    

实际效果并不理想,如下图:

可以看到 float 布局的优点是DOM结构十分简单,缺点是容易出现空白间隙错位,优缺点都十分明显,它更适用于js计算的版本。

2、flex布局

还有谁?flex!flex布局有以下重要特性:

  • 可以将 flex 布局下的元素展示在同一水平、垂直方向上;
    可以支持自动换行、换列(移动端-webkit-box暂不支持,好消息是从iOS9.2、Android4.4开始都支持新flex了);
    可以指定 flex 布局下的元素如何分配空间,可以让元素自动占满父元素剩余空间;
    可以指定 flex 布局下的元素的展示方向,排列方式。

这里面的子元素同一水平、垂直方向展示对我们很有帮助,它使我们更容易控制子元素的排列,而不会错位。

使用 flex 布局与 float 布局不同的地方在于,移动端目前主要还是-webkit-box,因此图片个数不同时,我们需要使用不同的html,组合出不同的块。

flex 布局上下划分

来,我们快动手分块吧!新解决方案出现导致的肾上腺素上升,使我们迫不及待使用了传统css文档流自上而下的方式来划分,我称为上下划分,如下图:

上面一块包含左侧1个2/3的大块,右侧2个1/3的小块,下面一块则是3个1/3的小块。

我们指定2/3的大块宽度是66.6%,1/3的小块宽度是33.3%(实际可以使用-webkit-box-flex来分配,这里为了下面的计算方便)。

来看下实际效果,你也可以猛击demo来查看源码:

demo中我们看到中间那条竖空白间隙错位了,为什么?按照预期我们上面块左侧宽度66.6%,下面块左侧宽度33.3% 33.3%,两个宽度应该相等才对。

然而我们忽略了flex一个重要特性,子元素会自动占满父元素剩余空间,这时子元素宽度计算受flex控制,下面块的3个子元素宽度计算并非一定是相等的,会有些许差异,此时66.6% != 33.3% 33.3%。

怎么破!别急,让我们冷静下来重新思考如何划分。

flex 布局左右划分

问题在于竖间隙涉及到的左右侧宽度计算不稳定,既然如此,我们可以考虑依据竖间隙左右划分,排除不稳定因素,如下图:

这样就解决了竖间隙错位问题,但我们依然有所担心,中间的横间隙会错位吗?我们来算一下。

整体父元素宽度确定,为W;

整体父元素高度由子元素撑开,不确定;

左侧大块高度:左侧flex父元素宽度(W * 66.6%) * 100% = W * 66.6%;

左侧小块高度:左侧flex父元素宽度( W * 66.6%) * 50% = W * 33.3%;

右侧小块高度:右侧flex父元素宽度( W * 33.3%) * 100% = W * 33.3%。

依然是66.6%与33.3% 33.3%的等式,但这次高度计算会受 flex 影响吗?

不会,因为此时整体父元素的高度是不确定的,是由子元素内容撑开的,flex的高度也是由子元素来撑开的。

最终 66.6% === 33.3% 33.3%

我们来看下伪码,猛击我看demo:

XHTML

XML/HTML Code复制内容到剪贴板
  1. <div class="wrap-box wrap-6">  
  2.     <div class="flex-inner">  
  3.       <div class="flex-box1 flex-item"></div>  
  4.       <div class="flex-box2">  
  5.         <div class="flex-item"></div>  
  6.         <div class="flex-item"></div>  
  7.       </div>  
  8.     </div>  
  9.     <div class="flex-inner">  
  10.       <div class="flex-item"></div>  
  11.       <div class="flex-item"></div>  
  12.       <div class="flex-item"></div>  
  13.     </div>  
  14. </div>  
  15.     

CSS

CSS Code复制内容到剪贴板
  1. .wrap-box {   
  2.   display: -webkit-box;   
  3. }   
  4.     
  5. .flex-inner {   
  6.     -webkit-box-flex: 1;   
  7.     display: -webkit-box;   
  8. }   
  9.     
  10. .flex-item {   
  11.     -webkit-box-flex: 1;   
  12.     positionrelative;   
  13. }   
  14. .wrap-6 {   
  15.       -webkit-box-orient: horizontal;   
  16. }   
  17. .wrap-6 .flex-inner {   
  18.       -webkit-box-flex: 0;   
  19.       -webkit-box-orient: vertical;   
  20. }   
  21. .wrap-6 .flex-inner:first-child {   
  22.       width: 66.6%;   
  23. }   
  24. .wrap-6 .flex-inner:last-child {   
  25.       width: 33.3%;   
  26. }   
  27. .wrap-6 .flex-item {   
  28.       padding-top: 100%;   
  29. }   
  30. .wrap-6 .flex-box2 .flex-item {   
  31.       padding-top: 50%;   
  32. }   
  33. .wrap-6 .flex-box2 {   
  34.       display: -webkit-box;   
  35.       -webkit-box-orient: horizontal;   
  36. }   
  37. .wrap-6 .flex-inner:first-child,   
  38. .wrap-6 .flex-box2 .flex-item:first-child {   
  39.       margin-right1px;   
  40. }   
  41. .wrap-6 .flex-box1,   
  42. .wrap-6 .flex-inner:last-child .flex-item:first-child,   
  43. .wrap-6 .flex-inner:last-child .flex-item:nth-child(2) {   
  44.       margin-bottom1px;   
  45. }   

实际效果:

以上就是本文的全部内容,希望对大家的学习有所帮助。

我就是要用CSS实现九宫格图的更多相关文章

  1. HTML5拖拽功能实现的拼图游戏

    本文通过实例代码给大家介绍了HTML5拖拽功能实现的拼图游戏,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

  2. 使用Html5多媒体实现微信语音功能

    这篇文章主要介绍了使用Html5多媒体实现微信语音功能,需要的朋友可以参考下

  3. 吃透移动端 1px的具体用法

    这篇文章主要介绍了吃透移动端 1px的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. css绝对定位如何在不同分辨率下的电脑正常显示定位位置?(一定要看!)

    这篇文章主要介绍了css绝对定位如何在不同分辨率下的电脑正常显示定位位置,本文首先解释了常见的电脑分辨率,为了页面在不同的分辨率下正常显示,要给页面一个安全宽度,再去使用绝对定位,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。

  5. 详解HTML5中CSS外观属性

    这篇文章主要介绍了HTML5中CSS外观属性的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,,需要的朋友可以参考下

  6. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  7. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 基于HTML5+Webkit实现树叶飘落动画

    本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧

  9. Html5自定义字体解决方法

    这篇文章主要介绍了Html5自定义字体解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. css绝对定位如何在不同分辨率下的电脑正常显示定位位置?(一定要看!)

    这篇文章主要介绍了css绝对定位如何在不同分辨率下的电脑正常显示定位位置,本文首先解释了常见的电脑分辨率,为了页面在不同的分辨率下正常显示,要给页面一个安全宽度,再去使用绝对定位,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。

  2. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  3. CSS多级数字序号的目录列表(2.2.1. 2.2.2 列表序号)

    这篇文章主要介绍了CSS多级数字序号的目录列表(2.2.1. 2.2.2 列表序号),通过css代码定义将数字多级列表展示出来,,需要的朋友可以参考下

  4. CSS position属性和实例应用演示

    这篇文章主要介绍了CSS position属性和实例应用演示,absolute(绝对定位),relative(相对定位),relative与absolute的结合使用以及fixed(固定定位),需要的朋友可以参考下

  5. css中使用rgba和opacity设置透明度的区别(附图)

    这篇文章主要介绍了css中使用rgba和opacity设置透明度的两种方法,通过实例演示解释了两者之间的差别,需要的朋友可以参考下

  6. html+css 清除浮动的相关技巧心得

    下面小编就为大家带来一篇html+css 清除浮动的相关技巧心得。小编觉得挺不错的,现在分享给大家,给大家一个参考

  7. 简单介绍CSS设置打印页面的方法及css里media的使用

    这篇文章主要介绍了基于CSS设置打印页面简单介绍及css里media的使用 的相关资料,需要的朋友可以参考下

  8. CSS三大特性继承性、层叠性和优先级详解

    本文详细讲解了CSS三大特性继承性、层叠性和优先级,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. CSS清除浮动方法小结

    本文主要介绍了CSS解决浮动,清除浮动的几种方法:1、设置父元素高度;2、overflow;3、增加子元素(块级),并且设置其clear属性值为both来解决(隔墙法、内墙法);4、使用after或before伪对象清除浮动。下面跟着小编一起来看下吧

  10. 我就是要用CSS实现九宫格图

    本文介绍的就是我们最熟悉的老朋友,CSS。不讲枯燥的语法,抛开js,让我们一起来看业务中那别致的纯CSS实现,让我们一起来追求那更好的页面实现,希望我带着你走完这段旅程后,你能收获一些惊喜甚至灵感,感兴趣的小伙伴们可以参考一下

返回
顶部