1. 程式人生 > >滑動固定表格頭和列--js,html,css--移動端--基於Iscroll

滑動固定表格頭和列--js,html,css--移動端--基於Iscroll

簡單實現固定表格頭和列。

之前做了一個表格固定頭和列的,分享一下程式碼和思路。

1.滑動僅固定頭或列  

2.滑動即可固定頭,也可固定列。(滑動固定其他地方也可參考。)

1. 僅固定列,或頭。

用定位,但需注意,固定列和表格內容寬或高匹配

程式碼:

<style type="text/css">
/*(我用的單位是%,根據實際用你的單位)*/
.tableCon {
    position: relative;
    width: 100%;
}

.tableCon .tableFix {
    position: absolute;
    left: 0;
    top: 0;
    z-index: 1;
    width: 22%;
}

.tableCon .tableScr {
    margin-left: 22%;
    width: 78%;
    overflow: scroll;
    -webkit-overflow-scrolling: touch;
    /*滾動平滑*/
}
</style>
<!-- .tableFix .tableScr 高度要一致 -->
<div class="tableCon">
    <div class="tableFix">
        <table>
            <thead>
                <tr>
                    <th>標題1</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th>固定1</th>
                </tr>
                <tr>
                    <th>固定1</th>
                </tr>
                
            </tbody>
        </table>
    </div>
    <div class="tableScr">
        <table>
            <thead>
                <tr>
                    <th>標題2</th>
                    <th>標題3</th>
                    <th>標題4</th>
                    <th>標題5</th>
                    <th>標題6</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th>滑動內容1</th>
                    <th>滑動內容2</th>
                    <th>滑動內容3</th>
                    <th>滑動內容4</th>
                    <th>滑動內容5</th>
                    <th>滑動內容6</th>
                </tr>
                <tr>
                    <th>滑動內容1</th>
                    <th>滑動內容2</th>
                    <th>滑動內容3</th>
                    <th>滑動內容4</th>
                    <th>滑動內容5</th>
                    <th>滑動內容6</th>
                </tr>
            </tbody>
        </table>
    </div>
</div>
僅固定頭類似,不再列舉。

2. 既固定頭,也固定列。

用iscroll(偵聽不了移動端時時滾動距離,有延遲,固定會抖動,所以用iscroll)。

關鍵  position:relative

引用iscroll 的 iscroll-probe.js 版本。可實時偵聽滾動距離。(iscroll版本區別,檢視相關iscroll文件)

沒有封裝,需要的可以自己封裝。這裡僅提供簡單方法和思路。

程式碼:

/*固定頭和列的樣式,加背景,不然背景透明文字重疊*/
.lockrow {
    background-color: #e4e6f7;
    position: relative;
    z-index: 2;
}
.lockcol {
    background-color: #e4e6f7;
    position: relative;
    z-index: 1;
}

.lockcross {
    z-index: 3;
}

var myScroll1 = new IScroll("#ISwrapper", {
    // preventDefault:false,
    probeType: 3, //需要使用 iscroll-probe.js 才能生效 probeType : 1 滾動不繁忙的時候觸發 probeType : 2 滾動時每隔一定時間觸發 probeType : 3   每滾動一畫素觸發一次
    mouseWheel: true, //是否監聽滑鼠滾輪事件。
    scrollX: true,
    scrollY: true,
    // momentum: false,
    snap: false, //自動分割容器,用於製作走馬燈效果等。Options.snap:true// 根據容器尺寸自動分割
    //snapSpeed: 400,
    scrollbars: false, //是否顯示預設滾動條
    freeScroll: false, //主要在上下左右滾動都生效時使用,可以向任意方向滾動。
    deceleration: 0.0001, //滾動動量減速越大越快,建議不大於 0.01,預設:0.0006
    disableMouse: true, //是否關閉滑鼠事件探測。如知道執行在哪個平臺,可以開啟它來加速。
    disablePointer: true, //是否關閉指標事件探測。如知道執行在哪個平臺,可以開啟它來加速。
    disableTouch: false, //是否關閉觸控事件探測。如知道執行在哪個平臺,可以開啟它來加速。
    eventPassthrough: false, //使用 IScroll 的橫軸滾動時,如想使用系統立軸滾動並在橫軸上生效,請開啟。
    bounce: false //是否啟用彈力動畫效果,關掉可以加速
});
myScroll1.on('scroll', updatePosition);
myScroll1.on('scrollEnd', updatePosition);
myScroll1.on('beforeScrollStart', ISrefresh);

//IScroll滾動條,上左固定,需要的使用
function init_IScroll() {
    var ISwrapper = $("#ISwrapper");
    myScroll1.scrollTo(0, 0);
    myScroll1.refresh();
    ISwrapper.find(".lockrow").css({
        "top": "0px"
    });
    ISwrapper.find(".lockcol").css({
        "left": "0px"
    });
}

//重新整理IScroll,需要的使用
function ISrefresh() {
    this.refresh()
}
//IScroll 滾動時處理
function updatePosition() {
    var ISwrapper = $("#ISwrapper");

    //需要的使用
    //
    //外層 <span style="font-family: Arial, Helvetica, sans-serif;">.container </span>加個超出滾動overfow:scroll
    //外層滾動到一定距離開始滾動
	// var parent_container = ISwrapper.parents(".container");
	// var baseScTop = 130;
	// if (this.directionX == 0 && this.directionY < 0 && this.y >= 0) {
	//     parent_container.scrollTop(0);
	// } else if (this.directionX == 0 && this.directionY > 0 && this.y <= 0) {
	//     parent_container.scrollTop(baseScTop);
	// } else if (this.directionX == 0 && this.directionY == 0 && this.y == 0) { //列表少時>container高度,滑動不了
	//     if (this.distY > 0) {
	//         parent_container.scrollTop(0);
	//     } else {
	//         parent_container.scrollTop(baseScTop);
	//     }
	// }

    ISwrapper.find(".lockrow").css({
        "top": -1 * this.y + "px"
    });
    ISwrapper.find(".lockcol").css({
        "left": -1 * this.x + "px"
    });
}

<div id="ISwrapper">
    <div class="tableCon" style="width: 800px; height: 800px;">
        <table class="table1 IStable">
            <colgroup>
                <col width="200" />
                <col width="200" />
                <col width="200" />
                <col width="200" />
            </colgroup>
            <thead>
                <tr>
                    <th class="lockrow lockcol lockcross">固定頭列</th>
                    <th class="lockrow">固定頭</th>
                    <th class="lockrow">固定頭</th>
                    <th class="lockrow">固定頭</th>
                    <th class="lockrow">固定頭</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td class="lockcol">固定列</td><td>內容</td><td>內容</td><td>內容</td>
                </tr>
                <tr>
                    <td class="lockcol">固定列</td><td>內容</td><td>內容</td><td>內容</td>
                </tr>
                <tr>
                    <td class="lockcol">固定列</td><td>內容</td><td>內容</td><td>內容</td>
                </tr>
                <tr>
                    <td class="lockcol">固定列</td><td>內容</td><td>內容</td><td>內容</td>
                </tr>
                <tr>
                    <td class="lockcol">固定列</td><td>內容</td><td>內容</td><td>內容</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

謝謝,我的第一篇部落格,寫的不好,多多指正,有更好的方法可以留言。