복붙노트

[JQUERY] 어떻게이 개 된 div의 스크롤 위치를 동기화하는 방법은 무엇입니까?

JQUERY

어떻게이 개 된 div의 스크롤 위치를 동기화하는 방법은 무엇입니까?

해결법


  1. 1.

    $('#bottom').on('scroll', function () {
        $('#top').scrollTop($(this).scrollTop());
    });
    

    여기에 우리가 자신의 스크롤 위치를 동기화 스크롤 막대 요소에서 scrollTop 값을 받고, 모든 그것의 가치를 .scrollTop ()를 사용하여, 다른 요소에 대한 scrollTop을 설정하는 : http://api.jquery.com/scrollTop

    이 수익 요소는 하단의 ID를 가지고 있으며, 여러분의 상위 요소는 상위의 ID를 가지고 있다고 가정합니다.

    당신은 CSS를 사용하여 상위 요소에 대한 스크롤 막대를 숨길 수 있습니다 :

    #top {
        overflow : hidden;
    }
    

    여기 데모입니다 http://jsfiddle.net/sgcer/1884/

    난 정말이 할 수있는 이유가 적이 생각하지만, 그것은 꽤 행동에 냉각 보인다.


  2. 2.나는이 오래된 스레드 알고,하지만 어쩌면이 사람을 도움이 될 것입니다. 당신이 두 방향으로 스크롤을 동기화해야하는 경우 경우, 그냥 이벤트를 스크롤 '모두 컨테이너를 처리 한 후 스크롤 이벤트를주기에지고와 스크롤이 부드럽게되지 않기 때문에, 스크롤 값을 설정하지 않는 좋은 충분 (가 세로로 스크롤하려고 마우스는 Hightom에 의해 주어진 예를) 휠.

    나는이 오래된 스레드 알고,하지만 어쩌면이 사람을 도움이 될 것입니다. 당신이 두 방향으로 스크롤을 동기화해야하는 경우 경우, 그냥 이벤트를 스크롤 '모두 컨테이너를 처리 한 후 스크롤 이벤트를주기에지고와 스크롤이 부드럽게되지 않기 때문에, 스크롤 값을 설정하지 않는 좋은 충분 (가 세로로 스크롤하려고 마우스는 Hightom에 의해 주어진 예를) 휠.

    여기에 이미 스크롤을 동기화 할 수 있는지 확인하는 방법의 예입니다 :

    isSyncingLeftScroll var에 거짓 =; isSyncingRightScroll var에 거짓 =; leftDiv VAR = document.getElementById를 ( '왼쪽'); rightDiv VAR = document.getElementById를 ( '권리'); leftDiv.onscroll = 함수 () { 경우 (isSyncingLeftScroll) { isSyncingRightScroll 사실 =; rightDiv.scrollTop = this.scrollTop; } isSyncingLeftScroll = 거짓; } rightDiv.onscroll = 함수 () { 경우 (isSyncingRightScroll) { isSyncingLeftScroll 사실 =; leftDiv.scrollTop = this.scrollTop; } isSyncingRightScroll = 거짓; } .container { 폭 : 200 픽셀; 높이 : 500 픽셀; 오버 플로우-Y : 자동; } {.leftContainer 플로트 : 오른쪽; } {.rightContainer 왼쪽으로 뜨다; }

    그러나 나는 당신에게 설명해야한다, 고통을 기쁨을 비난과 칭찬의 모든 잘못된 아이디어가 태어난 방법, 모든 일이 열리고 그들 자신은 진리의 위대한 탐험가가있는 것에서 인간의 행복의 마스터 빌더는, 당신에게 설명합니다. 즐거움 그 자체의 어떤 사람의 경우는 즐거움 비롯되는 경멸이나 증오, 또는 도망,하지만 그들은 기쁨의 이유로 그를 따르는 이들의 큰 슬픔에 속해 있기 때문에 그들은 모르기 때문에, 나 어떤 사람이 자신의 고통의 고통과 매우 중요한에 속하는 것, 고통이기 때문에, 그 뜻을 얻기 위해, 연방 준비 제도 이사회 (FRB), 사랑 때문에, 그러나 때문에 같은 종류의 몰락의 시대, 그들은 노동 쾌락과 고통, 멋진을 추구 할 수 있다는 경우가있다. 지금까지 힘든 운동을 수행하고 우리의 vCard를 E와 같은 다운로드 정보, 그것에서 어떤 이점을 얻을 제외? 하지만 누가 고통, 아니 결과 즐거움을 피할 오류를 찾을 수있는 권리, 거기에되고 싶은 사람들의 즐거움, 더 성가신 결과, 또는 그 일이없는이있다? 그러나 그들의 진실, 그들이 비난하고 그가 그녀의 감언 이설 그들의 쾌락 accusantium의 존재가 부정하게 다루는 사령관의 가치 단지 증오, 그들은이 자신을 ...을 해보다하지 않는 욕망의 눈을 멀게하는 excepturi이 고통의, 그리고있는 그는 트러블과 같은에서 그들은 비난에, 그리고 사람은 자신의 노동과 고통의 인 정신의 일반적인 약점을 버리고 사무실을 행사할. 그러나 이것은 간단하고 쉽게 구별이 필요합니다. 자유 시간의 경우, 우리는 한 남자와 결혼을 선택하는 옵션이며, 아무것도 방지가 덜 그것이, 우리가 할 수 있습니다 하나님을 가장 기쁘게하는 그 모든 즐거움이 때 환영 모든 고통을 피할 수. 그러나 특정 상황 및 의무 또는 의무 또는 쾌락이 종종뿐만 아니라, 될 것입니다 결과를 업무에 거부했다 및 불만 허용합니다. 이 이러한 문제에 대한 선정되었다, 따라서 그 중 그가 다른 이상을 확보하는 즐거움을 거부해야한다 그렇지 않으면 그는 더 고통을 피하기 위해 고통을 견디는, 현명한 사람을주의 할 의무가있다. 그러나 나는 당신에게 설명해야한다, 고통을 기쁨을 비난과 칭찬의 모든 잘못된 아이디어가 태어난 방법, 모든 일이 열리고 그들 자신은 진리의 위대한 탐험가가있는 것에서 인간의 행복의 마스터 빌더는, 당신에게 설명합니다. 즐거움 그 자체의 어떤 사람의 경우는 즐거움 비롯되는 경멸이나 증오, 또는 도망,하지만 그들은 기쁨의 이유로 그를 따르는 이들의 큰 슬픔에 속해 있기 때문에 그들은 모르기 때문에, 나 어떤 사람이 자신의 고통의 고통과 매우 중요한에 속하는 것, 고통이기 때문에, 그 뜻을 얻기 위해, 연방 준비 제도 이사회 (FRB), 사랑 때문에, 그러나 때문에 같은 종류의 몰락의 시대, 그들은 노동 쾌락과 고통, 멋진을 추구 할 수 있다는 경우가있다. 지금까지 힘든 운동을 수행하고 우리의 vCard를 E와 같은 다운로드 정보, 그것에서 어떤 이점을 얻을 제외? 하지만 누가 고통, 아니 결과 즐거움을 피할 오류를 찾을 수있는 권리, 거기에되고 싶은 사람들의 즐거움, 더 성가신 결과, 또는 그 일이없는이있다? 그러나 그들의 진실, 그들이 비난하고 그가 그녀의 감언 이설 그들의 쾌락 accusantium의 존재가 부정하게 다루는 사령관의 가치 단지 증오, 그들은이 자신을 ...을 해보다하지 않는 욕망의 눈을 멀게하는 excepturi이 고통의, 그리고있는 그는 트러블과 같은에서 그들은 비난에, 그리고 사람은 자신의 노동과 고통의 인 정신의 일반적인 약점을 버리고 사무실을 행사할. 그러나 이것은 간단하고 쉽게 구별이 필요합니다. 자유 시간의 경우, 우리는 한 남자와 결혼을 선택하는 옵션이며, 아무것도 방지가 덜 그것이, 우리가 할 수 있습니다 하나님을 가장 기쁘게하는 그 모든 즐거움이 때 환영 모든 고통을 피할 수. 그러나 특정 상황 및 의무 또는 의무 또는 쾌락이 종종뿐만 아니라, 될 것입니다 결과를 업무에 거부했다 및 불만 허용합니다. 이 이러한 문제에 대한 선정되었다, 따라서 그 중 그가 다른 이상을 확보하는 즐거움을 거부해야한다 그렇지 않으면 그는 더 고통을 피하기 위해 고통을 견디는, 현명한 사람을주의 할 의무가있다.

    여기에 바이올린입니다.


  3. 3.나는 당신 모두에게 이중 방향 솔루션 덕분 찾고 있었어요, 당신의 contibutions는이 일을 도와주었습니다 :

    나는 당신 모두에게 이중 방향 솔루션 덕분 찾고 있었어요, 당신의 contibutions는이 일을 도와주었습니다 :

    $('#cells').on('scroll', function () {
    $('#hours').scrollTop($(this).scrollTop());
    $('#days').scrollLeft($(this).scrollLeft());});
    

    JSFiddle에 참조 : https://jsfiddle.net/sgcer/1274/

    그것의 도움말 누군가 언젠가는 희망 :-)


  4. 4.이 루프 문제를 방지하고 부드러운 스크롤을 달성하는 또 다른 솔루션입니다. 이 확실에만 초점을 맞춘 요소는 스크롤 이벤트를 얻을 수 있다고한다.

    이 루프 문제를 방지하고 부드러운 스크롤을 달성하는 또 다른 솔루션입니다. 이 확실에만 초점을 맞춘 요소는 스크롤 이벤트를 얻을 수 있다고한다.

    let activePre: HTMLPreElement = null;
    document.querySelectorAll(".scrollable-pre").forEach(function(pre: HTMLPreElement) {
        pre.addEventListener("mouseenter", function(e: MouseEvent) {
            let pre = e.target as HTMLPreElement;
            activePre = pre;
        });
    
        pre.addEventListener("scroll", function(e: MouseEvent) {
            let pre = e.target as HTMLPreElement;
    
            if (activePre !== pre) {
                return;
            }
    
            if (pre !== versionBasePre) {
                versionBasePre.scrollTop = pre.scrollTop;
                versionBasePre.scrollLeft = pre.scrollLeft;
            }
    
            if (pre !== versionCurrentPre) {
                versionCurrentPre.scrollTop = pre.scrollTop;
                versionCurrentPre.scrollLeft = pre.scrollLeft;
            }
    
        });
    });
    

  5. 5.내가 평가 때문에 좋아는 모든 옵션은 여기에 제시, 그들은 모두 한 형태 또는 다른 제한 사항이 있었다 :

    내가 평가 때문에 좋아는 모든 옵션은 여기에 제시, 그들은 모두 한 형태 또는 다른 제한 사항이 있었다 :

    나는 요소의 제한없이 작업 할 수있는 재사용 가능한 버전을 만들 것을 활용하고, JQuery와 필요하지 않습니다.

    function scrollSync(selector) {
      let active = null;
      document.querySelectorAll(selector).forEach(function(element) {
        element.addEventListener("mouseenter", function(e) {
          active = e.target;
        });
    
        element.addEventListener("scroll", function(e) {
          if (e.target !== active) return;
    
          document.querySelectorAll(selector).forEach(function(target) {
            if (active === target) return;
    
            target.scrollTop = active.scrollTop;
            target.scrollLeft = active.scrollLeft;
          });
        });
      });
    }
    
    //RWM: Call the function on the elements you need synced.
    scrollSync(".scrollSync");
    

    이 여기에 대한 JSFiddle을 확인할 수 있습니다 : http://jsfiddle.net/gLa2ndur/3를. 당신은 모두 수평 및 수직 스크롤 예제를 사용하여 볼 수 있습니다.

    유일한 알려진 제한 사항은 다른 크기의 div의에 작동하지 않을 것입니다. 나는 확실히 누군가가이에 앤드류의 작업을 통합하는 작업을 할 수있어 경우 사용의 경우 발견 필요한 그 (광산하지 않습니다).

    나는이 사람에게 도움이 희망!


  6. 6.내가 나를 위해 우선적으로 작동하는 혼합 용액을 만들어 위의 답변에 감사 :

    내가 나를 위해 우선적으로 작동하는 혼합 용액을 만들어 위의 답변에 감사 :

    var isLeftScrollTopCalled = false;
    $('#leftElement').scroll(function (e) {
        if (isRightScrollTopCalled) {
            return isRightScrollTopCalled = false;
        }
    
        $('#rightElement').scrollTop($(this).scrollTop());
        isLeftScrollTopCalled = true;
    });
    
    var isRightScrollTopCalled = false;
    $('#rightElement').scroll(function (e) {
        if (isLeftScrollTopCalled) {
            return isLeftScrollTopCalled = false;
        }
    
        $('#leftElement').scrollTop($(this).scrollTop());
        isRightScrollTopCalled = true;
    });
    

  7. 7.나는 그의 질문은 꽤 오래된 것을 발견,하지만 난 더 나은 타이머를 사용하는 것보다 작동하는 jQuery를 구현을 떠날 수 있다고 생각. 자, 내가 이전에 사용 된 솔루션과 같은 두 개의 이벤트 리스너를 사용하고 있지만,이 두 가지 다른 크기의 사업부 상자에 대한 동기 스크롤에 대한 비율 / 비율을 사용합니다. 당신은 위치에게 바닐라 JS 솔루션에 스크롤바를 얻기 위해이 같은 지식을 적용 할 수 있습니다. 이 두 div의 사이의 스크롤이 훨씬 부드러워집니다.

    나는 그의 질문은 꽤 오래된 것을 발견,하지만 난 더 나은 타이머를 사용하는 것보다 작동하는 jQuery를 구현을 떠날 수 있다고 생각. 자, 내가 이전에 사용 된 솔루션과 같은 두 개의 이벤트 리스너를 사용하고 있지만,이 두 가지 다른 크기의 사업부 상자에 대한 동기 스크롤에 대한 비율 / 비율을 사용합니다. 당신은 위치에게 바닐라 JS 솔루션에 스크롤바를 얻기 위해이 같은 지식을 적용 할 수 있습니다. 이 두 div의 사이의 스크롤이 훨씬 부드러워집니다.

    /** Scroll sync between editor and preview **/
    // Locks so that only one pane is in control of scroll sync
    var eScroll = false;
    var pScroll = false;
    // Set the listener to scroll
    this.edit.on('scroll', function() {
        if(eScroll) { // Lock the editor pane
            eScroll = false;
            return;
        }
        pScroll = true; // Enable the preview scroll
    
        // Set elements to variables
        let current = self.edit.get(0);
        let other = self.preview.get(0);
    
        // Calculate the position of scroll position based on percentage
        let percentage = current.scrollTop / (current.scrollHeight - current.offsetHeight);
    
        // Set the scroll position on the other pane
        other.scrollTop = percentage * (other.scrollHeight - other.offsetHeight);
    });
    this.preview.on('scroll', function() {
        if(pScroll) { // Lock the preview pane
            pScroll = false;
            return;
        }
        eScroll = true; // Enable the editor scroll
    
        // Set elements to variables
        let current = self.preview.get(0);
        let other = self.edit.get(0);
    
        // Calculate the position of scroll position based on percentage
        let percentage = current.scrollTop / (current.scrollHeight - current.offsetHeight);
    
        // Set the scroll position on the other pane
        other.scrollTop = percentage * (other.scrollHeight - other.offsetHeight);
    
    });
    
  8. from https://stackoverflow.com/questions/9236314/how-do-i-synchronize-the-scroll-position-of-two-divs by cc-by-sa and MIT license