Javascript 我可以做什么来模拟位置:粘性?

Javascript 我可以做什么来模拟位置:粘性?,javascript,jquery,html,css,sticky,Javascript,Jquery,Html,Css,Sticky,如果您不知道位置:sticky是什么,请观看此20秒长的视频: 这个CSS特性在W3中讨论过,我相信是在gecko中实现的。但这不是重点,重点是不是所有的浏览器都支持它,我真的想要这个功能 有什么方法可以混合使用CSS和/或javascript和/或jquery来实现这一点吗?有一个简单的jquery插件用于此::有一个简单的jquery插件用于此::有一个简单的jquery插件用于此::为了避免使用插件,我使用jQuery1.8+创建了以下javascript方法 第一个参数是要设置的元素。

如果您不知道位置:sticky是什么,请观看此20秒长的视频:

这个CSS特性在W3中讨论过,我相信是在gecko中实现的。但这不是重点,重点是不是所有的浏览器都支持它,我真的想要这个功能


有什么方法可以混合使用CSS和/或javascript和/或jquery来实现这一点吗?

有一个简单的jquery插件用于此::

有一个简单的jquery插件用于此::

有一个简单的jquery插件用于此::

为了避免使用插件,我使用jQuery1.8+创建了以下javascript方法

第一个参数是要设置的元素。 第二个参数是optionnal,是一个布尔值,通过设置300ms的小超时来提高浏览器性能

function simulateSticky(elt, timeout) {
    var move = function() {
        var scrollTop = $(window).scrollTop();
        var scrollBottom = $(document).height() - scrollTop - $(window).height();

        var eltTop = elt.parent().offset().top;
        var eltBottom = $(document).height() - eltTop -  elt.parent().outerHeight();

        if (scrollTop < eltTop) { // Top case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "auto",
                left: "0px",
            });
        }
        else if (scrollTop >= eltTop && scrollBottom >= eltBottom) { // Middle case
            elt.css({
                position: "fixed",
                width: elt.parent().outerWidth(),
                top:"0px",
                right: "auto",
                bottom: "auto",
                left: "auto",
            });
        }
        else { // Bottom case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "0px",
                left: "0px",
            });
        }
    };

    // Use of a timeout for better performance
    if (timeout) {
        var timeoutId;
        $(window).scroll(function() {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(function() {
                move();
            }, 300);
        });
    }
    else {
        $(window).scroll(move);
    }

    // Initial call
    move();
}
function simulateSticky(elt,超时){
var move=function(){
var scrollTop=$(窗口).scrollTop();
var scrollbooth=$(document.height()-scrollTop-$(window.height());
var eltTop=elt.parent().offset().top;
var eltBottom=$(document.height()-eltTop-elt.parent().outerHeight();
如果(滚动顶部<顶部){//顶部大小写
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“自动”,
左:“0px”,
});
}
如果(scrollTop>=eltTop&&scrollBottom>=eltBottom){//中间大小写
英语教学({
位置:“固定”,
宽度:elt.parent().outerWidth(),
顶部:“0px”,
右:“自动”,
底部:“自动”,
左:“自动”,
});
}
else{//底格
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“0px”,
左:“0px”,
});
}
};
//使用超时以获得更好的性能
如果(超时){
var-timeoutId;
$(窗口)。滚动(函数(){
clearTimeout(timeoutId);
timeoutId=setTimeout(函数(){
move();
}, 300);
});
}
否则{
$(窗口)。滚动(移动);
}
//初始呼叫
move();
}

为了避免使用插件,我使用jquery 1.8+创建了以下javascript方法

第一个参数是要设置的元素。 第二个参数是optionnal,是一个布尔值,通过设置300ms的小超时来提高浏览器性能

