Gulir dengan lancar ke elemen tertentu di halaman

Saya ingin memiliki 4 tombol/tautan di awal halaman, dan di bawahnya ada konten.

Pada tombol saya menaruh kode ini:

<a href="/id#idElement1">Scroll to element 1</a>
<a href="/id#idElement2">Scroll to element 2</a>
<a href="/id#idElement3">Scroll to element 3</a>
<a href="/id#idElement4">Scroll to element 4</a>

Dan di bawah tautan akan ada konten:

<h2 id="idElement1">Element1</h2>
content....
<h2 id="idElement2">Element2</h2>
content....
<h2 id="idElement3">Element3</h2>
content....
<h2 id="idElement4">Element4</h2>
content....

Ini berfungsi sekarang, tetapi tidak bisa membuatnya terlihat lebih mulus.

Saya menggunakan kode ini, tetapi tidak dapat berfungsi.

$('html, body').animate({
    scrollTop: $("#elementID").offset().top
}, 2000);

Ada saran? Terima kasih.

Edit: dan biola: http://jsfiddle.net/WxJLx/2/


person M P    schedule 18.07.2013    source sumber
comment
kemungkinan duplikat dari Gulir JavaScript/jQuery yang lancar ke elemen   -  person MDEV    schedule 18.07.2013
comment
saya harus bertanya, apakah Anda menggunakan kode animasi di dalam acara klik?   -  person Or Duan    schedule 18.07.2013
comment
aku khawatir aku tidak tahu apa yang kamu tanyakan padaku   -  person M P    schedule 18.07.2013
comment
$('#idElement1').onclick=function(){/*ini kode smothscroll Anda*/}   -  person dbanet    schedule 18.07.2013
comment
juga, jangan lupa untuk mengembalikan false untuk menonaktifkan pengguliran asli   -  person dbanet    schedule 18.07.2013
comment
bisakah Anda menunjukkan kepada saya biola itu: jsfiddle.net/WxJLx/2   -  person M P    schedule 18.07.2013
comment
Tidak jelas bagi saya apakah Anda ingin menemukan solusi untuk pengguliran yang lancar atau jika Anda ingin mengetahui dan memahami mengapa kode Anda tidak berfungsi.   -  person surfmuggle    schedule 20.07.2013


Jawaban (12)


Baru saja membuat solusi javascript saja di bawah ini.

Penggunaan sederhana:

EPPZScrollTo.scrollVerticalToElementById('signup_form', 20);

Objek mesin (Anda dapat mengutak-atik filter, nilai fps):

/**
 *
 * Created by Borbás Geri on 12/17/13
 * Copyright (c) 2013 eppz! development, LLC.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */


var EPPZScrollTo =
{
    /**
     * Helpers.
     */
    documentVerticalScrollPosition: function()
    {
        if (self.pageYOffset) return self.pageYOffset; // Firefox, Chrome, Opera, Safari.
        if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; // Internet Explorer 6 (standards mode).
        if (document.body.scrollTop) return document.body.scrollTop; // Internet Explorer 6, 7 and 8.
        return 0; // None of the above.
    },

    viewportHeight: function()
    { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },

    documentHeight: function()
    { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },

    documentMaximumScrollPosition: function()
    { return this.documentHeight() - this.viewportHeight(); },

    elementVerticalClientPositionById: function(id)
    {
        var element = document.getElementById(id);
        var rectangle = element.getBoundingClientRect();
        return rectangle.top;
    },

    /**
     * Animation tick.
     */
    scrollVerticalTickToPosition: function(currentPosition, targetPosition)
    {
        var filter = 0.2;
        var fps = 60;
        var difference = parseFloat(targetPosition) - parseFloat(currentPosition);

        // Snap, then stop if arrived.
        var arrived = (Math.abs(difference) <= 0.5);
        if (arrived)
        {
            // Apply target.
            scrollTo(0.0, targetPosition);
            return;
        }

        // Filtered position.
        currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);

        // Apply target.
        scrollTo(0.0, Math.round(currentPosition));

        // Schedule next tick.
        setTimeout("EPPZScrollTo.scrollVerticalTickToPosition("+currentPosition+", "+targetPosition+")", (1000 / fps));
    },

    /**
     * For public use.
     *
     * @param id The id of the element to scroll to.
     * @param padding Top padding to apply above element.
     */
    scrollVerticalToElementById: function(id, padding)
    {
        var element = document.getElementById(id);
        if (element == null)
        {
            console.warn('Cannot find element with id \''+id+'\'.');
            return;
        }

        var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
        var currentPosition = this.documentVerticalScrollPosition();

        // Clamp.
        var maximumScrollPosition = this.documentMaximumScrollPosition();
        if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;

        // Start animation.
        this.scrollVerticalTickToPosition(currentPosition, targetPosition);
    }
};
person Geri Borbás    schedule 18.12.2013

