3

我有 3 个带滚动条的 div。如果我在 div 1 中滚动,我想以相反的方向滚动 div 2 和 3。滚动的距离应该是 div 1 距离的一半。

这就是我现在拥有的(一小部分,其余部分在 jsfiddle 中),适用于 1 div。

$("#textBox1").scroll(function () {
        console.log("scroll 1");
        var offset = $("#textBox1").scrollTop() - scrollPosTBox1;
        var half_offset = offset/2.0;

        disable1 = true;

        if(disable2 == false) {
            $("#textBox2").scrollTop(scrollPosTBox2 - half_offset);
        }
        if(disable3 == false) {
            $("#textBox3").scrollTop(scrollPosTBox3 - half_offset);
        }    
        disable1 = false;


    });

但是,如果我尝试为其他 2 个 div 获得相同的结果,那么我将无法再滚动任何内容。这是因为例如 div 1 触发 div 2 并且 div 2 触发回 div 1。我试图用禁用代码解决这个问题,但它没有帮助。

有人能帮我吗?

http://jsfiddle.net/XmYh5/1/

4

3 回答 3

3

对@EmreErkan 和@Simon 的努力没有不尊重。这是一个无点击版本。

var $boxes = $("#textBox1,#textBox2,#textBox3"),
    active;

$boxes.scrollTop(150);

// set initial scrollTop values
updateScrollPos();

// bind mouseenter: 
// 1) find which panel is active 
// 2) update scrollTop values

$boxes.mouseenter(function () {
    active = this.id;
    updateScrollPos();
});

// bind scroll for all boxes
$boxes.scroll(function (e) {

    $this = $(this);

    // check to see if we are dealing with the active box
    // if true then set scrolltop of other boxes relative to the active box
    if(this.id == active){

        var $others = $boxes.not($this),
            offset = $this.scrollTop()-$this.data("scroll"),
            half_offset = offset / 2;

        $others.each(function(){
            $this = $(this);
            $this.scrollTop($this.data("scroll") - half_offset);
        });
    }

});

// utility function: 
// assign scrollTop values element's data attributes (data-scroll)

function updateScrollPos() {
    $boxes.each(function(){
        $this = $(this);
        $this.data("scroll",$this.scrollTop());
    });
}

小提琴

于 2013-03-11T17:25:54.577 回答
1

您可以使用变量来确定活动文本框,.mousedown()如果它是活动的,则可以使用;

var activeScroll = '';

$("#textBox1").on('mousedown focus mouseenter', function () {
    activeScroll = 'scroll1';
}).scroll(function () {
    if (activeScroll == 'scroll1') {
        console.log("scroll 1");
        var offset = $("#textBox1").scrollTop() - scrollPosTBox1;
        var half_offset = offset / 2.0;

        $("#textBox2").scrollTop(scrollPosTBox2 - half_offset);
        $("#textBox3").scrollTop(scrollPosTBox3 - half_offset);
    }
});

您可以在此处查看更新的jsFiddle

于 2013-03-11T16:05:55.333 回答
1

终于得到了一个动态的解决方案,比我想象的要复杂,但我想我明白了:

http://jsfiddle.net/XmYh5/14/

var initialTop = 150,
    factor = 2;

    $(".textBox")
        .addClass('disabled')
        .scrollTop(initialTop)
        .on('scroll', function () {
            var $this = $(this);

            if(!$this.is('.disabled')) {
                this.lastOffset = this.lastOffset || initialTop;

                var offset = $this.scrollTop(),
                    step = (offset - this.lastOffset) / factor;

                $this.siblings().each( function() {
                    var $this = $(this),
                        offset = $this.scrollTop() - step;

                    $this.scrollTop(offset);
                    this.lastOffset = offset;
                });

                this.lastOffset = offset;
            }
        })
        .on('mouseenter', function() {
            $(this).removeClass('disabled').siblings().addClass('disabled');
        });
于 2013-03-11T17:22:09.973 回答