整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下。

该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击图片放大、上下切换效果。HTML布局写的很简单,图片加载主要是在JS中通过访问自定义的JSON字符串来实现。
动态瀑布流的原理简单理解就是把新需要加载的图片放在上一排总高度最小的图片或模块下面,实现参差不齐的多栏布局效果。
具体效果如下:

做这个案例我用了之前自己封装的框架,所以小伙伴需要到我的另一篇文章里面自己下载,链接:https://www.cnblogs.com/xyyl/p/10912037.html

**HTML代码:**

<template id="temp"><div><figure><img src="{{img}}"><p>{{info}}</p></figure></div>
</template>
<template id="temp1"><img src="{{src}}"><p>{{info}}</p><aside><a href="##" class="prev">上一张</a><a href="##" class="next">下一张</a></aside>
</template>
<section id="box" class="box"></section>
<div id="show_big" class="show_big"><img src="data:images/w_1.jpg"><p id="txt">这是详细内容</p><aside><a href="##" class="pre">上一张</a><a href="##" class="next">下一张</a></aside>
</div>
<div class="mask" id="mask"></div>
<span id="show" class="show"></span>

  

**css代码:**

*{
margin: 0;
padding: 0;
}
section.box{
margin: 0 auto;
position: relative;
font-size: 0;//行块取消间距
}
section.box div{
width: 200px;
padding: 14px 7px 0;
box-sizing: border-box;
/*float: left;*/display: inline-block;
vertical-align: top;
}
section.box div figure{
border: 1px #cccccc solid;
border-radius: 4px;
padding: 10px;
box-shadow: 0 0 3px 1px rgba(0,0,0,.1);
}
section.box div figure img{
width: 100%;
}
section.box div figure p{
font-size: 16px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
span.show{
position: fixed;
bottom: 0;
}
div.show_big{
background-color: #f2f2f2;
border-radius: 4px;
position: fixed;
padding: 10px;
top: 50px;
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);
display: none;
z-index: 100;
}
div.mask{
content: '';
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(101, 101, 101, 0.28);
display: none;
}
div.show_big img{
border-radius: 3px;
}
div.show_big p{
font-size: 13px;
color: #666666;
text-indent: 2em;
line-height: 17px;
margin-bottom: 10px;overflow : hidden;/*多行文本省略号*/
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
div.show_big aside{
display: flex;
justify-content: space-around;
}
div.show_big a{
display: inline-block;
padding: 5px 13px;
background-color: #318fff;
color: white;
line-height: 17px;
text-decoration: none;
border-radius: 2px;
}

  

**JS代码:**

var data=[{src:'images/w_1.jpg',info:'描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容描述内容'},{src:'images/w_2.jpg',info:'描述内容'},{src:'images/w_3.jpg',info:'描述内容'},{src:'images/w_4.jpg',info:'描述内容'},{src:'images/w_5.jpg',info:'描述内容'},{src:'images/w_6.jpg',info:'描述内容'},{src:'images/w_7.jpg',info:'描述内容'},{src:'images/w_8.jpg',info:'描述内容'},{src:'images/w_9.jpg',info:'描述内容'},{src:'images/w_10.jpg',info:'描述内容'},{src:'images/w_11.jpg',info:'描述内容'},{src:'images/w_17.jpg',info:'描述内容'}];var data1=[{src:'images/w_4.jpg',info:'描述内容'},{src:'images/w_5.jpg',info:'描述内容'},{src:'images/w_6.jpg',info:'描述内容'},{src:'images/w_7.jpg',info:'描述内容'},{src:'images/w_8.jpg',info:'描述内容'},{src:'images/w_9.jpg',info:'描述内容'},{src:'images/w_17.jpg',info:'描述内容'}];var json={data,data1};//这里是图片数据var img_w=200;var len;var box=sEO.$('#box');resize();function resize() {//len:每排显示的图片数目len=parseInt((window.innerWidth-17)/img_w);box.style.width=len*img_w+'px';//瀑布流总的宽度}var temp=sEO.$('#temp').innerHTML;function load_img(arr) { //动态添加图片var str='';arr.forEach(function (el,i) {str+=temp.replace('{{img}}',el.src).replace('{{info}}',el.info);});box.innerHTML+=str;}load_img(data);//自动加载图片带HTML中var divs=sEO.$('#box div');function isComplete(els,fun) {//判断图片是否全部加载完成,完成之后才执行回调函数funvar  flag=true;//设置一个标志,flag=true表示所有图片加载完成els.forEach(function (div,i) {var img=div.getElementsByTagName('img')[0];if (!img.complete)flag=false;//表示存在图片加载未完成return false;});if (flag)fun();}function water(oarr) {//瀑布流具体实现var arr=[];var timer=setInterval(function () {isComplete(oarr,function () {clearInterval(timer);oarr.forEach(function (div, i) {if (i<len){arr.push(div.offsetHeight);//把第一排div的高储存起来}else {//通过div的left和top决定div的位置var min_h=Math.min.apply(null,arr);//求上一排总高度的最小值var index=arr.indexOf(min_h);//求最小高度那一列的下标div.style.cssText=`position: absolute;left: ${index*img_w}px;top: ${arr[index]}px;`;arr[index]+=div.offsetHeight;//储存的当前添加图片的那一列的高度改变}})})},100);}water(divs);var j_len=json.length,j=1;var show=sEO.$('#show');window.οnscrοll=function () {var div_e=divs[divs.length-1];var h=div_e.offsetHeight;var top=div_e.offsetTop;if (sEO.getScroll(document).top+window.innerHeight>h/2+top){if (j<j_len){ //当最后半屏图片即将显示完时load_img(data1); //动态添加数据divs=sEO.$('#box div');water(divs);j++;}else {//当导航条滑动到最后时提示,页面到底show.innerText='我是有底线的噢';show.style.left=(window.innerWidth-show.offsetWidth)/2+'px';}}else {show.innerText='';}};divs=sEO.$('#box div');window.οnresize=function () {//浏览器窗口发生变化,瀑布流排列调整resize();water(divs)};divs.forEach(function (div,i) {//未每张图片添加自定义属性idiv.i=i;});/*到这里动态瀑布流结束,接下来是点击图片放大及上下切换效果实现*/var temp1=sEO.$('#temp1').innerHTML;var show_big=sEO.$('#show_big');var info=sEO.$('#txt');var mask=sEO.$('#mask');var index,txt,show_imgW;sEO.agent(box,'img','click',function () {//为每张图片添加事件代理show_big.style.display='block';src=this.getAttribute('src');txt=this.nextElementSibling.innerHTML;public_b();mask.style.display='block';index=this.parentNode.parentNode.i; //当前点击的图片位置});sEO.agent(show_big,'a','click',function () {//为左右图片切换按钮添加时间代理var cls=this.className;cls==='prev'?index--:index++;index=index===-1?(divs.length-1):index;/*图片循环加载*/index=index===divs.length?0:index;src=divs[index].children[0].children[0].getAttribute('src');/*点击之后图片路径*/txt=divs[index].children[0].children[1].innerHTML;/*点击之后图片描述内容*/public_b()});var show_img,max_h;function public_b() {show_big.innerHTML=temp1.replace('{{src}}',src).replace('{{info}}',txt);show_img=show_big.children[0];// var img_h=show_big.children[0].offsetHeight;max_h=window.innerHeight-140;// if (img_h>max_h)img_h=max_h;show_img.style.height=max_h+'px';show_imgW=show_big.children[0].offsetWidth;show_big.style.width=show_imgW+'px';info.style.width=show_imgW-20+'px';show_big.style.left=(window.innerWidth-show_imgW)/2+'px';show_img.οnclick=mask.οnclick=hidden;}function hidden() {show_big.style.display='';mask.style.display='';this.οnclick=null;}

  

转载于:https://www.cnblogs.com/xyyl/p/10912030.html

JS实现动态瀑布流及放大切换图片效果(js案例)相关推荐

  1. vue环境简单实现动态瀑布流效果

    vue环境简单实现动态瀑布流效果 最近开发项目需要实现动态瀑布流效果,项目本身是vue环境,网上很难找到类似的效果,vue-waterfall插件,懂的都懂.看了源码就知道不符合我项目目前的场景.(列 ...

  2. html li 做瀑布流,使用js来实现瀑布流效果

    使用js来实现瀑布流效果 瀑布流的实现方法有很多种,我这次采用的是使用绝对定位的方法来实现.页面中包含一个容器ul(设置为relative),然后所有添加的li都放在这个容器里面,li的宽度固定.在l ...

  3. 动态瀑布流网页布局 Jquery 源码

    动态瀑布流网页布局jQuery代码,效果超酷,自适应网页宽度,动态缩略图排列效果, 本代码包含两种演示效果, 一种是缩略图布局效果 一种是文字布局效果 下载地址: http://download.cs ...

  4. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)...

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

  5. jquery/原生js/css3 实现瀑布流以及下拉底部加载

    思路: style: <style type="text/css">body,html{margin: 0;padding:0;}#container{position ...

  6. 原生 JS 实现一个瀑布流插件

    更好的阅读体验,点击 原文地址 瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探 ...

  7. 瀑布流代码PHP,JS代码实现瀑布流插件

    瀑布流布局中的图片有一个核心特点-等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.本文主要和大家详细分析了一个原生JS实现瀑布流插件以及代码相关讲解,对此有 ...

  8. 流式布局之javascript实现照片瀑布流以及Macy.js插件实现瀑布流

    文章目录 瀑布流的定义 一.实现效果 代码 首先是用javascript自己手写代码实现照片瀑布流 使用插件Mary.js照片流插件实现照片瀑布流 总结 瀑布流的定义 瀑布流是什么? 1.琳琅满目:整 ...

  9. jq js css3 实现瀑布流

    css3:只是设置列宽属性  简单明了 大要实现无限下拉还是需要靠js <!doctype html> <html lang="en"> <head& ...

最新文章

  1. [JavaScript] Map类型在JavaScript中的使用
  2. hadoop作业初始化过程详解(源码分析第三篇)
  3. mynginx.conf
  4. stdafx.h的作用以及原理
  5. robo3t设置密码链接
  6. Redis-3.2主从复制与集群搭建 推荐
  7. aes密文长度_RSA加密密文可变(一句话说明)
  8. Python 机器学习 利用sklearn构建决策树的实现 2
  9. docker容器内安装ifconfig netstat ping vim 等测试工具的方法
  10. ubuntu mysql主从配置_MYSQL 主从数据库的配置 ubuntu 12.04
  11. Java基础:等待唤醒机制、线程池
  12. Xmind2021绿色版,思维导图最佳软件
  13. 计算机触摸板设置方法,笔记本触摸板设置教程详解!笔记本触控怎么打开设置...
  14. 腾讯 AI Lab招聘算法实习生
  15. 第六届信息类研究生学术论坛参赛有感
  16. java过滤器命名_Java命名目录接口(JNDI)教程
  17. 拼团商城高保真小程序Axure原型模板
  18. 精通spring4.x 非扫描_巫师财经退出b站的争议,怎样评论才能显得比较精通合同法...
  19. 安利2款好用的笔记软件给你们
  20. 两次霸面阿里终拿offer

热门文章

  1. 软件生命周期的投入比例
  2. win7系统卸载补丁包更新的解决方法【系统天地】
  3. 城市污水处理过程模型预测控制研究综述
  4. 夫妻之间签署借款协议会成立借款关系吗
  5. 暗光增强论文“Kindling the Darkness: A Practical Low-light Image Enhancer”
  6. 亚马逊自养号如何操作测评更安全?
  7. 上海注册分公司的流程
  8. 开源我的分形风暴2程序+一些漂亮的分形图
  9. B站视频开源代码flv.js的使用部署心得(代码案例应用)
  10. 如何提高gitHub下载速度