JQuery+HTML5+CSS3制作時間軸插件,支持響應式布局


 

一、效果圖預覽

                            (圖一)

 

          (圖二)

附注說明:

圖一是瀏覽器寬度像素大於560px下的展示效果,圖二是在瀏覽器寬度像素小於560px下的展現效果。使用的是CSS3的Media Query(媒體查詢)實現的效果。

另外頁面中圓形、圓角和三角同樣使用了CSS3的特殊樣式。這些基礎的樣式和效果在本文中不會贅述,不了解的童鞋可以上網搜索學習一下,很簡單。

頁面上每個時間節點的展示內容提供了三種展示樣式,多張圖片的展示風格、單張圖片的展示風格和無圖片的展示風格。這些可以根據自己的需求自己更改。

二、分析頁面布局思路

  頁面的布局其實主要就是將外層的容器使用相對定位,容器內的元素使用絕對定位即可。具體的分析請看下圖

依照圖片上的分析就可以達到時間軸插件的布局展示效果。

布局好了之后,我們就可以添加我們需要展現的內容了。為了頁面不那么單調,可以使用JQuery的animate函數添加一些效果,比如可以讓左側的節點從頁面左側滑入頁面,右側節點從頁面右側滑入頁面。代碼簡單,稍后貼出。

三、加入滾動觸發事件機制,動態加載時間節點

在時間節點較多的情況下,一般情況下比如一個公司的發展歷程和重大記事都不太可能只有三、五條信息吧,隨着時間的推移,值得記錄的大事件就會越多。如果一次就要讓全部的信息展示在頁面上可能會影響頁面的展示效率,用戶的體驗也不會很好。

所以,可以利用觸發滾動事件機制,每次加載固定的條數。這跟實現分頁效果是一樣的。只不過我們的觸發條件是滾動觸發。

注意事項:

1. 首次加載固定條數時,假設每次加載5條記錄,如果首次加載5條后,沒有出現滾動條,應該再次調用查詢方法,繼續加載,直到出現滾動條(否則首次加載5條后,沒有出現滾動條,以后就無法觸發滾動事件了,自然也就無法繼續查詢之后的記錄了)。

2. 觸發滾動事件,不能夠只要滾動就觸發,否則程序一直在觸發加載記錄方法,頁面可能會無法由於頻繁發送請求無法響應。解決方法,可以在滾動條滾動到頁面底部的時候再觸發加載記錄方法。

具體的判定請看代碼

CSS代碼

.timeline-container{
    width:100%;
    /*height:auto;*/
}
.timeline{
    width:100%;
    margin:auto;
    position:relative;
    height: auto;
    padding:30px 0px 0px 0px;
}
.timeline > .timeline-block{
    width:50%;
}
.timeline-block > .popover{
    max-width: 70%;
}
.timeline > .timeline-block-odd{
    float:left;
}
.timeline > .timeline-block-even{
    float:right;
}
.timeline-block-odd>.timeline-content{
    display: block;
    position:relative;
    float:right;
    margin-right:50px;
}
.timeline-block-even>.timeline-content{
    display: block;
    float:left;
    position:relative;
    margin-left:50px;
}

.timeline-content > .arrow{
    top:20px !important;
    background: #f7f7f7;
}
.timeline-content > .popover-content{
    max-height: 240px;
    overflow-y: auto;
    color: #696969;
    font-size: 11px;
}

.timeline-content>.popover-footer{
    padding:8px 14px;
    margin:0px;
    font-size: 11px;
    border-top: 1px dotted #b9b9b9;
    color: #4b4b4b;
    background:#F2F2F2;
}
.timeline img{
    border:1px solid #dddddd;
    padding:2px;
}
.timeline-img{
    width:50px;
    height:50px;
    -webkit-border-radius: 25px;
    -moz-border-radius: 25px;
    -o-border-radius: 25px;
    border-radius: 25px;
    border:3px solid #A3E3E8;
    margin:auto;
    background: #ffffff;
    position:absolute;
    z-index: 9;
    left:50%;
    margin-left:-25px;
    background: url(../../indexImg/greeneye.jpg);
    background-size: cover;
}

.timeline-line{
    width:4px;
    height:100%;
    background: #aef0f5;
    position:absolute;
    z-index:8;
    left:50%;
    border-left:1px solid #aef0f5;
    border-right:1px solid #ffffff;
    margin-left: -2px;
    margin-top:-30px;
}

.timeline-block-odd>.popover.left>.arrow:after {
    right: 2px;
    border-left-color: #F7F7F7;
}
.timeline-block-even>.popover.right>.arrow:after {
    left: 2px;
    border-right-color: #F7F7F7;
}