Sangat lancar dengan requestAnimationFrame

Untuk animasi gulir yang dirender dengan lancar, seseorang dapat menggunakan window.requestAnimationFrame() yang berperforma lebih baik dengan rendering dibandingkan solusi setTimeout() biasa.

Contoh dasarnya terlihat seperti ini. Fungsi step dipanggil untuk setiap bingkai animasi browser dan memungkinkan manajemen waktu pengecatan ulang yang lebih baik, sehingga meningkatkan kinerja.

function doScrolling(elementY, duration) { 
  var startingY = window.pageYOffset;
  var diff = elementY - startingY;
  var start;

  // Bootstrap our animation - it will get called right before next frame shall be rendered.
  window.requestAnimationFrame(function step(timestamp) {
    if (!start) start = timestamp;
    // Elapsed milliseconds since start of scrolling.
    var time = timestamp - start;
    // Get percent of completion in range [0, 1].
    var percent = Math.min(time / duration, 1);

    window.scrollTo(0, startingY + diff * percent);

    // Proceed with animation as long as we wanted it to.
    if (time < duration) {
      window.requestAnimationFrame(step);
    }
  })
}

Untuk posisi elemen Y gunakan fungsi dalam jawaban lain atau yang ada di biola saya yang disebutkan di bawah.

Saya menyiapkan fungsi yang sedikit lebih canggih dengan dukungan pelonggaran dan pengguliran yang tepat ke elemen paling bawah: https://jsfiddle.net/s61x7c4e/

person Daniel Sawka    schedule 14.09.2016
comment
Hanya membuat perpustakaan kecil berdasarkan sumber Anda, menautkan di sini di bagian kredit. Terima kasih! - person Dev_NIX; 14.12.2016
comment
@Dev_NIX Senang saya bisa membantu! Pernah saya menggunakan pustaka sweet-scroll tetapi entah bagaimana tidak berfungsi dengan baik dengan React. Anda dapat menggunakan kembali beberapa API atau kode dari itu. - person Daniel Sawka; 15.12.2016
comment
Ini sangat sakit. Terima kasih! - person BrandonReid; 25.01.2017
comment
Terima kasih, yang terbaik! :) - person Naskalin; 03.05.2021

Pertanyaan diajukan 5 tahun yang lalu dan saya berurusan dengan smooth scroll dan merasa memberikan solusi sederhana sangat berharga bagi mereka yang mencari. Semua jawabannya bagus tapi ini dia yang sederhana.

function smoothScroll(){
    document.querySelector('.your_class or #id here').scrollIntoView({
        behavior: 'smooth'
    });
}

panggil saja fungsi smoothScroll pada acara onClick di sumber Anda element.

DOCS: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView

Catatan: Silakan periksa kompatibilitas di sini

Pengeditan Pihak ke-3

Dukungan untuk Element.scrollIntoView() pada tahun 2020 adalah ini:

Region            full   + partial = sum full+partial Support
Asia              73.24% + 22.75%  = 95.98%
North America     56.15% + 42.09%  = 98.25%
India             71.01% + 20.13%  = 91.14%
Europe            68.58% + 27.76%  = 96.35%

