移动端开发就不需要学习CSS了?

作者: blueMononoke | 来源:发表于2018-12-05 10:25 被阅读33次

    移动端(Android/iOS)开发的小伙伴,是不是觉得不需要学习web开发了?不能因为是web相关内容的而望而旋走是不是?毕竟大家都是大前端的,互相了解才能师夷长技以制夷对不对?(雾)

    移动开发不等于只有app开发,所有的技术浪潮都可以融入到移动开发体系中。作为前端工程师,无论是对页面的实现方式要求高大上,表现形式的完美,还是性能的极致,都是我们不断追求的目标。

    由于前端技术栈的不断更新,效率提高,同样的前端人数,能完成比以前更多的职责范围。在不少企业,1个优秀的前端工程师就能搞定Web和移动端的开发,甚至负责一部分后端。移动端的同学还不来学习下web?

    既然总是先看脸,那先来学习下Web中的CSS吧~

    话说css和html的关系?

    在Android开发中,都在xml里写app的布局,那web中的html和css,到底是什么关系呢?

    看图比较形象:


    html与css1.png html与css2.png

    在web中,HTML是骨架,CSS是皮肤,JavaScript是肌肉。
    而如果用一扇门比喻三者之间的关系:HTML是门的门板,CSS是门上的油漆或者花纹,JavaScript则是门的开关。

    接下来总体了解下CSS~

    CSS介绍

    CSS的官方名字叫做层叠样式表,他的出现是为了解决内容和表现分离的问题,一般存放在 .css 文件里。

    CSS的出现,拯救了混乱的HTML,让网页的形式更加丰富多彩。
    它最大贡献就是: 让HTML从样式中解脱苦海, 实现了HTML专注去做结构呈现。 而样式交给CSS后,你完全可以放心地早点洗洗睡了!
    如果JavaScript是网页的魔法师,那么CSS就是网页的美容师。

    论美容师的重要.png

    理论上讲它可以规定网页的一切表现,位置、颜色、大小、距离…设计稿上的所有效果都可以借助它一一呈现,但是在实际应用中配合功能和性能以及各方面的要求,导致设计师的构想并不一定能够完整表达。

    各类布局,都是为了美观,而布局之美,根本是要理解透盒子模型,熟悉各种布局。

    没有一种东西是绝对好的,只有不断地进步。

    CSS组成

    两个主要部分:选择器,一条或者多条声明。

    CSS样式规则

    使用HTML时,需要遵从一定的规范。CSS亦如此,要想熟练地使用CSS对网页进行修饰,首先需要了解CSS样式规则,具体格式如下:

    css规则.png

    理论比较枯燥,看🌰来感受下css的魅力吧!

    九宫格图

    九宫格图.png

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

    1. 图片大小自适应;
    2. 图片个数不同时,图片按照指定方式排列;
    3. 图片相邻处有1px空白间隙。
    以图6为例, image.png

    来看如何用css一步一步实现效果。

    float布局

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

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

    可以看到 float 布局不能做到真正的流体布局。至少width要自己去算百分比。
    它的优点是DOM结构十分简单,缺点是容易出现空白间隙错位,优缺点都十分明显,它更适用于js计算的版本。

    还有谁?flex!

    flex,即伸缩布局盒模型(Flexible Box)

    1. 可以将 flex 布局下的元素展示在同一水平、垂直方向上;
    2. 可以支持自动换行、换列;
    3. 可以指定 flex 布局下的元素如何分配空间,可以让元素自动占满父元素剩余空间;
    4. 可以指定 flex 布局下的元素的展示方向,排列方式

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

    flex布局上下划分

    使用传统css文档流自上而下的方式来划分,称为上下划分,如下图:

    flex上下划分.png

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

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

    主要实现:

    <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上下划分效果

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

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

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

    flex左右划分

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

    左右划分.png

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

    整体父元素宽度确定,为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%

    主要实现:

    <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左右划分效果

    Perfect~

    css是不是很好用?

    这篇的概念先介绍这么多了,后续再做深入学习~

    参考文档:

    1. Flex布局的基本概念
      https://juejin.im/post/5c0731e951882516da0e373d
    2. 我就是要用CSS实现
      http://www.alloyteam.com/2016/01/let-see-css-world

    相关文章

      网友评论

        本文标题:移动端开发就不需要学习CSS了?

        本文链接:https://www.haomeiwen.com/subject/yqamcqtx.html