JavaScript / Пагинация Div

Я борюсь с ситуацией и решил опубликовать здесь проблему, чтобы посмотреть, сможет ли кто-нибудь понять, где я ошибаюсь.

Идея того, что я делаю, заключается в следующем:

У меня есть страница (на самом деле это и приложение для iPad), которая позволяет пользователю прокручивать влево и вправо, двигаясь вперед и назад. Каждый раз, когда пользователь проводит пальцем влево (движется вперед), мы хотим показать ему новую страницу шириной 768 пикселей. Поскольку каждый div имеет ширину 768 пикселей и у нас может быть более 50 div, идея заключалась в том, чтобы удалить начальную страницу.

Таким образом, у меня всегда на экране 4 элемента div, за раз отображается только 1 элемент div. Итак, при запуске у нас есть что-то вроде ниже.

<content>
<div id='wrapper_1'>content</div>
<div id='wrapper_2'>content</div>
<div id='wrapper_3'>content</div>
<div id='wrapper_4'>content</div>
</content>

Когда пользователь проводит пальцем вправо, я хочу удалить обертку_1, добавить обертку_5 и, в основном, правильно все переставить.

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я удаляю ведущий div, мой контентный div явно меняет ширину, и я теряю страницу, на которую смотрю. Таким образом, очевидное «исправление», на мой взгляд, заключалось в том, чтобы изменить положение контента с учетом только что удаленного элемента div.

Однако я борюсь с методом смещения jquery. Либо я неправильно использую это, либо я что-то упускаю из виду.

 $('#wrapper_'+this.pageArray[0]).remove();
 this.pageArray.shift();    


 var n = pageIndex - 1;
 var t = 768 * n;

 $("#content").offset({ left: t})

Я отслеживаю, какие элементы div находятся на странице, сохраняя их в массиве. Каждый раз, когда я добавляю страницу, я в основном делаю remove() для div, а затем сдвигаю массив. Теперь проблема в том, что смещение не работает так, как я ожидал. В основном не похоже, что левые значения дают мне абсолютную позицию x.

Во-первых, кажется ли такой подход правильным? Во-вторых, мое понимание/реализация смещения неверно?

Редактировать:

Для всех, кто следит за темой, кажется, что моей самой большой проблемой было то, как я справлялся с жестикулированием. Похоже, что были некоторые конфликты событий, использование библиотеки жестов, безусловно, прояснило большую путаницу с моей стороны.

Ниже приведен мой обновленный код, который, похоже, работает хорошо. Не стесняйтесь критиковать подход.

    <html>
    <head>
<style>
    .wrapper{
        height: 200px;
        width: 600px;
        overflow: hidden;
    }
    .button_wrapper{
        width: 600px;
    }
    #content{
        background-color: #F00;
        height: 200px;
        width: 3000px;
    }
    .page{
        width: 200px;
        height: 200px;
        float: left;
        background-color: #FF0;
    }
    #wrapNext{
        width: 100px;
        height: 20px;
        background-color: #FF0000;
        float: right;
        cursor: pointer;
    }
    #wrapPrev{
        width: 100px;
        height: 20px;
        background-color: #FF0000;
        float: left;
        cursor: pointer;
    }

    .site_wrap > .slides_wrap {
        margin-bottom: 1em;
        margin-left: -8px;
        margin-right: -8px;
    }

    .img_slides_wrap {
        width: 784px;
        border: 8px solid #333333;
        background-color: #444444;
        overflow: hidden;
    }

    .img_slide {
        padding: 0;
    }

    .js .img_slide {
        /* Overide template's height transitions. */
        width: 100%;
        height: auto;
    }

    .slide_buttons_index {
        text-align: center;
    }

    .notransition,
    .notransition .slide {
        -webkit-transition-duration: 0 !important;
           -moz-transition-duration: 0 !important;
            -ms-transition-duration: 0 !important;
                transition-duration: 0 !important;

        -webkit-transition-delay: 0 !important;
           -moz-transition-delay: 0 !important;
            -ms-transition-delay: 0 !important;
                transition-delay: 0 !important;
    }

    @media screen and (max-width: 640px) {
        .img_slides_wrap {
            width: 100%;

            -webkit-box-sizing: content-box;
               -moz-box-sizing: content-box;
                -ms-box-sizing: content-box;
                    box-sizing: content-box;
        }
    }
</style>
    </head>
    <body>
<div class='wrapper'>
    <div id='content' class='img_slides_wrap slides_wrap wrap'>
        <div id='page0' class='page'>Page 0</div>
        <div id='page1' class='page'>Page 1</div>
        <div id='page2' class='page'>Page 2</div>
        <div id='page3' class='page'>Page 3</div>
    </div>
</div>
<div class='button_wrapper'>
    <div id='wrapPrev'>
        <div id="prev">Previous</div>
    </div>
    <div id='wrapNext'>
        <div id="next">Next</div>
    </div>
</div>
    </body>
    <script src="jquery.min.js"></script>
    <script src="jquery.event.move.js"></script>
    <script src="jquery.event.swipe.js"></script>

    <script>
    $(document).ready(function() {

var counter = 4;
var selectedPageIndex = 1;
var lastKnownX = 0;
var articleListLength = 10; // testing

$("#next").click(function() {
  showNext();
});

$("#prev").click(function() {
  showPrev();
});


function showNext(){
    if (counter <= articleListLength + 1){
        // first remove the leading div
        var leadingDiv = $('#page'+(counter - 4));
        leadingDiv.animate({ width: '0px' }, 250, function() {
            $(this).remove();
        });
        var html = "<div id='page"+counter+"' class='page img_slide slide'>Page "+counter+"</div>";
        $('#content').append(html);
        counter ++;
        selectedPageIndex ++;   
    }
}

function showPrev(){
    if(counter >= 5){
        var target = selectedPageIndex - 1;
        var leadingDiv = $('#page'+(target));
        var newLeadingDiv = $('#page'+(target - 1));

        var html  = "<div id='page"+(target-1)+"' class='page img_slide slide' style='width:0px'>Page "+(target-1)+"</div>";
        $(html).insertBefore('#page'+(selectedPageIndex-1));

        $('#page'+(target - 1)).animate({ width: '200px' }, 250, function() {

        });
        var removalTarget = $('#page'+(selectedPageIndex + 2));

        removalTarget.remove();

        counter --;
        selectedPageIndex --;  
    }
}

var wrap = jQuery('.slides_wrap'),
    width = wrap.width();

    $('#content')

    .on('swipeleft', function(e) {
        showNext();
    })

    .on('swiperight', function(e) {
        showPrev();
    })


    });
    </script>
    </html>

person Dave Collier    schedule 21.01.2013    source источник
comment
Я не совсем уверен, как это работает в вашем приложении для iPad, но не было бы проще просто всегда показывать 1 div (остальные имеют display:none) и переключать все видимости на касание/пролистывание/прокрутка/какое-либо событие?   -  person Nanne    schedule 21.01.2013
comment
Да, однако проблема заключается в том, чтобы дать iPad анимацию перехода на следующую / предыдущую страницу. По сути, предполагается, что она работает, например, как ваши фотографии.   -  person Dave Collier    schedule 21.01.2013
comment
назначьте переход для решения Nanne, простой класс .transition поможет. Вот пример того, как можно использовать css, чтобы сдвинуть что-то и затемнить его в красивом чистом переходе, я не на 100% уверен, как применить его к вашей ситуации с div, но я уверен, что это может помочь jsfiddle.net/u2FKM/3 я нашел ссылку, опубликованную @jerome.s здесь stackoverflow.com/questions/13968486/   -  person NodeDad    schedule 31.01.2013


Ответы (1)


Здесь есть отличный плагин swipeview для мобильных приложений (android, iphone) и браузеров: http://cubiq.org/swipeview .

Он работает именно так, как вам нужно (вы можете отключить эффект зацикливания) — это демо страница.

Если вы не хотите использовать плагин, он может помочь вам с некоторыми идеями о том, как это сделать.

person Martina    schedule 07.02.2013
comment
Спасибо, что поделились, это выглядит потрясающе и именно то, что я хотел. Хотя у меня есть стабильная рабочая версия, я, безусловно, собираюсь попробовать, и если все получится, я буду использовать эту реализацию. - person Dave Collier; 08.02.2013