dukungan tampilan gulir 28-02-2020

person Sanjay Shr    schedule 13.08.2018
comment
scrollIntoView dengan 'halus' tidak memiliki dukungan untuk IE, EDGE dan Safari (28/09/2018) - person Karedia Noorsil; 28.09.2018
comment
@KarediaNoorsil Terima kasih telah melaporkan, Memperbarui jawaban saya. - person Sanjay Shr; 29.09.2018
comment
Jawaban terbaik di tahun 2020. - person n8jadams; 20.02.2020
comment
Teman, bagaimana aku berterima kasih? - person Beki; 10.06.2021

Pengguliran halus - lihat ma no jQuery

Berdasarkan artikel di itnewb.com saya membuat demo plunk untuk men-scroll dengan lancar tanpa pustaka eksternal.

Javascriptnya cukup sederhana. Pertama fungsi pembantu untuk meningkatkan dukungan lintas browser untuk menentukan posisi saat ini.

function currentYPosition() {
    // Firefox, Chrome, Opera, Safari
    if (self.pageYOffset) return self.pageYOffset;
    // Internet Explorer 6 - standards mode
    if (document.documentElement && document.documentElement.scrollTop)
        return document.documentElement.scrollTop;
    // Internet Explorer 6, 7 and 8
    if (document.body.scrollTop) return document.body.scrollTop;
    return 0;
}

Kemudian fungsi untuk menentukan posisi elemen tujuan - elemen yang ingin kita gulirkan.

function elmYPosition(eID) {
    var elm = document.getElementById(eID);
    var y = elm.offsetTop;
    var node = elm;
    while (node.offsetParent && node.offsetParent != document.body) {
        node = node.offsetParent;
        y += node.offsetTop;
    } return y;
}

Dan fungsi intinya untuk melakukan scrolling

function smoothScroll(eID) {
    var startY = currentYPosition();
    var stopY = elmYPosition(eID);
    var distance = stopY > startY ? stopY - startY : startY - stopY;
    if (distance < 100) {
        scrollTo(0, stopY); return;
    }
    var speed = Math.round(distance / 100);
    if (speed >= 20) speed = 20;
    var step = Math.round(distance / 25);
    var leapY = stopY > startY ? startY + step : startY - step;
    var timer = 0;
    if (stopY > startY) {
        for ( var i=startY; i<stopY; i+=step ) {
            setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
            leapY += step; if (leapY > stopY) leapY = stopY; timer++;
        } return;
    }
    for ( var i=startY; i>stopY; i-=step ) {
        setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
        leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
    }
    return false;
}

Untuk menyebutnya Anda cukup melakukan hal berikut. Anda membuat tautan yang menunjuk ke elemen lain dengan menggunakan id sebagai referensi untuk jangkar tujuan.

<a href="/id#anchor-2" 
   onclick="smoothScroll('anchor-2');">smooth scroll to the headline with id anchor-2<a/>
...
...  some content
...
<h2 id="anchor-2">Anchor 2</h2>

hak cipta

Di footer itnewb.com tertulis berikut ini: The techniques, effects and code demonstrated in ITNewb articles may be used for any purpose without attribution (although we recommend it) (12-01-2014)