/** mediaquery查詢樣式 **/
@media screen and (max-width: 560px){

    .timeline{
        width:100%;
        position:relative;
        height: auto;
        padding:30px 0px 0px 0px;
    }
    .timeline > .timeline-block{
        width:100%;
    }
    .timeline > .timeline-block-odd{
        float:right;
    }
    .timeline-block-odd>.timeline-content{
        display: block;
        position:relative;
        float:left;
        margin-left:75px;
    }
    .timeline-block-even>.timeline-content{
        display: block;
        position:relative;
        float:left;
        margin-left:75px;
    }

    .timeline-block-odd>.popover>.arrow, .timeline-block-odd>.popover>.arrow:after {
        position: absolute;
        display: block;
        width: 0;
        height: 0;
        border-color: transparent;
        border-style: solid;
    }
    .timeline-block-odd>.popover.left>.arrow {
        left: -21px;
        bottom: -10px;
        content: " ";
        border-left-width: 0;
        border-right-color: #999;
        border-width: 10px;
    }

    .timeline-block-odd>.popover.left>.arrow:after {
        left:1px;
        right: 1px;
        bottom: -10px;
        content: " ";
        border-left-width: 0;
        border-right-color: #fff;
    }
    .timeline-block-odd>.popover>.arrow:after {
        content: "";
        border-width: 10px;
    }

    .timeline-img{
        width:50px;
        height:50px;
        margin:auto;
        background: #ffffff;
        -webkit-border-radius: 25px;
        -moz-border-radius: 25px;
        -o-border-radius: 25px;
        border-radius: 25px;
        border:3px solid #8e8e8e;
        position:absolute;
        z-index: 9;
        left:0;
        margin-left:0px;
    }

    .timeline-line{
        width:4px;
        height:100%;
        background: #d0d0d0;
        border-left:1px solid #ececec;
        border-right:1px solid #ececec;
        position:absolute;
        z-index:8;
        left:0;
        margin-left: 24px;
        margin-top:-30px;
    }


}

 

JQuery代碼

$(function(){
    var _timeline_row_ = $("<div></div>").addClass("row");
    $(".timeline-container").append(_timeline_row_);
    var loadData=function(){
        $.getJSON("timeline.json", function (data) {
            $.each(data, function (i, tl) {
                var _timeline_ = $("<div></div>").addClass("timeline");
                _timeline_row_.append(_timeline_);

                var _time_block_ = $("<div></div>").addClass("timeline-block");
                var _time_content_ = $("<div></div>").addClass("popover timeline-content");
                _time_block_.append(_time_content_);
                /**
                 * 設置顯示內容
                 */

                var _popover_title_ = $("<h3></h3>").addClass("popover-title").text(tl["diagTime"]);
                var _popover_footer_ = $("<div></div>").addClass("popover-footer").text(tl["result"]);
                var _popover_content_ = $("<div></div>").addClass("popover-content");
                _time_content_.append($("<div></div>").addClass("arrow"))
                    .append(_popover_title_)
                    .append(_popover_content_)
                    .append(_popover_footer_);
                /**
                 * 主頁展示內容布局
                 */

                if (tl["images"].length > 1 && tl["images"] != "" && tl["images"] != null && tl["images"] != "undefined") {
                    var _img_container_ = $("<div></div>").css("margin-bottom", "10px");
                    var _table_container_ = $("<table></table>").addClass("table table-bordered table-condensed");
                    for (var m = 0; m < tl["images"].length; m++) {
                        _img_container_.append($("<img/>").attr("src", tl["images"][m]).css({"width":"60px","height":"60px","margin-right":"10px"}));
                    }
                    _popover_content_.append(_img_container_);
                    _table_container_.append($("<tr></tr>")
                            .append($("<td nowrap></td>").text("眼象特征"))
                            .append($("<td></td>").text(tl["feature"]))
                    );

                    _table_container_.append($("<tr></tr>")
                            .append($("<td nowrap></td>").text("匹配結果"))
                            .append($("<td></td>").text(tl["matchList"]))
                    );

                    _table_container_.append($("<tr></tr>")
                            .append($("<td nowrap></td>").text("結論說明"))
                            .append($("<td></td>").text(tl["desc"]))
                    );

                    _popover_content_.append(_img_container_).append(_table_container_);

                } else if (tl["images"].length == 1 && tl["images"] != "" && tl["images"] != null && tl["images"] != "undefined") {
                    var _img_container_ = $("<div></div>")
                        .addClass("pull-left")
                        .append($("<img/>").attr("src",tl["images"][0]).css({"margin": "5px 10px","width": "100px", "height": "100px"}));
                    var _text_container_ = $("<p></p>").css({"margin-left": "10px", "margin-top": "5px", "font-size": "12px"})
                        .append("眼象特征: " + tl["feature"]).append("<br/>")
                        .append("匹配結果: " + tl["matchList"]).append("<br/>")
                        .append("結論說明: " + tl["desc"]).append("<br/>");
                    _popover_content_.append(_img_container_).append(_text_container_);
                } else if (tl["images"].length < 1 || tl["images"] == "" || tl["images"] == null || tl["images"] == "undefined") {
                    var _text_container_ = $("<p></p>").css({"margin-left": "10px", "margin-top": "5px", "font-size": "12px"})
                        .append("眼象特征: " + tl["feature"]).append("<br/>")
                        .append("匹配結果: " + tl["matchList"]).append("<br/>")
                        .append("結論說明: " + tl["desc"]).append("<br/>");
                    _popover_content_.append(_img_container_).append(_text_container_);
                }

                $(_timeline_).append(_time_block_)
                    .append($("<div></div>").addClass("timeline-img"))
                    .append($("<div></div>").addClass("timeline-line"))
                    .append($("<div></div>").addClass("clearfix"));
                if ($(_timeline_).prev().find(".timeline-block").hasClass("timeline-block-odd")) {
                    $(_timeline_).find(".timeline-block").addClass("timeline-block-even");
                    $(_timeline_).find(".timeline-block-even>.timeline-content").addClass("right").css({"left": "150px"});
                } else {
                    $(_timeline_).find(".timeline-block").addClass("timeline-block-odd");
                    $(_timeline_).find(".timeline-block-odd>.timeline-content").addClass("left").css({"left": "-150px"});
                }
                $(_timeline_).find(".timeline-block>.timeline-content").animate({
                    left: "0px"
                }, 1000);
            });
            if($(window).height()>=document.documentElement.scrollHeight){
                //沒有出現滾動條,繼續加載下一頁
                loadData();
            }

        });


    }

    var tcScroll=function(){
        $(window).on('scroll', function () {
            var scrollTop = $(this).scrollTop();
            var scrollHeight = $(document).height();
            var windowHeight = $(this).height();
            if (scrollTop + windowHeight == scrollHeight) {
                //此處是滾動條到底部時候觸發的事件,在這里寫要加載的數據,或者是拉動滾動條的操作
                loadData();
            }
        })
    }
    loadData();
    tcScroll();

});

