瀑布流知识的延伸

瀑布流,很常见了,淘宝,网易云音乐等等都有,实现原理,咱先放着一遍,先将涉及到的知识点拓展开来

一、Math的方法

Math求最小值、最大值,

对于一般的数字直接求,Math.min  Math.max

但是求数组呢,一个方法,三种形式,js高程书中利用apply的回调函数,将this指向window,直接将所求的数组作为参数传入

封装函数的方法

封装一个getMin的函数直接调用获得

          var numbers=[23,435,45,34]
          function getMin(arr){               //封装一个方法
                return min=Math.min.apply(null,arr)  //利用apply的回调函数,将作用域this指向window,将数组作为参数传入
          }
          console.log(getMin(numbers))

原型对象的方法一

学过原型对象,直接在Array的原型上添加min方法,让Array拥有min的方法,不推荐,产品化的程序不推荐在基本包装类型添加多余的方法

          Array.prototype.min=function(array){     //直接在原型上添加,传递参数
               return Math.min.apply(null,array)
          }
          alert(numbers.min(numbers))

原型对象的方法二

利用Object.defineProperty方法,这个具体说说

          Object.defineProperty(Array.prototype,‘max‘,{
                   writable:false,
                   enumerable:false,
                   configurable:true,
                   value:function(){
                         return Math.max.apply(null,numbers)
                   }
          })
          console.log(numbers.max())

拓展之Object.defineProperty方法

object.defineProperty()方法直接在对象上定义个新属性或者修改一个对象的现有属性,并返回这个对象

接受三个参数

obj:要在其上定义属性的对象,可以是引用类型Math,也可以是自定义的,或者原型对象

prop:要定义或修改属性的名称(方法名)

descriptor:将被定义或修改属性的描述符

默认情况下使用此方法添加的属性是不可改变的,但是可以设置一些特性使其可以改变,for in 遍历的到等等

对属性添加特性描述有数据描述和存取器描述两种

数据描述

writable:值是否可以重写

enumerable:目标属性是否可以被枚举

value:设置属性的值,可以为任意的数据类型或函数

configurable:目标属性是否可以被删除或修改

          //在String原型对象上添加方法
          var str=‘hello‘
          Object.defineProperty(String.prototype,‘newword‘,{
                 value:‘world‘
          })
          alert(str.newword)
          //单独给某个对象添加方法
          var obj={}
          Object.defineProperty(obj,‘newword‘,{
                   value:‘world‘
          })
          alert(obj.newword)

          //完整的特性例子
          var obj={}
          Object.defineProperty(obj,‘newword‘,{
                    value:‘world‘,
                    writable:false,       //是否重写
                    enumerable:true,     //for in 遍历
                  configurable:true     //是否可以删除属性  是否可以再次修改特性
          })
          alert(obj.newword)      //world
          obj.newword=‘hello‘     //writable为false 所以无效
          alert(obj.newword)      //word
          for(var i in obj){
               console.log(i)       //newword enumerable是true可以遍历
          }
          delete obj.newword
          alert(obj.newword)      //undefined 因为删除了

存取器描述

使用

getter方法 获得属性值

setter方法 设置属性值

当使用getter或setter就不允许使用writable和value这两个属性

          var obj={}
          var initValue=‘hello‘
          Object.defineProperty(obj,‘newword‘,{
                  get:function(){
                      return initValue     //得到属性值
                  },
                  set:function(value){     //设置属性值
                      initValue=value
                  }
          })
          console.log(obj.newword)

IE8只能在DOM对象上使用的

有趣的东西

Math.min 和 Math.max 方法

          var max=Math.max()
          var min=Math.min()
          console.log(max>min)     //false

这里min反而是大于max呢?

MDN里解释对于

Math.min()如果没有参数,则返回Infinity

Math.max()如果没有参数,则返回-Infinity

任意参数不能转换为数值,则返回NaN

二、获取指定class的元素

早期的浏览器中不兼容getElementsByClassName 为了获取指定的class元素集合,常常封装一个方法,返回数组

          //获得指定class的元素
          function getByClass(parent,name){
                 var lists=parent.getElementsByTagName(‘*‘)
                 var arr=[]
                 for(var i=0;i<lists.length;i++){
                           if(lists[i].className==name){
                                  arr.push(lists[i])
                           }
                 }
                 return arr
          }

三、访问元素的样式

普通的访问简单,直接,DOM2级为style设置一些属性和方法,比如CSSText,可以直接访问到css元素属性,为元素应用多项变化最快捷的方式,一次性应用所有的

下面的代码,分别是设置CSSText   移除removeProperty   length属性帮忙遍历

          //访问元素的样式
          //DOM2级中规定 CSSText访问style里的代码
          var myDiv=document.getElementById(‘myDiv‘)
          myDiv.style.cssText=‘width:200px;height:200px;background:#fee;color:red;‘
          //移除某个css属性
          myDiv.style.removeProperty(‘color‘)
          //遍历css属性  length和item的结合  getPropertyValue方法返回的是css属性值的字符串
          for(var i=0;i<myDiv.style.length;i++){
                   console.log(myDiv.style[i])
          }

这里补充个非行间样式的获取方法,直接获取非行间样式是不可读的,返回“”

          //获取非行间样式
          function getStyle(obj,attr){
                 if(obj.currentStyle){
                         return obj.currentStyle[attr]         //IE是属性
                 }else{
                         return getComputedStyle(obj,false)[attr]  //其他为方法
                 }
          }

注意:如果是CSSText设置的,普通访问还是访问的到的,否则还是用封装函数的方法

四、json的遍历问题

json是一种轻量级的文本数据交换格式,是一种数据格式,支持多种编程语言,具有自我描述性,容易理解

JSON: JavaScript Object Notation(JavaScript 对象表示法)

JSON 是存储和交换文本信息的语法。类似 XML。

JSON 比 XML 更小、更快,更易解析。

下面是简单的json格式和遍历

          var json={
                 ‘name‘:‘double‘,
                 ‘age‘:34,
                 ‘sex‘:‘man‘
          }
          // 对于json格式,一般用for in 遍历其中的元素
          for(var i in json){
                console.log(i)     //得到name age sex  获得的是属性
          }
          for(var j in json){
                  console.log(json[j])  //得到double 34 man  获得的是属性值
          }

嵌套的json遍历,

          //嵌套的json格式
          var json={
                 ‘name‘:‘double‘,
                 ‘age‘:34,
                 ‘sex‘:{
                           ‘man‘:‘one‘,
                           ‘woman‘:‘two‘
                 }
          }

          for(var i in json[‘sex‘]){         //遍历嵌套的json格式
                  console.log(i)               //属性
                  console.log(json[‘sex‘][i])  //属性值
          }

五、关于offsetWidth clientHeight scrollTop相关的总结

明天再续写

六、瀑布流的思路

好吧,现在正式说一说瀑布流的问题,前面都是我在瀑布流中遇到的重要的知识点

下面总结一下思路

瀑布流,两步走

第一步,图片大大小小都对齐,不要溢出,不要塌陷

第二部,滚动鼠标,图片源源不断的来,永远滚不到底

解决第一步

计算页面中的列数,利用列数求出container的宽度

计算最小图片的高度和索引,让次行的第一张图片到达最小图片的下面,且使得那一行的高度增加

解决第二步

计算鼠标滚动的距离,相比较最后一张图片的scrollHeight

为新加载的图片创建节点,添加到页面上

附上源码,注释标的挺清楚的

window.onload=function(){
      waterFall(‘container‘,‘wrap‘)              //这里获取的是整个的wrap,box则不对,因为padding

      var dataInt={‘data‘:[{‘src‘:‘50.jpg‘},{‘src‘:‘51.jpg‘},{‘src‘:‘52.jpg‘}]} //数据库中的图片,以json的格式传入
      window.onscroll=function(){
             if(checkScrollSlide()){
                  var oParent=document.getElementById(‘container‘)
                     for(var i=0;i<dataInt.data.length;i++){            //遍历数据库中的图片
                             var oWrap=document.createElement(‘div‘)    //添加新节点到原来的HTML中
                        oWrap.className=‘wrap‘
                        oParent.appendChild(oWrap)
                        var oBox=document.createElement(‘div‘)
                        oBox.className=‘box‘
                        oWrap.appendChild(oBox)
                        var oImg=document.createElement(‘img‘)
                        oImg.src=‘images/‘+dataInt.data[i].src
                        oBox.appendChild(oImg)
                     }
                     waterFall(‘container‘,‘wrap‘)                      //再次的排序
             }
      }
}
//排序,让图片大小一致的排序
function waterFall(parent,child){
      var iParent=document.getElementById(parent)
      var aLists=getByClass(iParent,child)       //获得class为wrap的图片块
      //获得列数
      var pageWidth=document.documentElement.clientWidth||document.body.clientWidth
      var boxWidth=aLists[0].offsetWidth
      cols=Math.floor(pageWidth/boxWidth)       //整个页面/单个宽
      //根据列数计算contianer宽度
      iParent.style.cssText=‘width:‘+cols*boxWidth+‘px;margin:0 auto;‘
      //存放每一行的高度
      var colHeight=[]
      for(var i=0;i<aLists.length;i++){
             if(i<cols){
                     colHeight.push(aLists[i].offsetHeight)     //将第一行高度纳入
             }else{                                          //其余行
                var minH=Math.min.apply(null,colHeight)    //利用Math.min查找数组高度最小
                var index=colHeight.indexOf(minH)          //获得最小的索引
                aLists[i].style.position=‘absolute‘        //因为移动,所以设置position/top/left
                aLists[i].style.top=minH+‘px‘
                aLists[i].style.left=boxWidth*index+‘px‘
                colHeight[index]+=aLists[i].offsetHeight   //最小的高度+接下来的高度,使第二小成为最小,然后依次
             }
      }
}

