博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿pinterest实现瀑布流布局效果
阅读量:6324 次
发布时间:2019-06-22

本文共 4883 字,大约阅读时间需要 16 分钟。

在张鑫旭的博客里,有一片文章介绍 实现的文章,(要查看演示,请单击)本文是在其基础上进行的二次开发,使其更具实用性。

 

 

这里,主要涉及数据从数据库里读取,单击图片可以缩放等。

本文附件附带的源代码,有兴趣可以下载看看

下载的程序打开pic.aspx页面显示图片列表(您需要手动输入测试数据)。

 

单击图片会出现缩放等,除此外,还可以分页,(排序),以及设置页面大小等。

 

 

 下面介绍本程序的大致实现。

 

 

1.建立数据库

见附件里SQL.txt,为了使得效果更明显,需要输入测试数据,越多越好

 

2.返回JSON数据 (ajax_getpics.aspx 页面)

 

返回数据使用了自定义分页,这里使用了SQL2005+上的Row_Number()函数。在GetData里,还有3个参数:orderby设置数据排序方式(一般网站的图片,都会让用户按照最新上传,点击率,回复率排序),预留这个参数就是为了解决这个问题。

pageIndex是通过传递的URL来获取的,也就是用户访问了第几页

pageSize设置页面的大小,在本演示中,设置了200.

public DataTable GetData()        {            string orderBy = "pic_id";            int pageIndex = int.Parse(Request["pageIndex"]);            int pageSize = int.Parse(Request["pageSize"]);            string sql = @"declare @startRowIndex int set @pageIndex=@pageIndex-1 set @startRowIndex=@pageIndex*@pageSize+1;WITH PICList AS(   select pic_id,user_id,orginpath,description,thumpath, commpeople,  click,  ROW_NUMBER() OVER (ORDER BY pic_id DESC) as RowNum    FROM    love_pics where isapproved=1)   Select * from  PICList WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @pageSize-1)  order by " + orderBy + @" desc " ;            DataTable ds = new DataTable();            SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["con"].ConnectionString);            SqlCommand dCmd = new SqlCommand();            dCmd.Parameters.AddWithValue("@pageIndex", pageIndex);            dCmd.Parameters.AddWithValue("@pageSize", pageSize);            dCmd.Parameters.AddWithValue("@orderBy", orderBy);            dCmd.CommandText = sql;            dCmd.Connection = conn;            SqlDataAdapter da = new SqlDataAdapter();            da.SelectCommand = dCmd;            da.Fill(ds);            return ds;        }

 

 

3.制作瀑布页面 pic.aspx

在开始前,我们先定义一个页面大小pageSize和自定义分页的实现。关于Pagination可以参考源代码里具体实现。

public int pageindex = 1;    protected void Page_Load(object sender, EventArgs e)    {        if (!string.IsNullOrEmpty(Request.QueryString["currentpage"]))        {            pageindex = int.Parse(Request.QueryString["currentpage"]);        }        string sql = " Select count(*) from love_pics where isapproved=1 ";                // string i = DBHelper.Instance.ExeScalar(sql).ToString();        string i = "1000";        //执行上面SQL语句,即可返回记录说,这里使用了硬编码,加上是100页               //附带的1=1只是用于演示如何自带参数        litPaging2.Text = litPaging1.Text = Pagination(int.Parse(i), 200, pageindex, "pic.aspx?1=1&");    }

 

 

4.获取JSON返回的数据,也就是用JQuery的getJSON,没设么特别的,其中pageindex是我们后台定义的页码。 后面自动跟了一个random是因为

js在请求时,即使你刷新页面,但是如果参数不变那么他自动使用本地缓存,所以加上random使得每次请求参数都是变更的

var pics=new Array() var ids=new Array(); var intros=new Array();  var uids=new Array(); var clicks=new Array();var comms=new Array();                $.getJSON(             'ajax_getpics.aspx',              { pageIndex: <%=pageindex%>, PageSize: "200", random: Math.random() },         function (data) {              $.each(data, function (i, entry) {                           pics[i]=entry['orginpath'];               ids[i]=entry["pic_id"];               intros[i]=entry["description"];               uids[i]=entry["user_id"];               clicks[i]=entry["click"];               comms[i]=entry["commpeople"];               });      //do detect

 

 瀑布页码代码,这个代码是在页码加载完毕后加载的,因为刚才说过需要增加单击图片时,弹出预览大图的效果,所以这里使用了插件

因此代码里增加了下图红色的标记

// 页面加载初始创建        create: function () {            this.columnNumber = Math.floor(document.body.clientWidth / this.columnWidth);            var start = 0, htmlColumn = '', self = this;            for (start; start < this.columnNumber; start += 1) {                htmlColumn = htmlColumn + '' +                function () {                    var html = '', i = 0;                    for (i = 0; i < 5; i += 1) {                        self.indexImage = start + self.columnNumber * i;                        var index = self.getIndex();                        html = html + '   '+self.getIntro().substring(0,50)+'  
'+self.getClick()+' click      '+ self.getComm()+' comment
'; } return html; } () + '
'; } htmlColumn += ''; this.container.innerHTML = htmlColumn; this.detectLeft = document.getElementById("waterFallDetect").offsetLeft; return this; },

 

 

当页码滚动时,动态加载图片

 

 

// 滚动载入        append: function (column) {            this.indexImage += 1;            var html = '',  index = this.getIndex(),  imgUrl = index;            // 图片尺寸            var aEle = document.createElement("div");                       aEle.className = "pic_a";            aEle.innerHTML = ' '+this.getIntro()+'';            column.appendChild(aEle);                         if (this.indexImage >= 200) {                  this.loadFinish = true;            }            return this;        },

 

这样,一个比较完成的例子就完成了。

转载地址:http://edlaa.baihongyu.com/

你可能感兴趣的文章
第十五章 springboot + pojo默认值设置
查看>>
linux grep命令
查看>>
Button MouseEvent颜色变化
查看>>
django自身提供的sitemap和feed实现样例
查看>>
Entity Framework Code First (一)Conventions
查看>>
强制使用栅格图
查看>>
P1045 麦森数
查看>>
数据结构习题之多维数组和广义表
查看>>
C# 多线程详解 Part.03 (定时器)
查看>>
register_globals使用详解
查看>>
iOS:iOS开发系列–打造自己的“美图秀秀”(上)
查看>>
数据库连接未关闭,conn与rs未关闭
查看>>
Primes on Interval(二分 + 素数打表)
查看>>
用同一个工程创建两个不同版本的应用
查看>>
js 四舍五入函数 toFixed(),小数位数精度
查看>>
zabbix 监控java程序
查看>>
【USACO 2.4】Cow Tours (最短路)
查看>>
openfire源码修改后如何打包部署到linux服务器上
查看>>
form表单提交和阻止
查看>>
mongodb 分组查询
查看>>