總結一下:

1. 本文偏重在時間軸的布局設置分析,主要是通過外層容器的相對定位和內層元素的絕對定位實現布局效果。

2. 觸發滾動事件機制,達到類似分頁的加載效果。在觸發滾動事件是要保證邏輯的嚴謹性。

  比較久之前寫的Demo了,Jquery插件寫的不是很好,和CSS樣式混雜在一起,也沒有將其單獨提取出來。不過作為分享學習使用還是可以的。正式開發的時候,不要像我這么寫JS。呵~。

  最后,依舊是感謝閱讀。

 

  附加html片段和json文件格式。具體的圖片等路徑請自行調整

  html片段:

<div class="timeline-container"></div>

  json格式文件:

[
    {
    "id":1,
    "userNo":"user0001",
    "diagTime":"2015/07/14 11:00",
    "diagDoc":"李醫生",
    "feature":"通過圖像識別獲得的眼象特征",
    "matchList":"知識庫自動獲取的病證信息",
    "result":"根據病證信息獲得的綜合分析結果",
    "desc":"\n\t對綜合結論進\n\t\t\t  行的詳細描述,其中可能包括眼象說明、病證分析、相關疾病說明、診療方法等。",
    "images":[
        "01.jpg",
        "02.jpg",
        "03.jpg"
    ],
    "ctime":"2014-07-13",
    "utime":""
    },
    {
        "id":2,
        "userNo":"user0001",
        "diagTime":"2015/07/14 16:00",
        "diagDoc":"王醫生",
        "feature":"通過圖像識別獲得的眼象特征",
        "matchList":"",
        "result":"根據病證信息獲得的綜合分析結果",
        "desc":"對綜合結論進行的詳細描述,其中可能包括眼象說明、病證分析、相關疾病說明、診療方法等。",
        "images":[
            "01.jpg"
        ],
        "ctime":"2014-07-13",
        "utime":""
    },
    {
        "id":3,
        "userNo":"user0001",
        "diagTime":"2015/07/15 14:00",
        "diagDoc":"王醫生",
        "feature":"通過圖像識別獲得的眼象特征",
        "matchList":"",
        "result":"根據病證信息獲得的綜合分析結果",
        "desc":"對綜合結論進行的詳細描述,其中可能包括眼象說明、病證分析、相關疾病說明、診療方法等。",
        "images":"",
        "ctime":"2014-07-13",
        "utime":""
    },{
    "id":4,
    "userNo":"user0001",
    "diagTime":"2015/07/15 14:00",
    "diagDoc":"王醫生",
    "feature":"通過圖像識別asdfasf獲得的眼象特征",
    "matchList":"",
    "result":"根據病證信息獲得的綜合分析結果",
    "desc":"對綜合結論進行的詳細描述,其中可能包括眼象說明、病證分析、相關疾病說明、診療方法等。",
    "images":"",
    "ctime":"2014-07-13",
    "utime":""
}
]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM