Pregunta

Tengo n cuadros de tamaño igual en un contenedor de caja absolutamente posicionada de ancho de boxwidth * n.Esto reside en un recipiente relativamente posicionado con un desbordamiento oculto.Hay múltiples filas.En un caso izquierdo o derecho La posición horizontal del recipiente de la caja agregará o restará 1 ancho de caja de los recipientes de la posición izquierda en la dirección deslizada sin exceder sus posiciones máxes (0, 0) y ((boxwidthtth * n), 0)

Ejemplo

http://jsfiddle.net/rte8u/8/

Esta es una versión simple de lo que actualmente enrolla, y funciona, sin embargo, si se realizan dos swipes antes de que se complete la transición CSS, se hace referencia a la posición "actual" incorrecta.¿Qué puedo hacer al respecto?

html

<div class="widget a">
    <div class="overflow">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
    </div>
</div>
<div class="widget b">
    <div class="overflow">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
    </div>
</div>
<div class="widget c">
    <div class="overflow">
        <div class="box">1</div>
        <div class="box">2</div>
    </div>
</div>
<div class="widget d">
    <div class="overflow">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
    </div>
</div>

css

* {
    margin:0;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}
.widget {
    width: 200px;
    position: relative;
    height: 100px;
    overflow: hidden;
}
.overflow {
    transition: all 0.5s ease-out;
    -o-transition: all 0.5s ease-out;
    -moz-transition: all 0.5s ease-out;
    -webkit-transition: all 0.5s ease-out;
    height: 100px;
    position:absolute;
    left: 0;
}
.box {
    user-select: none;
    -o-user-select: none;
    -moz-user-select: none;
    -webkit-user-select: none;
    float: left;
    text-align:center;
    line-height: 100px;
    width: 200px;
    height: 100px;
    border: 1px solid #000;
}
.box:hover{
    cursor:pointer;
}

js

var fullbox = '200',
    overflows = [$('.a .overflow'),$('.b .overflow'),$('.c .overflow'),$('.d .overflow')];

// Set Widths of Overflow Boxes
for (var i=0; i < 4; i++){
    overflows[i].width(overflows[i].children().length * fullbox);   
}

// Swipe Handlers
$('.overflow').on({
    swipeleft: function () {
        if ($(this).position().left != '-' + ($(this).children().length - 1) * fullbox) {
            $(this).css('left', '-=' + fullbox);
        }
    },
    swiperight: function () {
        if ($(this).position().left !== 0) {
            $(this).css('left', '+=' + fullbox);
        }
    }
});

¿Fue útil?

Solución

Probablemente no quiera detener el gesto mientras las cajas están en transición.Desde un punto de soporte de experiencia de usuario, si me giré dos veces, probablemente esperé que las casillas se muevan dos veces hasta el momento.Un método que podría usar es en lugar de detectar las posiciones de las casillas y moverse con respecto a la posición es mantener la pestaña de los cuales el índice se encuentra el usuario. Mantenga un seguimiento en una var o en la propia DOM:

<div class="overflow" data-index="0">
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
    <div class="box">4</div>
    <div class="box">5</div>
</div>

Luego, cambio los gestos de deslizamiento para rastrear el índice como tal:

$('.overflow').on({
  swipeleft: function () {
    var currentPosition = parseInt($(this).attr('data-index'));
    var totalBoxes = $(this).children('.box').length - 1;

    // Calculate the next position and ensure it doesn't pass the last box.
    var nextPosition = currentPosition + 1;
    if (nextPosition >= totalBoxes) {
        nextPosition = totalBoxes;
    }

    moveBox($(this), nextPosition);
  },
  swiperight: function () {
    var currentPosition = parseInt($(this).attr('data-index'));

    // Calculate the next position and ensure it doesn't pass the first box.
    var nextPosition = currentPosition - 1;
    if (nextPosition < 0) {
        nextPosition = 0;
    }

    moveBox($(this), nextPosition);
  }
});

La función MoveBox:

function moveBox($ele, position) {
    var movePosition = parseInt(fullbox) * position;

    $ele
        .attr('data-index', position)
        .css('left', '-' + movePosition + 'px');
}

http://jsfiddle.net/rte8u/11/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top