//获取class为box的元素 传递两个参数parent className
function getByClass(parent,name){
     var list=parent.getElementsByTagName(‘*‘)
     var arr=[]
     for(var i=0;i<list.length;i++){
           if(list[i].className==name){
                  arr.push(list[i])
           }
     }
     return  arr
}

//检测浏览器是否scroll
function checkScrollSlide(){
    var oParent=document.getElementById(‘container‘)
    var aWrap=getByClass(oParent,‘wrap‘)
    var lastWrap=aWrap[aWrap.length-1].offsetTop+Math.floor(aWrap[aWrap.length-1].offsetHeight/2)  //获得最后一张图片的距离的高度
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop             //scrollTop
    var clientHeight=document.documentElement.clientHeight||document.body.clientHeight    //clientHeight
      if(lastWrap<scrollTop+clientHeight){                //判断
             return true
      }
}

但凡有错,直接指出,相互进步,就马上也过年了,祝大家新年大吉吧!

原文地址:https://www.cnblogs.com/iDouble/p/8449072.html

时间: 2024-08-01 11:01:53

瀑布流知识的延伸的相关文章

自定义控件三部曲视图篇(三)——瀑布流容器WaterFallLayout实现

前言:只要在前行,梦想就不再遥远 系列文章: Android自定义控件三部曲文章索引:http://blog.csdn.net/harvic880925/article/details/50995268 前面两节讲解了有关ViewGroup的onMeasure.onLayout的知识,这节我们深入性地探讨一下,如何实现经常见到的瀑布流容器,本节将实现的效果图如下: 从效果图中可以看出这里要完成的几个功能: 1.图片随机添加 2.在添加图片时,总是将新图片插入到当前最短的列中 3.每个Item后,

采用Volley,实现瀑布流

今天停下php,研究了下Volley框架的源码,实现了瀑布流的效果. 要实现最终的瀑布流效果,需要掌握几点知识: (1)自定义布局,因为我们要监听滑到底部的事件就要实现自定义的ScrollView并通过回调函数实现监听 (2)对Vollet框架的掌握,我们需要新建一个requestQueue队列,通过研究源码发现在新建这个队列的时候传入相应的构造函数,然后会调整其中的start方法,有四个线程池收发请求,每个在一个while循环中实现队列的监听. (3)动态布局,在自定义的scrollView里

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动

比较容易理解的---原生js瀑布流

最近一直在恶补基础JS H5 CSS3的基础知识 关于这个瀑布流: 本来打算看着教程来做的. 不过 感觉理解起来有点复杂. SO, 自己参考教程默写了一个.. 目前我所接触过的瀑布流布局分为2大类 主要区分在于 float布局 或者position布局 点击这里下载Demo 贴下源码:(可能有些BUG,没有具体测试) 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

Wookmark-jQuery-master 瀑布流插件使用介绍,含个人测试DEMO

要求 必备知识 本文要求基本了解 Html/CSS,  JavaScript/JQuery. 开发环境 Dreamweaver CS6 / Chrome浏览器 演示地址 演示地址 资料下载 测试预览截图(抬抬你的鼠标就可以看到演示地址哦): 程序核心代码看这里: $(function(){ function show(){ var colors=["#BA4A3A","#5BB5D6","#8EA83B","#EE5C92",

ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前,先把实现的基本原理说一下.当夜幕下拉到底部的时候,js可以判断滚动条的位置,到达底部触发js方法,执行jquery的ajax方法,向后台一般处理程序夜幕ashx文件请求数据源,得到json格式的数据源.然后,遍历json数据源,拼接一个li标签,再填充到页面上去. 首先,我们来做个简单的html页面

瀑布流 jquery。

本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群. 希望光临本博客的人能够进来交流. 寻求共同发展. 搭建平台. 本人博客也有很多的技术文档.希望能够为你提供一些帮助.QQ群:   191848169               QQ:450225664 有好多朋友说瀑布流还是有些问题. 如今我贴出代码. 仅仅要引入jquery就能够用的哦~ //下拉载入很多其它 $(window)

iOS瀑布流实现(Swift)

这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及会介绍第一种实现的bug. <1>第一种 效果图如下所示: 这种实现方法的思路: 1)首先调用随机函数,产生随机高度,并把它保存到数组中 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollection

用jQuery实现瀑布流效果学习笔记

jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把其中的几个函数具体记录一下. 首先,在WebStorm中新建一个工程,导入jquery库和几张img放在img文件夹下,新建html和css文件,用来搭建基本的网页结构.我们设定图片的宽度固定,高度不定,绝对定位,左浮动.这里就不细说了.我们主要讲jquery部分的知识. 这里我们讲一下我们要实现的