1 2 3 4 5 6 7 8
2016,要做就做整合营销型网站!微商再火,不如全方位营销,移动营销+网络电脑营销+各大搜索引擎营销通道=会赚钱的机器新年优惠多多,赶快抢购吧!

咨询电话:17737082911
联系人:张经理
QQ:1522468123
E-mail:info@keyuan.co
地址:建井1处小高层22号楼3单元3024

我就是要用CSS实现



   写在最前

  我们都是前端工程师,无论你现在是页面仔,还是Node服务开发者,抑或是全端大神,毋庸置疑的是,我们都是前端工程师,我们生来就对追求页面的极致拥有敏锐的触觉,无论是页面实现方式的高大上、页面的极致的性能还是页面完美的展现,都是我们孜孜不倦的追求目标。即使这些在别人眼里,只是跟其他的页面一样没什么不同,但我们却能为其中那只有我们才知道的一抹别致而窃喜。

  而今天我要讲的,就是我们最熟悉的老朋友,CSS。不讲枯燥的语法,抛开js,让我们一起来看业务中那别致的纯CSS实现,让我们一起来追求那更好的页面实现,希望我带着你走完这段旅程后,你能收获一些惊喜甚至灵感。

 

  WHY,为什么

  “我有很多事要做诶,忙都忙不过来,难道我要在这CSS上面浪费很多时间?”

  不,不,不,我们要做的事情,当然不会只是满足技术的追求,而是会有实质的好处的!

  我的观点如下:

  CSS跟UI结合更加紧密;

  用CSS来实现,能减少JS计算,减少样式修改,减少重绘,提升渲染效率;

  用CSS实现的,是一种模块化,更符合Web Components组件化思想,shadow DOM不就是致力于这么做么;

  咱最爱的,逼格更高~

 

  WHEN,何时

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

  在我看来:

  实现的对象是非交互性UI;

  这么做不会给你带来过量的DOM。要知道最不能忍受的,就是臃肿的页面;

  这么做能完美实现UI、能覆盖所有场景,否则设计跟产品不服。

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

 

  HOW,该怎么做

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

  我个人的见解:

  布局之美,理解透盒子模型,熟悉各种布局,不要忘了这是咱的根本;

  自适应之美,放心交给浏览器去做,我们要做的,是思考规则;

  Magic,新技术及小技巧,总能在某一刹那给你最需要的援助;

  前人之鉴,坑王之王,你已经身经百战了,还怕什么。

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

  

 

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

 

  一、手Q吃喝玩乐 好友去哪儿九宫格图

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

  

 

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

  图片大小自适应;

  图片个数不同时,图片按照指定方式排列;

  图片相邻处有1px空白间隙。

 

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

  float布局

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

  •   图片大小自适应:宽度百分比,高度使用 padding-top 百分比

  •   图片个数不同时,图片按照指定方式排列:使用 nth-child 伪类指定不同情况下的元素大小

  •   图片相邻处有1px空白间隙:使用 border-box + border模拟边框

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

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

       <div class="float">

  <div class="item">1</div>

  ...

  <div class="item">6</div>

  </div>

      

       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;

  }

  

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

  

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

  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:

    <div class="wrap-box wrap-6">

  <div class="flex-inner">

  <div class="flex-box1 flex-item"></div>

  <div class="flex-box2">

  <div class="flex-item"></div>

  <div class="flex-item"></div>

  </div>

  </div>

  <div class="flex-inner">

  <div class="flex-item"></div>

  <div class="flex-item"></div>

  <div class="flex-item"></div>

  </div>

  </div>

   

  wrap-box {

  display: -webkit-box;

  }

  .flex-inner {

  -webkit-box-flex: 1;

  display: -webkit-box;

  }

  .flex-item {

  -webkit-box-flex: 1;

  position: relative;

  }

  .wrap-6 {

  -webkit-box-orient: horizontal;

  }

  .wrap-6 .flex-inner {

  -webkit-box-flex: 0;

  -webkit-box-orient: vertical;

  }

  .wrap-6 .flex-inner:first-child {

  width: 66.6%;

  }

  .wrap-6 .flex-inner:last-child {

  width: 33.3%;

  }

  .wrap-6 .flex-item {

  padding-top: 100%;

  }

  .wrap-6 .flex-box2 .flex-item {

  padding-top: 50%;

  }

  .wrap-6 .flex-box2 {

  display: -webkit-box;

  -webkit-box-orient: horizontal;

  }

  .wrap-6 .flex-inner:first-child,

  .wrap-6 .flex-box2 .flex-item:first-child {

  margin-right: 1px;

  }

  .wrap-6 .flex-box1,

  .wrap-6 .flex-inner:last-child .flex-item:first-child,

  .wrap-6 .flex-inner:last-child .flex-item:nth-child(2) {

  margin-bottom: 1px;

  }

  实际效果:

  

   最后,flex大法好!

  行文匆忙,如大家发现错误欢迎指正。

  感谢你的阅读!原创文章转载请注明:

  转载自AlloyTeam:http://www.alloyteam.com/2016/01/let-see-css-world/

平顶山网站建设好选择平顶山科远网络平顶山网站优化专家,平顶山网站设计就到科远网络。

豫ICP备05018487号  Copyright © 2003-2013  郑州杰三网络技术有限公司 ALL Right Reserved
地址:建井1处小高层22号楼3单元3024  E-mail:info@keyuan.co
电话:17737082911   传真:    [站长统计]    

二维码扫描访问