1.效果图
2.原生js实现瀑布流
<div id="root"> <div class="item"> <div class="itemImg"> <img src="../images/1.jpeg" alt="" /> </div> </div> <div class="item"> <div class="itemImg"> <img src="../images/3.jpeg" alt="" /> </div> </div> <div class="item"> <div class="itemImg"> <img src="../images/2.jpg" alt="" /> </div> </div> </div>
*{ margin: 0; padding: 0; } #root{ position: relative; } .item{ float: left; padding: 5px; } .itemImg{ padding: 5px; border: 1px solid #ccc; box-shadow: 0 0 5px #ccc; border-radius: 5px; } .itemImg img{ width: 230px; height: auto; }
window.onload = function () { generateImg('root', 'item'); window.addEventListener('resize', function() { generateImg('root', 'item') }); let imgData = { images: [ { "src":"23.png" }, { "src":"22.png" }, { "src":"2.jpg" }, { "src":"4.jpg" }, { "src":"7.jpg" } ] }; window.addEventListener('scroll', function() { if(checkIsScroll()) { let rootElement = document.getElementById('root'); let length = imgData.images.length; for(let i = 0; i < length; i++) { let itemElement = document.createElement('div'); itemElement.className = 'item'; rootElement.appendChild(itemElement); let itemImgElement = document.createElement('div'); itemImgElement.className = 'itemImg'; itemElement.appendChild(itemImgElement); let itemImg = document.createElement('img'); itemImg.style.cssText = 'opacity: 0; transform:scale(0)'; itemImg.src = "../images/" + imgData.images[i].src; itemImgElement.appendChild(itemImg); (function(img){ setTimeout(function(){ img.style.cssText="opacity:1;transform:scale(1)"; },1000); })(itemImg); } generateImg('root', 'item'); } }); }; function generateImg(parent, content) { let parentElement = document.getElementById(parent); let childContent = getChildElement(parentElement, content); let imgWidth = childContent[0].offsetWidth; let imgColumn = Math.floor(document.documentElement.clientWidth / imgWidth); parentElement.style.cssText = 'width:' + imgColumn * imgWidth + 'px;margin:0 auto'; let imgHeightArray = []; let length = childContent.length; for(let i = 0; i < length; i++) { if(i < imgColumn) { childContent[i].style.cssText = ''; imgHeightArray.push(childContent[i].offsetHeight); } else { let minHeight = getMinImgHeight(imgHeightArray); let minHeightIndex = getMinHeightIndex(imgHeightArray, minHeight); childContent[i].style.position = 'absolute'; childContent[i].style.top = minHeight + 'px'; childContent[i].style.left = childContent[minHeightIndex].offsetLeft + 'px'; imgHeightArray[minHeightIndex] = childContent[i].offsetHeight + minHeight; } } } function checkIsScroll() { let parentElement = document.getElementById('root'); let childContent = getChildElement(parentElement, 'item'); let lastElementHeight = childContent[childContent.length - 1].offsetTop; let scrollTopSpace = document.documentElement.scrollTop || document.body.scrollTop; let clientHeight = document.documentElement.clientHeight || document.body.clientHeight; if(lastElementHeight > scrollTopSpace + clientHeight) { return true; } } function getChildElement(parentElement, content) { let elementArray = []; let allElement = parentElement.getElementsByTagName('*'); let length = allElement.length; for (let i = 0; i < length; i++) { if (allElement[i].className === content) { elementArray.push(allElement[i]); } } return elementArray; } function getMinImgHeight(heightArray) { let length = heightArray.length; let minHeight = heightArray[0]; for(let i = 0; i < length; i++) { minHeight = Math.min(minHeight, heightArray[i]); } return minHeight; } function getMinHeightIndex(heightArray, minHeight) { let length = heightArray.length; for(let i = 0; i < length; i++) { if(heightArray[i] == minHeight) { return i; } } }
3.微信小程序中实现瀑布流
<view class="cateCommodity"> <view class="leftContainer"> <block wx:for="{{imageArray}}" wx:key="{{item.id}}"> <view class="cateItem" wx:if="{{index%2==0}}"> <view class="item"> <image src="{{item.src}}" class="itemImg" mode="widthFix"></image> <view class="title">{{item.title}}</view> </view> </view> </block> </view> <view class="rightContainer"> <block wx:for="{{imageArray}}" wx:key="{{item.id}}"> <view class="cateItem" wx:if="{{index%2==1}}"> <view class="item"> <image src="{{item.src}}" class="itemImg" mode="widthFix"></image> <view class="title">{{item.title}}</view> </view> </view> </block> </view> </view> <view class="skipTop" catchtap="skipTop" wx:if="{{showTopImage}}"> <image src="http://boweisou.oss-cn-shenzhen.aliyuncs.com/images/0/2018/11/ZBtqujbbcGjBDgjt0bbJqbTuGqq0z8.png"></image> </view>
page{ background: #f6f6f6; } .cateCommodity { display: flex; padding: 20rpx 28rpx 8rpx; box-sizing: border-box; font-size: 28rpx; } .leftContainer{ display: flex; margin-right: 22rpx; flex-direction: column; } .rightContainer{ display: flex; flex-direction: column; } .cateItem { margin-bottom: 20rpx; } .item{ padding: 20rpx 22rpx; width: 335rpx; box-sizing: border-box; background: #fff; border-radius: 6rpx; } .itemImg{ margin-bottom: 14rpx; width: 100%; vertical-align: middle; border-radius: 6rpx; } .title{ display: -webkit-box; overflow: hidden; -webkit-line-clamp: 2; -webkit-box-orient: vertical; line-height: 1.5; } .skipTop { position: fixed; bottom: 30rpx; right: 20rpx; width: 90rpx; height: 90rpx; } .skipTop image { width: 100%; height: 100%; vertical-align: middle; }
Page({ data: { imageArray: [ { id: 1, src: '../../images/avatar.jpeg', title: '现代新中式创意陶瓷简约摆件客厅家居玄关软装饰品家居酒柜盘子' }, { id: 1, src: '../../images/avatar3.jpg', title: '秋冬季新款2018休闲运动服套装女士韩版金丝绒卫衣加绒加厚两件套' }, { id: 1, src: '../../images/avatar4.jpeg', title: '女童床上用品四件套公主房1.2m床品纯棉女孩1.8儿童床单三件套1.5' }, { id: 1, src: '../../images/avatar7.jpg', title: '婴儿床圆床蚊帐落地款宝宝椭圆床蚊帐支架款儿童床蚊帐BB床小蚊帐' }, { id: 1, src: '../../images/avatar9.jpeg', title: '包邮动感158T速滑鞋轮滑鞋竞速鞋高端碳纤鞋 固定码 专业定制' }, { id: 1, src: '../../images/logo7.jpg', title: 'Infanton落地婴儿床蚊帐带支架儿童床蚊帐宝宝蚊帐婴童蚊帐' }, { id: 1, src: '../../images/logo6.jpg', title: '老A轮滑 米高seba hl碳纤版SEBA HL CARBON 平花鞋刹车鞋全能鞋' }, { id: 1, src: '../../images/logo.jpeg', title: '洋洋法代 sandro 17秋冬 一粒扣羊毛长款大衣外套EKIN M9575H' }, ], showTopImage: false, }, onPageScroll(event) { if (event.scrollTop > 300 && this.data.showTopImage == false) { this.setData({ showTopImage: true }) } else if (event.scrollTop < 300 && this.data.showTopImage == true) { this.setData({ showTopImage: false }) } }, skipTop() { wx.pageScrollTo({ scrollTop: 0, duration: 300 }); this.setData({ showTopImage: false }); }, onReachBottom: function () { let temporaryArray = this.data.imageArray; temporaryArray.push(...this.data.imageArray); this.setData({ imageArray: temporaryArray }) }, })
- 左右两列实现瀑布流其实就是对同一数组进行了两次渲染,只是把其中的一半给隐藏了
正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^) |