When writing a script with vertical scrolling, I ran into the problem that the scrolling is not in the right place. I have a card. There are various geo-objects on it. There is a block to the right of the map. There are many blocks with a description of these geo-objects. I want to automatically scroll to the desired description when clicking on a geo object in the right block. Here is the address of the site to make it clearer: an example of implementation . I cite a part of the code with which this situation turned out:

.add('click', function (e) {//ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° Π³Π΅ΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚ var map = Drupal.geofieldYmap.data['geofield-ymap-catalog-page'].map; //ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ var result = ymaps.geoQuery(map.geoObjects); //ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ var res = document.getElementsByClassName("view-catalog")[1].getElementsByClassName("views-row"); //ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ список описаний, справа ΠΎΡ‚ ΠΊΠ°Ρ€Ρ‚Ρ‹ if(existchange.length != 0){ //Ссли Π½Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΠΈΠΊ Π·Π° сСссию for(var i=0;i<existchange.length;i++) res[existchange[i]].style.background = 'none'; //Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽ староС оформлСния для всСх описаний Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±Ρ‹Π» Ρ€Π°Π½Π΅Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ ΠΊΠ»ΠΈΠΊ for(var i = 0; i< result._objects.length; i++){ //ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡΡŒ ΠΏΠΎ всСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ if(String(result._objects[i].properties._data.hintContent) == res[existchange[0]].getElementsByClassName("views-field-title")[0].getElementsByTagName("span")[0].innerHTML){ //ΠΈΡ‰Ρƒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ(Ρ‹Π΅) ΠΌΠ½Π΅ result._objects[i].options.set('preset', OldPresetByClick); //Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽ старый прСсСт } } } existchange = []; //ΠΎΠ±Π½ΡƒΠ»ΡΡŽ список порядковых Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² старых описаний for(var i=0; i<res.length;i++){ //ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡΡŒ ΠΏΠΎ всСм описаниям //ΠΈΡ‰Ρƒ описаниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ соотвСтствуСт Ρ‚ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠΊ ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ…ΠΎΠΆΡƒ Ρ‚Π°ΠΊΠΎΠΉ(ΠΈΠ΅) if(String(e.get('target').properties._data.hintContent) == res[i].getElementsByClassName("views-field-title")[0].getElementsByTagName("span")[0].innerHTML) existchange.push(i);//запоминаю ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ этого(ΠΈΡ…) описания(ΠΈΠΉ) } res[existchange[0]].id = 'clickhover'; //добавляю ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ описанию ΡΠΊΠΎΡ€ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ Π΄ΠΎ Π½Π΅Π³ΠΎ for(var i=0;i<existchange.length;i++) res[existchange[i]].style.background = 'rgba(102, 102, 102, 0.75)'; //мСняю ΡΡ‚ΠΈΠ»ΡŒ для всСх описаний if(e.get('target').options._options.preset != 'custom#blockhover'){ //Ссли ΠΊΠ»ΠΈΠΊ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ Π½Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π³Π΅ΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ OldPresetByClick = OldPresetByHover; //запоминаю прСсСт ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎ навСдСния ΠΌΡ‹ΡˆΠΈ $('#block-views-catalog-block-1').animate({scrollTop: $('#clickhover').offset().top}, 1300); //ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°ΡŽ Π΄ΠΎ якоря } for(var i = 0; i< result._objects.length; i++){ //ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄ΡƒΡΡŒ ΠΏΠΎ всСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ //ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ сколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ соотвСтствуСт этому Π»ΠΎΡ‚Ρƒ if(result._objects[i].properties._data.hintContent == e.get('target').properties._data.hintContent){ if(e.get('target').options._options.preset != 'custom#blockhover') //Ссли ΠΊΠ»ΠΈΠΊ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ Π½Π΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π³Π΅ΠΎΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ OldPresetByClick = OldPresetByHover; //запоминаю прСсСт ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎ навСдСния ΠΌΡ‹ΡˆΠΈ result._objects[i].options.set('preset', 'custom#blockhover'); //ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π½Π° ΠΊΠ°Ρ€Ρ‚Π΅ мСняю прСсСт } } }); 

Please tell me why scrolling works incorrectly and how can this be corrected?

    1 answer 1

    It does not work, because offset() element is different at each scroll position inside the container.

    It is necessary to consider the current container scroll.

     jQuery('#block-views-catalog-block-1').animate({ scrollTop: jQuery('#clickhover').position().top+jQuery('#block-views-catalog-block-1').scrollTop() }, 1300); 

    And I took position() to think about the parent, not the page.