美文网首页html5其他技术iOS备忘录
iOS全棧之路,为微信应用号打基础,(必敲篇)之瀑布流

iOS全棧之路,为微信应用号打基础,(必敲篇)之瀑布流

作者: 子祖 | 来源:发表于2016-09-22 08:47 被阅读1370次

    前言

    其实iOS早就已经不火了,现在随便发个招聘每天都有几百份简历,所以我打算通过这个教程让某部分人走上救赎之路,这次我主要想分享通过JS中的React Native和Node.js帮大家打通前后端,保持竞争力,只要你认真跟着学习,10天可以让你有一个质的改变,下面先发一波基础教程,后面直接上项目,如果有人零基础的,也可以留言,我想办法补一些更基础的教程

    本次内容

    iOS全棧之路,这标题之前引起了很多iOS 的开发者的热讨论,下面补充一下我想说的,js除了开发全棧应用之外,可以弥补iOS很多的问题,因为苹果本身是封闭的,如果要修改app的bug需要上传ipa包还有等待认证,但是js这些框架却能完美解决一下这些问题,另外框架的底层都是利用了iOS的runtime机制,真的有必要好好的研究和学习,无论你是移动端还是前端,趋势是不可阻挡的,你可以不学习,但必须要去了解的


    最后补一句,我写这些也是很辛苦的,也是没有报酬的,麻烦大家评论时下手轻一点,对那些真的有兴趣的人也是不公平的!

    html的

    里面图片文件可以自己随便添加,只是为了演示效果而已

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>瀑布流效果</title>
        <link rel="stylesheet" href="css/index.css">
    </head>
    <body>
        <!--父盒子-->
        <div id="main">
             <!--子盒子-->
             <div class="box">
                  <div class="pic">
                      <img src="images/0.jpg">
                      <div>
                          <span>价格:999</span>
                          <span>还剩9件</span>
                      </div>
                  </div>
             </div>
    
            <div class="box">
                <div class="pic"><img src="images/1.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/2.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/3.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/4.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/5.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/6.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/7.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/8.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/9.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/10.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/11.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/12.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/13.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/14.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/15.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/16.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/17.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/18.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/19.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/20.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/21.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/22.jpg" alt=""></div>
            </div>
            <div class="box">
                <div class="pic"><img src="images/23.jpg" alt=""></div>
            </div>
        </div>
    
    <script src="js/index.js" type="text/javascript"></script>
    <!--<script>-->
        <!--alert(0);-->
    <!--</script>-->
    </body>
    </html>
    

    css的

    *{
        padding: 0;
        margin: 0;
    }
    
    #main{
        /*定位*/
        position: relative;
    }
    
    .box{
       float: left;
       /*内边距*/
       padding: 15px 0 0 15px;
       /*background-color: red;*/
    }
    
    .pic{
        border:1px solid #dddddd;
        padding: 10px;
        background-color: white;
    
        border-radius: 5px;
    }
    
    .pic img{
        width: 165px;
    }
    

    JS来实现瀑布流

    // ===  值比较  类型比较
    function $(id) {
        return typeof id === 'string' ? document.getElementById(id) : id
    }
    
    
    // 当窗口加载完毕
    window.onload = function () {
         // 瀑布流布局
         WaterFall('main', 'box');
         // 滚动加载盒子
         window.onscroll = function () {
             if(CheckWillLoad()){ // 具备滚动的条件
                // 造数据
                var dataArr = [{'src': '10.jpg'},{'src': '11.jpg'},{'src': '13.jpg'},{'src': '16.jpg'},{'src': '18.jpg'},{'src': '20.jpg'},{'src': '40.jpg'},{'src': '30.jpg'}];
    
                // 遍历
                for(var i=0; i<dataArr.length; i++){
                    // 创建子盒子
                    var newBox = document.createElement('div');
                    newBox.className = 'box';
                    $('main').appendChild(newBox);
    
                    var newPic = document.createElement('div');
                    newPic.className = 'pic';
                    newBox.appendChild(newPic);
    
                    var newImg = document.createElement('img');
                    newImg.src = 'images/' + dataArr[i].src;
                    newPic.appendChild(newImg);
                }
    
                // 重新实现瀑布流布局
               WaterFall('main', 'box');
             }
         }
    };
    
    
    // http://blog.sina.com.cn/s/blog_966e43000101bplb.html
    // 瀑布流布局
    function WaterFall(parent, child) {
        // ------ 父盒子居中
        // 1.1 拿到所有的子盒子
        var allBox = document.getElementsByClassName(child);
        // 1.2 求出其中一个盒子的宽度
        var boxWidth = allBox[0].offsetWidth;
        // 1.3 求出页面的宽度
        var clientWidth = document.body.clientWidth;
        // 1.4 求出列数
        var cols = Math.floor(clientWidth / boxWidth);
        // 1.5 父盒子居中 css赋值都是String类型
        $(parent).style.width = boxWidth * cols + 'px';
        $(parent).style.margin = '0 auto';
    
        // ------ 子盒子的定位
        // 1.1 定义高度数组
        var heightArr = [];
    
        // 1.2 遍历所有的盒子
        for(var i=0; i<allBox.length; i++){
            // 1.2.1 取出单个盒子的高度
            var boxHeight = allBox[i].offsetHeight;
            // 1.2.2 判断
            if(i < cols){ // 第一行
               heightArr.push(boxHeight);
            }else{ // 剩余的行
               // 取出数组中最矮的盒子的高度
               var minBoxHeight = Math.min.apply(this, heightArr);
               // 取出数组中最矮的盒子的索引
               var minBoxIndex = GetMinBoxIndex(heightArr, minBoxHeight);
               // 子盒子定位
               allBox[i].style.position = 'absolute';
               allBox[i].style.top = minBoxHeight +'px';
               allBox[i].style.left = boxWidth * minBoxIndex + 'px';
    
               // 更新数组中最矮盒子的高度
               heightArr[minBoxIndex] += boxHeight;
            }
        }
    
        // console.log(heightArr, minBoxHeight, minBoxIndex);
    }
    
    // 获取最矮盒子的索引
    function GetMinBoxIndex(arr, value) {
        for(var i=0; i<arr.length; i++){
            if (arr[i] == value) return i;
        }
    }
    
    // 判断是否具备加载条件
    function CheckWillLoad() {
        // 1.1 获取最后的一个盒子
        var allBox = document.getElementsByClassName('box');
        var lastBox = allBox[allBox.length - 1];
    
        // 1.2 求出高度的一半 + 头部偏离的高度
        var lastBoxDis = lastBox.offsetHeight * 0.5 + lastBox.offsetTop;
    
        // 1.3 求出页面的高度  JS存在兼容性问题 ---> 标准模式  混杂模式
        var clientHeight = document.body.clientHeight || document.documentElement.clientHeight;
    
        // 1.4 求出页面偏离浏览器的高度
        var scrollTopHeight = document.body.scrollTop;
    
        // 1.5 判断返回
        return lastBoxDis <= clientHeight + scrollTopHeight;
    }
    

    相关文章

      网友评论

      • 许还真:怎么跑到iOS
        子祖:@一朵云风Xuyanci 看跟新
      • b6c7a3ded5ff:开发工具用什么?
        b6c7a3ded5ff:@子祖 嗯 非常感谢,一直在搞android,最近准备研究一下node.js
        子祖:@dyhuang 更新了
        子祖:@dyhuang 看之前教程
      • 圆缘园圆圆园:给楼主:+1:一个,辛苦了
        子祖:@圆缘园圆圆园 更新了
      • Charles___:有demo吗
        子祖:@一只孤独的iOS 更新了
        Charles___:@一只孤独的iOS ok
        子祖:@一只孤独的iOS 这个就是整个demo
      • JerryloveEmily:我先关注你,好几年没碰web的东西了,虽然上面有些还是没看懂,希望以后能出些RN node.js的 js怪异的语法还是有些不习惯
        子祖:@JerryloveEmily 更新了
        子祖:@JerryloveEmily 就是为了出rn才写的
      • Damonwong:……是不是会点前端就能写“小程序”教程了?根本不能操作dom,你还写的这么起劲
        子祖:@Damonwong 好好写一篇东西,还说我误导,你自己认真看一下啦,需要我截图吗?这是由浅入深,因为,react需要前端基础,我不会再回的了,你自己将心比心啦!
        Damonwong:@子祖 我有喷么?你激动什么?我只是觉得你这么写在误导。你要叫前端基础我就没意见了
        子祖:@Damonwong 能不能没看清楚就喷了?现在的人素质去哪里啦?这是基础教程,适合ios和零基础的人看,后面难度加大会介绍react native做全栈…
      • XH小子:正好想学,关注了先
      • 柯柯格格:基础的有么
        子祖:@柯柯格格 看之前的

      本文标题:iOS全棧之路,为微信应用号打基础,(必敲篇)之瀑布流

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