原理:AJAX动态加载数据库中图片信息给游览器,利用2个叠词div动态修改内部图片透明度做出淡进淡出效果。(IE6无效)

难点:json数组操作。

HTML:就是几个图片容器。加载大图的div position: absolute;



<body>
    <!--小图-->
    <div id="thumbs">
    <div id="lastthumbs"></div>
    <div id="thumbsnav"></div>
    <div id="nextthumbs"></div></div>
    <!--大图-->
    <div id="photo">
        <div id="lastphoto"></div>
        <div id="photocontent"><div id="below"><img alt="lidy" src="#"/></div><div id="above"><img alt="lidy" src="#"/>
        </div><div id="msg"><p>得瑟得瑟</p><input type="button" value="确定" onclick="msg(0)"/></div><ul><li></li><li></li></ul></div>
        <div id="nextphoto"></div>
    </div>
</body>



CSS:加载大图的div position: absolute;




jQuery 横向导航菜单 jquery导航条_ViewUI

jQuery 横向导航菜单 jquery导航条_json_02

View Code


<style type="text/css">
        body {
            text-align: center;
            margin: 0px auto;
        }
        /*小图*/
        #lastthumbs {
            float: left;
            margin-top:20px;
            width:22px;
            height:50px;
            cursor: pointer;
            background:url(images/icon_2.png) no-repeat -179px -181px;
        }
        #thumbsnav {
            float: left;
            margin-left:10px;
        }
         #thumbsnav span {
                cursor: pointer;
            }
        #nextthumbs {
            float:right;
            margin-top:20px;
            width:22px;
            height:50px;
            cursor: pointer;
            background:url(images/icon_2.png) no-repeat -197px -181px;
        }          
        #thumbs {
            margin: 20px auto;
            width: 1020px;
            height: 80px;
        }
            #thumbs span {
                border: 2px solid red;
                margin-left:10px;
                display:inline-block;
                height: 80px;
            } 
        /*大图*/
        #photo {
            clear:both;
            margin: 0px auto;
            width: 1000px;
            height:600px;
        }
            #photo div {
                height:500px;
            }
        #lastphoto {
         margin-top:50px;
         float:left;
         width:100px;
         height:350px !important;
         cursor:pointer;
         background:url(images/icon_2.png) no-repeat -295px 0px;   
        }
        #nextphoto {
         margin-top:50px;
         float:left;
         width:100px;
          height:350px !important;
         cursor:pointer;
          background:url(images/icon_2.png) no-repeat -408px 0px;      
        }
        #photocontent {
           float:left;
           width:800px;
           position:relative;
        }
            #photocontent ul {
                list-style-type: none;
                margin-top:460px;
            }
        #below {
            position: absolute;
            width:800px;
              left:0px;
            top:0px;
        }
        #above {
            position: absolute;
            width:800px;
            left:0px;
            top:0px;
        }
        /*提示消息*/
        #msg {
            position: absolute;
            display:none;
            top:200px;
            left:350px;
            border:2px solid #888;
            height:90px !important;
            background-color:white;
        }
    </style>



JS :看代码




jQuery 横向导航菜单 jquery导航条_ViewUI

jQuery 横向导航菜单 jquery导航条_json_02

View Code