function simulateSticky(elt, timeout) {
    var move = function() {
        var scrollTop = $(window).scrollTop();
        var scrollBottom = $(document).height() - scrollTop - $(window).height();

        var eltTop = elt.parent().offset().top;
        var eltBottom = $(document).height() - eltTop -  elt.parent().outerHeight();

        if (scrollTop < eltTop) { // Top case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "auto",
                left: "0px",
            });
        }
        else if (scrollTop >= eltTop && scrollBottom >= eltBottom) { // Middle case
            elt.css({
                position: "fixed",
                width: elt.parent().outerWidth(),
                top:"0px",
                right: "auto",
                bottom: "auto",
                left: "auto",
            });
        }
        else { // Bottom case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "0px",
                left: "0px",
            });
        }
    };

    // Use of a timeout for better performance
    if (timeout) {
        var timeoutId;
        $(window).scroll(function() {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(function() {
                move();
            }, 300);
        });
    }
    else {
        $(window).scroll(move);
    }

    // Initial call
    move();
}
function simulateSticky(elt,超时){
var move=function(){
var scrollTop=$(窗口).scrollTop();
var scrollbooth=$(document.height()-scrollTop-$(window.height());
var eltTop=elt.parent().offset().top;
var eltBottom=$(document.height()-eltTop-elt.parent().outerHeight();
如果(滚动顶部<顶部){//顶部大小写
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“自动”,
左:“0px”,
});
}
如果(scrollTop>=eltTop&&scrollBottom>=eltBottom){//中间大小写
英语教学({
位置:“固定”,
宽度:elt.parent().outerWidth(),
顶部:“0px”,
右:“自动”,
底部:“自动”,
左:“自动”,
});
}
else{//底格
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“0px”,
左:“0px”,
});
}
};
//使用超时以获得更好的性能
如果(超时){
var-timeoutId;
$(窗口)。滚动(函数(){
clearTimeout(timeoutId);
timeoutId=setTimeout(函数(){
move();
}, 300);
});
}
否则{
$(窗口)。滚动(移动);
}
//初始呼叫
move();
}

为了避免使用插件,我使用jquery 1.8+创建了以下javascript方法

第一个参数是要设置的元素。 第二个参数是optionnal,是一个布尔值,通过设置300ms的小超时来提高浏览器性能

function simulateSticky(elt, timeout) {
    var move = function() {
        var scrollTop = $(window).scrollTop();
        var scrollBottom = $(document).height() - scrollTop - $(window).height();

        var eltTop = elt.parent().offset().top;
        var eltBottom = $(document).height() - eltTop -  elt.parent().outerHeight();

        if (scrollTop < eltTop) { // Top case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "auto",
                left: "0px",
            });
        }
        else if (scrollTop >= eltTop && scrollBottom >= eltBottom) { // Middle case
            elt.css({
                position: "fixed",
                width: elt.parent().outerWidth(),
                top:"0px",
                right: "auto",
                bottom: "auto",
                left: "auto",
            });
        }
        else { // Bottom case
            elt.css({
                position: "absolute",
                width: "100%",
                top:"auto",
                right: "0px",
                bottom: "0px",
                left: "0px",
            });
        }
    };

    // Use of a timeout for better performance
    if (timeout) {
        var timeoutId;
        $(window).scroll(function() {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(function() {
                move();
            }, 300);
        });
    }
    else {
        $(window).scroll(move);
    }

    // Initial call
    move();
}
function simulateSticky(elt,超时){
var move=function(){
var scrollTop=$(窗口).scrollTop();
var scrollbooth=$(document.height()-scrollTop-$(window.height());
var eltTop=elt.parent().offset().top;
var eltBottom=$(document.height()-eltTop-elt.parent().outerHeight();
如果(滚动顶部<顶部){//顶部大小写
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“自动”,
左:“0px”,
});
}
如果(scrollTop>=eltTop&&scrollBottom>=eltBottom){//中间大小写
英语教学({
位置:“固定”,
宽度:elt.parent().outerWidth(),
顶部:“0px”,
右:“自动”,
底部:“自动”,
左:“自动”,
});
}
else{//底格
英语教学({
位置:“绝对”,
宽度:“100%”,
顶部:“自动”,
右:“0px”,
底部:“0px”,
左:“0px”,
});
}
};
//使用超时以获得更好的性能
如果(超时){
var-timeoutId;
$(窗口).sc