CSS-实现全等四宫格的方案【Collection】

全等四宫格.png

如上图,需求如下:

一个未知宽高的容器,要被均分为四个相同大小格子(即四个容器),且格子间有10px间距(即十字型空隙),有哪些方法可以解决呢?

分析问题

一般实现布局,用的多的是CSS的几大属性display float position flex
其中display的应用很灵活,用的最多的是tabletable-cellfloat实现浮动排列,多行可以每行套个容器,也可以不套而是在每行第一个元素前生成用于清除浮动的隐藏内容(::before display:block clear:both; height:0; line-height:0; overflow:hidden; visibility:hidden;);
flex就不用多说了,专为布局而生;
position实现布局需要考虑精确位移,可能需要用到top right bottom left transform:translate() calc()。要注意的是设置position:absolute;的元素是也可以通过设置margin(这个之前记错了,以为设置定位的元素不能使用margin)的来实现定位。(仅CSS而言,暂时想不到其他实现精确位移的方式了)

结构设定

统一CSS设置:

/*CSS Reset*/
.container, .container * { padding: 0; margin: 0; line-height: 0; }
.cell>div { width: 100px; height: 100px; background-color: #598; }

主要HTML结构:

<div class="container">
    <div>
        <div class="cell no1">
            <div></div>
        </div>
        <div class="cell no2">
            <div></div>
        </div>
    </div>
    <div>
        <div class="cell no3">
            <div></div>
        </div>
        <div class="cell no4">
            <div></div>
        </div>
    </div>
</div>

解决方案

以下是目前可想到的解决方案

/* 方案一 ———— table*/
.container {
    display: table;
}
.cell {
    display: table-cell;
}
.cell>div {
    margin: 5px;
}

优点:简单、简洁,松散耦合
缺点:tabletable-cell在IE6/7中可能有兼容性问题

/*方案二 ———— flex*/
.container {
    display: flex;
    flex-flow: column;
}
.container>div {
    display: flex;
    margin: 5px 0;
}
.cell>div {
    margin: 0 5px;
}

优点:简单,松散耦合,布局灵活性大
缺点:flex的兼容性问题

/*方案三 ———— float + clear:both*/
.container>div::before {
    /*主要是清除第二个框前面的浮动*/
    content: '.';
    display: block;
    clear: both;
    height: 0;
    width: 0;
    line-height: 0;
    overflow: hidden;
    visibility: hidden;
}
.cell {
    float: left;
}
.cell>div {
    margin: 5px;
}
/*方案三·改 —— 将清除浮动改为overflow: hidden;*/
.container>div {
    overflow: hidden;
}

优点:兼容性良好;“方案三·改”也可以让代码简洁
缺点:代码量大,并且后面紧跟的页面元素还需要先清除浮动才能保证不影响页面;“方案三·改”在IE6/7可能有兼容性问题

/*方案四 ———— translate + calc()
 *calc()方法 参考自:http://ued.ctrip.com/blog/translation-css-layout-math-read-calc.html
 */
.container {
    position: relative;
}
.container>:last-child {
    transform: translateY(10px);
}
.cell {
    position: absolute;
}
.container>:first-child>.cell:last-child {
    transform: translate(calc(100% + 10px),0);
}
.container>:last-child>.cell:first-child {
    transform: translate(0, 100%);
}
.container>:last-child>.cell:last-child {
    transform: translate(calc(100% + 10px), 100%);
}

优点:不对页面其他元素构成影响
缺点:transformcalc会有兼容性问题。
----割----
之前搞错了position元素使用margin的特性,今天看其他代码时,才发现记错了。所以又想出个方案

/* 方案五 ———— position:relative + margin */
.container {
    /* 用于修正整个四宫格区域对后面页面的影响 */
    overflow: hidden;
    width: 210px;
    height: 210px;
}
.container>:last-child {
    position: relative;
    top: -90px;
}
.cell {
    position: relative;/* 利用相对定位可以位移的特性 */
}
.container .cell:last-child{
    top: -100px;
    left: 110px;
}
/* 方案五·改————可以将top:-90px;部分替换成下面这个 */
.container>:last-child {
    margin-top: -90px;
}

优点:兼容性良好
缺点:因为relative的元素任然会在文档中占用位置,所以会影响四宫格后面的页面内容的布局。不过还好可以对整个四宫格的区域设置固定宽高并且overflow:hidden来解决。可是宽高又是强耦合了。
-----割-----
今天看其他同学引用其他同学的代码(绕得有点...),看到可以实现三列布局效果,但是就是看不明白原理,然后决定一步一步注释了看效果。花了不少时间,但是加深了,对floatpositionrelativeabsolutemargin的理解。因此又想出了一个方案。

/* 方案六 ———— position */
.container {
    /* 用于解决不占用文档位置而影响后面布局的问题 */
    width: 210px;
    height: 210px;
}
.container>div {
    position: relative;
}
.container>div:last-child {
    top: 110px;
}
.cell {
    position: absolute;/* 所有.container>div高度都会变为0 */
}
.cell:last-child {
    left: 110px;
}

优点:绝对兼容
缺点:因为每个格子使用的绝对定位,而且它们的容器(.container>div)以及容器的容器(.container)的高度都未设置也就是默认的跟随内容的auto,所以整个四宫格区域不会占用页面位置,从而后面的页面元素会跑到四宫格下面去。可以通过方案五的方式,给.container设置固定宽高来解决,但是不需要overflow:hidden;

关于CSS方法calc的使用可以看看这篇文章:
【译】CSS的布局数学:读懂calc – 携程设计委员会

以上
欢迎交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,728评论 1 92
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,138评论 0 1
  • 转载请声明 原文链接地址 关注公众号获取更多资讯 第一部分 HTML 第一章 职业规划和前景 职业方向规划定位...
    程序员poetry阅读 16,518评论 32 459
  • display: none; 与 visibility: hidden; 的区别 联系:它们都能让元素不可见 区别...
    纹小艾阅读 1,378评论 0 1
  • 傍晚快下班时同事小牛一脸怪笑说:阿年,你今天早上起得早了! 起得早?是啊,我每天早上起得都不迟啊,五点多一些,睁开...
    吴春年阅读 583评论 15 8