var num = 0; //当前图片
        var link = 0; //当前滚动条序号
        var btnstop = true; //按钮
        var datas; //json数据
        var count; //图片总数
        function photoload(index) { //图片加载
            if (btnstop) { //防止多次点击
                btnstop = false;
                $("#below img").attr("src", datas[num].photo_url); //当前图片到下层
                num = index; //更新当前索引
                var objImagePreloader = new Image();
                objImagePreloader.onload = function () { //当图片加载完成时
                    $("#above img").css("opacity", "0"); //先隐藏上层图片
                    $('#above img').attr('src', datas[index].photo_url); //设置下载好的图片到上层
                    $("#photocontent ul li:eq(0)").html("地点:" + datas[index].photo_source); 
                    $("#photocontent ul li:eq(1)").html("介绍:" + datas[index].photo_info); //介绍
                    $("#above img").animate({ //上层图片淡进
                        opacity: 1.0
                    }, 1500, function () {
                        btnstop = true;  // 动画完成
                    });
                    $("#below img").animate("opacity", "0", 1500); //下层图片淡出
                }
                objImagePreloader.src = datas[index].photo_url; //要加载的图片的地址
            }
        }

        function nextthumbs() { //下一组小图片加载
            if (link < parseInt(count / 7)) { //判定是否超出总数
                link++;
                $.post("photo.ashx", { "num": link }, //异步请求下一组图片地址
                      function (data) {
                          datas = datas.concat($.parseJSON(data)); //合并当前的数据和加载的数据
                          var img = $("#thumbsnav img"); //获取小图片DOM对象
                          for (i = link * 7; i < (link + 1) * 7; i++) { //遍历新数据,取出设置小图地址
                              if (i < count) { //判定是否超出总数
                                  var purl = datas[i].photo_url.split("/"); //取出来的是大图地址,小图地址要加上thumbs文件夹
                                  img[i % 7].index = i;
                                  img[i % 7].src = purl[0] + "/thumbs/" + purl[1];
                                  img[i % 7].onclick = function () { //设置新的点击事件的图片索引
                                      photoload(this.index);
                                  };
                              }
                              else { //已到最后
                                  img[i % 7].src = "images/thumbs/1.gif";
                              }
                          }
                      })
            }
            else {
                msg(2);
            }
        }

        function lastthumbs(){ //上一组图片,不需要加载了。
                if (link > 0) {
                    link--;
                    var img = $("#thumbsnav img");
                    for (i = link * 7; i < (link + 1) * 7; i++) { //遍历新数据,取出设置小图地址
                        var purl = datas[i].photo_url.split("/");
                        img[i % 7].index = i; //设置索引
                        img[i % 7].src = purl[0] + "/thumbs/" + purl[1];
                        img[i % 7].onclick = function () { //设置新的点击事件的图片索引
                            photoload(this.index);
                        };
                    }
                }
            }

        function nextphoto() {  //加载下一张图片
            $("#below img").attr("src", datas[num].photo_url); //当前图片到下面的元素
            num++;
            var objImagePreloader = new Image(); //图片加载对象
            objImagePreloader.onload = function () { //图片加载完成
                $("#above img").css("opacity", "0"); //上层图片隐藏
                $('#above img').attr('src', datas[num].photo_url); //设置加载好的地址
                $("#photocontent ul li:eq(0)").html("地点:" + datas[num].photo_source);
                $("#photocontent ul li:eq(1)").html("介绍:" + datas[num].photo_info); //介绍
                $("#above img").animate({  //慢慢显示
                    opacity: 1.0
                }, 1500, function () {
                    btnstop = true;  // 动画完成
                });
                $("#below img").animate("opacity", "0", 1500); //慢慢隐藏
            }
            objImagePreloader.src = datas[num].photo_url; //加载图片的地址
        }

        function lastphoto() { //加载上一张图片
            $("#below img").attr("src", datas[num].photo_url);
            num--;
            var objImagePreloader = new Image();
            objImagePreloader.onload = function () { //图片加载完成
                $("#above img").css("opacity", "0");
                $('#above img').attr('src', datas[num].photo_url);
                $("#photocontent ul li:eq(0)").html("地点:" + datas[num].photo_source);
                $("#photocontent ul li:eq(1)").html("介绍:" + datas[num].photo_info);
                $("#above img").animate({ 
                    opacity: 1.0
                }, 1500, function () {
                    btnstop = true; // 动画完成,按钮启用
                });
                $("#below img").animate("opacity", "0", 1500); //淡出
            }
            objImagePreloader.src = datas[num].photo_url; //加载图片的地址
        }

        function msg(index) { //窗口消息
            $("#msg").css("display", "block");
            if (index == 0) {
                $("#msg").css("display", "none");
            }
            else if (index == 1) {
                $("#msg p").html("已到第一张图片");
                setTimeout(function () { $("#msg").css("display", "none"); }, 5000);
            }
            else {
                $("#msg p").html("已到最后一张图片");
                setTimeout(function () { $("#msg").css("display", "none"); }, 5000);
            }
        }
        $(document).ready(function () {//这里最好不要用$()取代
            if (count == null) { //第一次加载
                $.post("photo.ashx", { "count": 0 }, function (data) { //获取总的数量
                    count = parseInt(data);
                });
            }
            $.post("photo.ashx", { "num": "0" }, //请求第一组图片数据
                function (data) {
                    datas = $.parseJSON(data); //实例化json
                    $("#above img").attr("src", datas[num].photo_url); //开始显示的图片地址
                    $("#photocontent ul li:eq(0)").html("地点:" + datas[num].photo_source);
                    $("#photocontent ul li:eq(1)").html("介绍:" + datas[num].photo_info); //开始显示的图片介绍
                    var thumbs = $("#thumbsnav");//小图Dom
                    for (i = 0; i < 7; i++) { //遍历第一组小图加载地址
                        var purl = datas[i].photo_url.split("/");
                        var span = "<span><img οnclick='photoload("+i+")' alt='lidy' src='" + purl[0] + "/thumbs/" + purl[1] + "' /></span>";
                        thumbs.append(span); //加入Dom
                    }
                }
            );

            $("#nextthumbs").click(function () { //下一组小图
                nextthumbs();
            });

            $("#lastthumbs").click(function () { //上一组小图
                lastthumbs();
            }
                );

            $("#nextphoto").click(function () { //下一幅图片
                if (btnstop) { //防止多次点击
                    if (num < count - 1) { //判定超出总数 
                        btnstop = false;                      
                        if (parseInt((num + 1) / 7) > link) { //超出当前的7张图片的话,要更新小图
                            link++; //累加小图轮数
                            $.post("photo.ashx", { "num": link }, //请求下一组图片数据
                                  function (data) {
                                      datas = datas.concat($.parseJSON(data)); //合并到现在的数据
                                      nextphoto(); //加载下一轮大图了
                                      var img = $("#thumbsnav img");
                                      for (i = link * 7; i < (link + 1) * 7; i++) { //遍历显示下一组的小图
                                          if (i < count) { //判定最后几张图不满7张的话
                                              var purl = datas[i].photo_url.split("/");
                                              img[i % 7].index = i;
                                              img[i % 7].src = purl[0] + "/thumbs/" + purl[1];
                                              img[i % 7].onclick = function () { //更新点击事件图片地址索引
                                                  photoload(this.index);
                                              };
                                          }
                                          else { //显示其他的图片
                                              img[i % 7].src = "images/thumbs/1.gif";
                                          }
                                      }
                                  })
                        }
                        else {
                            nextphoto(); //如果不用加载下一组图片
                        }
                    }
                    else {
                        $("#msg").css("display", "block");
                    }
                }
            })

            $("#lastphoto").click(function () { //加载上一张大图
                if (btnstop) {
                    if (num > 0) { //如果不是第一张
                        btnstop = false;
                        if (parseInt((num - 1) / 7) < link) {  //如果是这组的第一张,要加载上一组的小图片
                            lastthumbs(); //加载上一组小图片
                        }
                        lastphoto();//加载上一张图片
                    }
                    else {
                        msg(1); //第一张图片显示提示
                    }
                }
            })
        })