person surfmuggle    schedule 18.07.2013
comment
Terima kasih, baru saja menghemat waktu saya :) Saya juga menambahkan ke smoothScroll({eID, padding = 0}) dan kemudian stopY += padding; setelah let stopY = elmYPosition(eID); untuk memiliki beberapa bantalan di sekitar elemen dan tidak menggulir ke elemen yang tepat - person Lukas Liesis; 14.04.2016
comment
Mengeksekusi string sebagai fungsi.... :( Kenapa tidak: setTimeout(window.scrollTo.bind(null, 0, leapY), timer * speed); - person monners; 01.09.2016


Saya sudah menggunakan ini sejak lama:

function scrollToItem(item) {
    var diff=(item.offsetTop-window.scrollY)/8
    if (Math.abs(diff)>1) {
        window.scrollTo(0, (window.scrollY+diff))
        clearTimeout(window._TO)
        window._TO=setTimeout(scrollToItem, 30, item)
    } else {
        window.scrollTo(0, item.offsetTop)
    }
}

penggunaan: scrollToItem(element) di mana element adalah document.getElementById('elementid') misalnya.

person Community    schedule 05.07.2016
comment
Ini bekerja dengan baik untuk saya. Saya hanya berpikir akan lebih baik dengan titik koma! - person Vahid Amiri; 23.09.2016
comment
hanya ingin menambahkan - tujuan saya bukan untuk menggunakan perpustakaan eksternal apa pun, tidak ada gunanya memuat jquery besar hanya untuk menggulir halaman ;-) - person ; 04.01.2017
comment
Hai, Terima kasih atas solusinya. :) Bisakah Anda memberi tahu saya apa gunanya variabel window._TO. Saya tidak tahu apa fungsinya dan mengapa kami menggunakan clearTimeout . Saya telah menghapus clearTimeout dan itu berfungsi dengan baik untuk saya. - person Subham Tripathi; 10.02.2017
comment
@Subham Tripathi jika Anda memanggil fungsi itu lagi sebelum selesai maka akan berperilaku sangat buruk - karena ia akan terus berpindah ke titik pertama dan jika panggilan kedua ingin memindahkannya ke titik yang berbeda maka ia akan hanya ada di sana dan kembali - selamanya - person ; 10.02.2017

Variasi jawaban @tominko. Animasi yang sedikit lebih halus dan menyelesaikan masalah dengan setTimeout() yang dipanggil tanpa batas, ketika beberapa elemen tidak dapat disejajarkan ke bagian atas area pandang.

function scrollToItem(item) {
    var diff=(item.offsetTop-window.scrollY)/20;
    if(!window._lastDiff){
        window._lastDiff = 0;
    }

    console.log('test')

    if (Math.abs(diff)>2) {
        window.scrollTo(0, (window.scrollY+diff))
        clearTimeout(window._TO)

        if(diff !== window._lastDiff){
            window._lastDiff = diff;
            window._TO=setTimeout(scrollToItem, 15, item);
        }
    } else {
        console.timeEnd('test');
        window.scrollTo(0, item.offsetTop)
    }
}
person Andrzej Sala    schedule 06.11.2016

Mengapa tidak menggunakan properti scroll-behavior CSS

html {
  scroll-behavior: smooth;
}

Dukungan browsernya juga bagus https://caniuse.com/#feat=css-scroll-behavior

