自身就是要用CSS达成

百分比宽度划分究极版

来,心中默念3遍“要优雅不要污”,灵光一闪,flex大法好!

flex重要特性之一,可以指定 flex
布局下的元素如何分配空间,我们将点线元素宽度改为-webkit-box-flex:1,此时子元素就自动平均分了父元素宽度。

实际效果,猛击demo:

图片 1

图片 2

 

4、移动端弹窗 

 现在移动端很多弹窗组件使用flexbox来实现,直接嵌套div.overlay>div.pop。

图片 3<style>
.overlay{ /*flex style*/ display:-webkit-box;
-webkit-box-orient:horizontal; -webkit-box-pack:center;
-webkit-box-align:center; display:-moz-box; -moz-box-orient:horizontal;
-moz-box-pack:center; -moz-box-align:center; display:-o-box;
-o-box-orient:horizontal; -o-box-pack:center; -o-box-align:center;
display:-ms-box; -ms-box-orient:horizontal; -ms-box-pack:center;
-ms-box-align:center; display:box; box-orient:horizontal;
box-pack:center; box-align:center; display: -webkit-flex;
-webkit-align-items: center; -webkit-justify-content: center; display:
flex; align-items: center; justify-content: center; /*other style*/
width:100%; max-width:750px; height:100%; position:fixed; top:0; left:0;
background:rgba(0,0,0,0.5); } .popup{ width:90%; max-width:650px;
border:1px solid green; padding:20px 4% 4% 4%; box-sizing:border-box;
height:auto; background:#fff; border-radius:4px; position:relative; }
.popup-close{ width:15px; height:14px; background:url(image/close.png)
no-repeat; background-size:100% 100%; position:absolute; top:8px;
right:8px; } </style> 主页面的文字 <div class=”overlay”>
<div class=”popup”> <a href=”javascript:;”
class=”popup-close”></a> 弹层的文字 </div> </div>
View Code

图片 4

百分比宽度切分进化版

搅屎棍就是最左侧那固定的点,难道就不能把最左边那该死的点从我们的百分比团队里排除掉吗?如下图:

图片 5

当然可以!我们只需父元素腾出这个子元素宽度出来,不算在其余子元素宽度百分比计算内。

腾出空间方式:父元素 margin-left 出空间,子元素负 margin-left 移回原位。

此时父元素给子元素的内容计算宽度就是width –
margin-left,除首个子元素外,其余每个子元素宽度一致,为平均下来的百分比值。

实际效果,由于源码较长,请猛击demo看源码:

图片 6

完(美),话还没说完,产品就找来要改点的数量。

图片 7

我们一看宽度是百分比设死的,这样在点的数量修改时,我们还是要改css,完。

图片 8

五、兼容性

图片 9

 

PC端:

  • 无前缀:Chrome 29+, Firefox 28+, IE 11+, Opera 17+
  • 需要前缀:Chrome 21+, Safari 6.1+, Opera 15+需要前缀-webkit-

提示:旧版本的Firefox(22-27)支持除了flex-wrapflex-flow之外的新语法。Opera
(12.1+ –
17+)使用flex可以没有私有前缀,但是中间的15和16版本需要私有前缀。

移动端:

  • 无前缀:Android 4.4+, Opera mobile 12.1+, BlackBerry 10+, Chrome for
    Android 39+, Firefox for Android 33+, IE 11+ mobile
  • 需要前缀:iOS 7.1+需要前缀-webkit-

WHEN,何时

“我懂了,看起来是有那么点意思,可是我什么时候能用CSS来做大事啊?”

在我看来:

  1. 实现的对象是非交互性UI;
  2. 这么做不会给你带来过量的DOM。要知道最不能忍受的,就是臃肿的页面;
  3. 这么做能完美实现UI、能覆盖所有场景,否则设计跟产品不服。

什么是非交互性UI,就是不会在用户触发了某种行为时,哗啦啦来个闪瞎眼的交互,吓得用户直接高潮,而是从页面渲染后,就一直在那里,那么安静,那么美的女子,哦不,UI。

 

3、垂直居中

.parent{display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center;}

完整demo

图片 10<style>
.parent{display: -webkit-box; display: -webkit-flex; display: flex;
-webkit-box-align: center; -webkit-align-items: center; align-items:
center; height:100px; width:150px; background-color:pink;} .child{
width:50px; height:50px; border:1px solid green; } </style>
</head> <body> <div class=”parent”> <div
class=”child”></div> </div> View Code

图片 11

我就是要用CSS实现

2016/01/15 · CSS ·
CSS

原文出处:
AlloyTeam   

4、子元素水平排列,定高垂直方向居中对齐

父元素中子元素水平排列,子元素定高时设置垂直方向对齐方式为居中对齐。

图片 12<style>
.parent{ width: 400px; height: 200px; display: -webkit-box;
background-color:pink; -webkit-box-orient: horizontal;
/*-webkit-box-align:center;/*父元素中子元素水平排列,定高时设置垂直方向对齐方式为垂直居中*/
} .child-one{ background: lightblue; -webkit-box-flex: 1; height:100px;
} .child-two{ background: lightgray; -webkit-box-flex: 2; height:110px;
} .child-three{ background: lightgreen; -webkit-box-flex: 2;
height:120px; } </style> </head> <div style=”display:
-webkit-box;-webkit-box-pack: center;border: 1px solid
#000;”><!—webkit-box-pack:center让.parent水平居中–> <div
class=”parent”> <div class=”child-one”>1</div> <div
class=”child-two”>2</div> <div
class=”child-three”>3</div> </div> </div> View Code

图片 13

flex布局

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

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

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

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

二、flexbox常用属性

flex 布局上下划分

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

图片 14

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

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

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

图片 15

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

  • 33.3%,两个宽度应该相等才对。

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

怎么破!别急,我们刚刚只是受到了肾上激素的影响,让我们冷静下来重新思考如何划分。

三、快速入门demo

float布局

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

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

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

让我们一瞅伪码,猛击我看demo

XHTML

<div class=”float”> <div class=”item”>1</div> …
<div class=”item”>6</div> </div>

1
2
3
4
5
<div class="float">
    <div class="item">1</div>
    …
    <div class="item">6</div>
</div>

 

CSS

.float { overflow: hidden; } .item { float: left; padding-top: 33.3%;
width: 33.3%; border-right: 1px solid #fff; border-top: 1px solid
#fff; } .item:nth-child(1) { padding-top: 66.6%; width: 66.6%; }
.item:nth-child(2), .item:nth-child(3), .item:nth-child(6) {
border-right: 0 none; } .item:nth-child(1), .item:nth-child(2) {
border-top: 0 none; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.float {
    overflow: hidden;
}
.item {
    float: left;
    padding-top: 33.3%;
    width: 33.3%;
    border-right: 1px solid #fff;
    border-top: 1px solid #fff;
}
.item:nth-child(1) {
    padding-top: 66.6%;
    width: 66.6%;
}
.item:nth-child(2), .item:nth-child(3), .item:nth-child(6) {
    border-right: 0 none;
}
.item:nth-child(1), .item:nth-child(2) {
    border-top: 0 none;
}

 

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

图片 16

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

1、垂直等高,水平均分,按比例划分

.parent{display: -webkit-box; display: -webkit-flex; display: flex;}
.child{-webkit-box-flex: 1; -webkit-flex: 1; flex: 1;}

完整demo

图片 17<style>
.parent{display: -webkit-box; display: -webkit-flex; display: flex;
height:100px; width:150px; background-color:pink;}
.child{-webkit-box-flex: 1; -webkit-flex: 1; flex: 1; border:1px solid
green; } </style> <div class=”parent”> <div
class=”child”></div> <div class=”child”></div>
<div class=”child”></div> </div> View Code

图片 18

百分比宽度切分

于是我们回归本源,遵从CSS世界的规则来,将点线合起来看,每个子元素包含自己的点线,从左至右排列,并使用自适应布局的方式,子元素宽度为百分比,如下图的方案:

图片 19

  • 灰色背景线依旧使用父元素的after实现;
  • 每个子元素宽度一致,为平均下来的百分比值,如25%;
  • 点绝对定位在子元素右侧;
  • 绿色线条在子元素内实现。

然而我们发现这么做不灵,在普通盒子模型里,子元素宽度总和无法溢出父元素(除了flex),在这里总宽度是4个带线子元素(百分比)+1个点宽度(固定),实际25%的划分展示与理想不符。

此外,最左侧只有点,没有线条,点的宽度固定,线条宽度不定,css无法计算(忘掉表达式吧),无法隐藏线条,fail!

1、子元素水平排列,按比例分割父元素宽度

.parent宽度500px,其子元素水平排列,child-one占1/6,child-two占2/6,child-three占了3/6。

<style>
        .parent{
            width: 500px;
            height: 200px;
            display: -webkit-box;
            -webkit-box-orient: horizontal;/* 虽然默认的排列方式是水平的,但是为了区分起见,加上该属性 */
        }
        .child-one{
            background: lightblue;
            -webkit-box-flex: 1;
        }
        .child-two{
            background: lightgray;
            -webkit-box-flex: 2;
        }
        .child-three{
            background: lightgreen;
            -webkit-box-flex: 3;
        }
    </style>
</head>
<div style="display: -webkit-box;-webkit-box-pack: center;border: 1px solid #000;"><!---webkit-box-pack:center让.parent水平居中-->
    <div class="parent">
        <div class="child-one">1</div>
        <div class="child-two">2</div>
        <div class="child-three">3</div>
    </div>
</div>

图片 20

HOW,该怎么做

“可是我还是不懂该如何做才能这么有逼格”

我个人的见解:

  1. 布局之美,理解透盒子模型,熟悉各种布局,不要忘了这是咱的根本;
  2. 自适应之美,放心交给浏览器去做,我们要做的,是思考规则;
  3. Magic,新技术及小技巧,总能在某一刹那给你最需要的援助;
  4. 前人之鉴,坑王之王,你已经身经百战了,还怕什么。

这些就是我总结出你要用CSS来实现一个别人想不到的东西时,应该具有素质。最重要的还是思考,因为没有一个东西是绝对最好的,我们总在前进。

图片 21

下面就以两个手机QQ实际业务的例子,带领大家感受一下CSS的魅力。

 

六、资源链接

display:-webkit-box

A Complete Guide to Flexbox

探索Flexbox

时下Web App中的Flexbox应用

 

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:

 

一、概述
浮动在移动布局中不再重要,flex盒模型越来越重要。
flexbox经历过三个版本,主要区别是2009年到2012年之间的语…

发表评论

电子邮件地址不会被公开。 必填项已用*标注