后台处理程序photo.ashx:(请求json数据和图片总数)




jQuery 横向导航菜单 jquery导航条_ViewUI

jQuery 横向导航菜单 jquery导航条_json_02

View Code


public void ProcessRequest(HttpContext context)
    {
        string num = context.Request["num"];
        int inum;
        if (num != null)
        {
            if (int.TryParse(num, out inum))
            {
                SqlParameter[] sqlp = new SqlParameter[]{ //获取7行数据
                new SqlParameter("@min",SqlDbType.Int),
                new SqlParameter("@max",SqlDbType.Int)
                };
                sqlp[0].Value = inum*7;
                sqlp[1].Value = (inum+1)*7;
                DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, "proc_photolinks", sqlp);
                context.Response.Write(Dataset2Json(ds)); //转成Json
            }
            else
            {             
                context.Response.Write("h");
            }
        }
        else if (context.Request["count"]!=null)
        {
            context.Response.Write(SqlHelper.ExecuteScalar(SqlHelper.connectionString, "proc_photocount").ToString());
        }
        else{
            
        }
    }
    
    public static string Dataset2Json(System.Data.DataSet ds)
    {
        StringBuilder json = new StringBuilder();
        json.Append("[");
        foreach (System.Data.DataTable dt in ds.Tables)
        {
            json.Append(DataTable2Json(dt));
            json.Append(",");
        }
        json.Remove(json.Length - 1, 1);
        json.Append("]");
        return json.ToString();
    }
    public static string DataTable2Json(System.Data.DataTable dt)
    {
        StringBuilder jsonBuilder = new StringBuilder();
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            jsonBuilder.Append("{");
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                jsonBuilder.Append("\"");
                jsonBuilder.Append(dt.Columns[j].ColumnName);
                jsonBuilder.Append("\":\"");
                jsonBuilder.Append(dt.Rows[i][j].ToString().Replace("\"", "\\\"").Trim()); //对于特殊字符,还应该进行特别的处理。 
                jsonBuilder.Append("\",");
            }
            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            jsonBuilder.Append("},");
        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        return jsonBuilder.ToString();
    } 
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }



思路:加载好网页元素后异步请求一组图片数据操作显示,后每需要加载新的一组图片再异步请求数据库获取新的图片地址(和分页差不多,可以减小数据库压力),

再动态加载到页面上。主要是图片变换的逻辑JS代码和Json数据的处理。