person esnezz    schedule 09.05.2020
comment
Tidak berfungsi di Safari :-( - person randomcontrol; 11.04.2021

Anda dapat menggunakan plugin ini. Melakukan apa yang Anda inginkan.

http://flesler.blogspot.com/2007/10/jqueryscrollto.html

person Feedthe    schedule 18.07.2013
comment
Jadi saya perlu membuat kode seperti ini: $('#id1').localScroll({ target:'#content1' }); - person M P; 18.07.2013
comment
dan harus mengimpor semua lib jQuery untuk menggulir. Lebih baik dilakukan dengan vanila js seperti jawaban lainnya. - person Lukas Liesis; 14.04.2016

Anda dapat menggunakan loop for dengan window.scrollTo dan setTimeout untuk menggulir dengan lancar dengan Javascript biasa. Untuk menggulir ke elemen dengan fungsi scrollToSmoothly saya: scrollToSmoothly(elem.offsetTop) (dengan asumsi elem adalah elemen DOM).

function scrollToSmoothly(pos, time){
/*Time is only applicable for scrolling upwards*/
/*Code written by hev1*/
/*pos is the y-position to scroll to (in pixels)*/
     if(isNaN(pos)){
      throw "Position must be a number";
     }
     if(pos<0){
     throw "Position can not be negative";
     }
    var currentPos = window.scrollY||window.screenTop;
    if(currentPos<pos){
    var t = 10;
       for(let i = currentPos; i <= pos; i+=10){
       t+=10;
        setTimeout(function(){
        window.scrollTo(0, i);
        }, t/2);
      }
    } else {
    time = time || 2;
       var i = currentPos;
       var x;
      x = setInterval(function(){
         window.scrollTo(0, i);
         i -= 10;
         if(i<=pos){
          clearInterval(x);
         }
     }, time);
      }
}

Jika Anda ingin menggulir ke suatu elemen berdasarkan id, Anda dapat menambahkan fungsi ini (bersama dengan fungsi di atas):

function scrollSmoothlyToElementById(id){
   var elem = document.getElementById(id);
   scrollToSmoothly(elem.offsetTop);
}

Demo:

<button onClick="scrollToDiv()">Scroll To Element</button>
<div style="margin: 1000px 0px; text-align: center;">Div element<p/>
<button onClick="scrollToSmoothly(Number(0))">Scroll back to top</button>
</div>
<script>
function scrollToSmoothly(pos, time){
/*Time is only applicable for scrolling upwards*/
/*Code written by hev1*/
/*pos is the y-position to scroll to (in pixels)*/
     if(isNaN(pos)){
      throw "Position must be a number";
     }
     if(pos<0){
     throw "Position can not be negative";
     }
    var currentPos = window.scrollY||window.screenTop;
    if(currentPos<pos){
    var t = 10;
       for(let i = currentPos; i <= pos; i+=10){
       t+=10;
        setTimeout(function(){
      	window.scrollTo(0, i);
        }, t/2);
      }
    } else {
    time = time || 2;
       var i = currentPos;
       var x;
      x = setInterval(function(){
         window.scrollTo(0, i);
         i -= 10;
         if(i<=pos){
          clearInterval(x);
         }
     }, time);
      }
}
function scrollToDiv(){
  var elem = document.querySelector("div");
  scrollToSmoothly(elem.offsetTop);
}
</script>

person Unmitigated    schedule 04.08.2018

Jika seseorang perlu menggulir ke elemen di dalam div, ada solusi saya berdasarkan jawaban Andrzej Sala:

function scroolTo(element, duration) {
    if (!duration) {
        duration = 700;
    }
    if (!element.offsetParent) {
        element.scrollTo();
    }
    var startingTop = element.offsetParent.scrollTop;
    var elementTop = element.offsetTop;
    var dist = elementTop - startingTop;
    var start;

    window.requestAnimationFrame(function step(timestamp) {
        if (!start)
            start = timestamp;
        var time = timestamp - start;
        var percent = Math.min(time / duration, 1);
        element.offsetParent.scrollTo(0, startingTop + dist * percent);

        // Proceed with animation as long as we wanted it to.
        if (time < duration) {
            window.requestAnimationFrame(step);
        }
    })
}
person Kuba Szostak    schedule 25.06.2018

Pengguliran mulus dengan jQuery.ScrollTo

Untuk menggunakan plugin jQuery ScrollTo Anda harus melakukan hal berikut

  1. Buat tautan di mana href menunjuk ke elements.id lain
  2. buat elemen yang ingin Anda gulirkan
  3. referensi jQuery dan Plugin scrollTo
  4. Pastikan untuk menambahkan event handler klik untuk setiap tautan yang akan melakukan pengguliran dengan lancar

Membuat tautan

<h1>Smooth Scrolling with the jQuery Plugin .scrollTo</h1>
<div id="nav-list">
  <a href="/id#idElement1">Scroll to element 1</a>
  <a href="/id#idElement2">Scroll to element 2</a>
  <a href="/id#idElement3">Scroll to element 3</a>
  <a href="/id#idElement4">Scroll to element 4</a>
</div>

Membuat elemen target di sini hanya dua yang pertama yang ditampilkan, judul lainnya diatur dengan cara yang sama. Untuk melihat contoh lain saya menambahkan tautan kembali ke navigasi a.toNav

<h2 id="idElement1">Element1</h2>    
....
<h2 id="idElement1">Element1</h2>
... 
<a class="toNav" href="/id#nav-list">Scroll to Nav-List</a>

Mengatur referensi ke skrip. Jalur Anda ke file mungkin berbeda.

<script src="./jquery-1.8.3.min.js"></script>
<script src="./jquery.scrollTo-1.4.3.1-min.js"></script>

Menyambungkan semuanya

Kode di bawah ini dipinjam dari plugin pelonggaran jQuery

jQuery(function ($) {
    $.easing.elasout = function (x, t, b, c, d) {
        var s = 1.70158;  var p = 0; var a = c;
        if (t == 0) return b;
        if ((t /= d) == 1) return b + c;
        if (!p) p = d * .3;
        if (a < Math.abs(c)) {
            a = c;   var s = p / 4;
        } else var s = p / (2 * Math.PI) * Math.asin(c / a);
        // line breaks added to avoid scroll bar
        return a * Math.pow(2, -10 * t)  * Math.sin((t * d - s) 
                 * (2 * Math.PI) / p) + c + b;
    };            

    // important reset all scrollable panes to (0,0)       
    $('div.pane').scrollTo(0); 
    $.scrollTo(0);    // Reset the screen to (0,0)
    // adding a click handler for each link 
    // within the div with the id nav-list
    $('#nav-list a').click(function () {             
        $.scrollTo(this.hash, 1500, {
            easing: 'elasout'
        });
        return false;
    });   
    // adding a click handler for the link at the bottom
    $('a.toNav').click(function () { 
        var scrollTargetId = this.hash;
        $.scrollTo(scrollTargetId, 1500, {
            easing: 'elasout'
        });
        return false;
    });    
});

demo yang berfungsi sepenuhnya di plnkr.co

Anda dapat melihat kode sumber untuk demo.

Pembaruan Mei 2014

Berdasarkan pertanyaan lain saya menemukan solusi lain dari kadaj. Di sini jQuery animate digunakan untuk menggulir ke elemen di dalam <div style=overflow-y: scroll>

 $(document).ready(function () {
    $('.navSection').on('click', function (e) {
        debugger;
        var elemId = "";    //eg: #nav2
        switch (e.target.id) {
        case "nav1":
            elemId = "#s1";
            break;
        case "nav2":
            elemId = "#s2";
            break;
        case "nav3":
            elemId = "#s3";
            break;
        case "nav4":
            elemId = "#s4";
            break;
        }
        $('.content').animate({
            scrollTop: $(elemId).parent().scrollTop() 
                    + $(elemId).offset().top 
                    - $(elemId).parent().offset().top
        }, {
            duration: 1000,
            specialEasing: { width: 'linear'
                    , height: 'easeOutBounce' },
            complete: function (e) {
                //console.log("animation completed");
            }
        });
        e.preventDefault();
    });
  });
person surfmuggle    schedule 19.07.2013
comment
Sementara itu saya membuat biola ini: jsfiddle.net/WxJLx/15.. berhasil di biola, tetapi tidak di wordpress. Bisakah Anda memeriksa kode sumber ini, jika Anda menemukan masalah? Terima kasih: sumber tampilan:anchovyluxury.com/yachts/services - person M P; 19.07.2013
comment
Apa yang sudah Anda coba untuk menemukan kesalahannya? Apakah Anda familiar dengan alat pengembang chrome - alat ini membuatnya sangat mudah untuk menemukan kesalahan: $('a[href^="#"]').click(function(){ di baris 360 dari anchovyluxury. com/yachts/services Apakah Anda memiliki pertanyaan lain mengenai cara menggulir dengan lancar? - person surfmuggle; 19.07.2013
comment
Saya mencoba memasukkan kode yang muncul di jendela bahwa jquery berfungsi. Dan kode saya berfungsi dengan baik, jadi tidak tahu di mana masalahnya. - person M P; 20.07.2013