瀑布流封装

window.onload = function  () {

waterFull('main','box');

// 模拟json数据

var dataInt={"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'},{"src":'4.jpg'}]}
window.onscroll = function  () {
if(checkScrollSide()){
for(var i=0;i<dataInt.data.length;i++){
var oParent=document.getElementById("main");
var oBox=document.createElement('div');
oBox.className='box';
oParent.appendChild(oBox);
var oPic=document.createElement('div');
oPic.className='pic';
oBox.appendChild(oPic);
var oImg=document.createElement('img');
oPic.appendChild(oImg);
oImg.src='images/'+ dataInt.data[i].src;
}
waterFull('main','box');
}
}
}


function waterFull (parent, box) {
//把父元素为main的所有子元素取出来
var oParent = document.getElementById(parent);
var oBox = getByClass(oParent,box);
//计算每一列的列数(总宽度 / 图片宽度)
var oBoxW = oBox[0].offsetWidth; //每个盒子的宽度
var cols = Math.floor(document.documentElement.clientWidth / oBoxW);
oParent.style.cssText = 'width:' + oBoxW * cols + 'px; margin: 0 auto';
//存储所有盒子的高度
var hArr=[];
for(var i=0;i<oBox.length;i++){
if(i<cols){
hArr.push(oBox[i].offsetHeight);
}else{
minH=Math.min.apply(null,hArr);
// console.log(minH);
var index=getMinhIndex(hArr,minH);
oBox[i].style.position='absolute';
oBox[i].style.top=minH+'px';
oBox[i].style.left=oBox[index].offsetLeft+'px';
hArr[index]+=oBox[i].offsetHeight;
}
}
}


function getByClass (parent,clsname) {
var boxArr = []; //用来存储获取到的所有子元素
var oElements = parent.getElementsByTagName('*'); //*代表所有子元素
for (var i=0;i<oElements.length;i++) {
if(oElements[i].className == clsname){
boxArr.push(oElements[i]);
}
}
return boxArr;
}


function getMinhIndex (arr,val) {
for(var i in arr){
if(arr[i] == val){
return i;
}
}
}


function checkScrollSide () {
var oParent=document.getElementById("main")
var oBox=getByClass(oParent,'box');
var lastBoxH=oBox[oBox.length-1].offsetTop+Math.floor(oBox[oBox.length-1].offsetHeight/2);
var oscrollTop=document.body.scrollTop || document.documentElement.scrollTop;
var oclientHeight=document.body.clientHeight || document.documentElement.clientHeight;
return (lastBoxH<oscrollTop+oclientHeight)? true : false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现瀑布布局的方法有很多种,这里介绍一种使用Vue2封装瀑布组件的方法。 首先,我们需要引入一个瀑布插件。这里推荐使用Masonry.js(https://masonry.desandro.com/)。通过npm安装: ``` npm install masonry-layout ``` 然后在Vue组件中引入并初始化Masonry: ```javascript import Masonry from 'masonry-layout'; export default { name: 'WaterfallFlow', mounted () { this.masonry = new Masonry('.waterfall-flow', { itemSelector: '.waterfall-flow-item', columnWidth: 200, // 每列的宽度 gutter: 10, // 列与列之间的间距 fitWidth: true // 是否自适应容器宽度 }); }, methods: { reload () { this.masonry.reloadItems(); this.masonry.layout(); } } } ``` 接下来,我们需要在模板中渲染出瀑布的布局。这里我们可以使用`v-for`指令来循环渲染出每个瀑布项,并使用`ref`指令来获取瀑布容器的DOM对象: ```html <template> <div class="waterfall-flow" ref="waterfallFlow"> <div class="waterfall-flow-item" v-for="(item, index) in items" :key="index"> <!-- 瀑布项的内容 --> </div> </div> </template> ``` 最后,我们需要在组件中监听窗口大小的变化,并在变化时重新布局瀑布。这里我们可以使用`window.resize`事件来监听窗口大小的变化,并在事件回调中调用`reload`方法重新布局瀑布: ```javascript export default { name: 'WaterfallFlow', mounted () { // 初始化瀑布 this.masonry = new Masonry('.waterfall-flow', { itemSelector: '.waterfall-flow-item', columnWidth: 200, gutter: 10, fitWidth: true }); // 监听窗口大小变化 window.addEventListener('resize', this.reload); }, beforeDestroy () { // 销毁瀑布 this.masonry.destroy(); // 移除窗口大小变化监听 window.removeEventListener('resize', this.reload); }, methods: { reload () { // 重新布局瀑布 this.masonry.reloadItems(); this.masonry.layout(); } } } ``` 这样就完成了一个简单的Vue2瀑布组件的封装。完整代码如下: ```html <template> <div class="waterfall-flow" ref="waterfallFlow"> <div class="waterfall-flow-item" v-for="(item, index) in items" :key="index"> <!-- 瀑布项的内容 --> </div> </div> </template> <script> import Masonry from 'masonry-layout'; export default { name: 'WaterfallFlow', props: { items: { type: Array, default: () => [] } }, mounted () { // 初始化瀑布 this.masonry = new Masonry('.waterfall-flow', { itemSelector: '.waterfall-flow-item', columnWidth: 200, gutter: 10, fitWidth: true }); // 监听窗口大小变化 window.addEventListener('resize', this.reload); }, beforeDestroy () { // 销毁瀑布 this.masonry.destroy(); // 移除窗口大小变化监听 window.removeEventListener('resize', this.reload); }, methods: { reload () { // 重新布局瀑布 this.masonry.reloadItems(); this.masonry.layout(); } } } </script> <style scoped> .waterfall-flow { width: 100%; } .waterfall-flow-item { width: 100%; margin-bottom: 10px; } </style> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值