【问题标题】:Disable Swipe Gesture Until CSS Transition is Finished在 CSS 转换完成之前禁用滑动手势
【发布时间】:2014-09-24 00:16:32
【问题描述】:

我在一个绝对定位的 boxWidth * n 宽度容器中有 n 个大小相等的盒子。这位于一个相对定位的容器中,具有隐藏的溢出。有多行。在向左或向右滑动时,盒子容器的水平位置将在滑动方向上从容器左侧位置增加或减少 1 个 boxWidth,但不会超过其最大位置 (0, 0) 和 ((boxWidth * n), 0)

http://jsfiddle.net/rTe8U/8/

这是我目前正在使用的一个简单版本,它可以工作,但是,如果在 css 转换完成之前进行了两次滑动,则引用了错误的“当前”位置。我该怎么办?

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);
        }
    }
});

【问题讨论】:

标签: jquery css jquery-ui jquery-mobile css-transitions


【解决方案1】:

您可能不想在框处于过渡状态时停止手势。从用户体验的角度来看,如果我滑动两次,我可能会期望这些框移动两倍。您可以使用的一种方法不是检测框位置并相对于该位置移动,而是保留用户所在索引的选项卡。在 var 或 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>

然后我改变滑动手势来跟踪索引:

$('.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);
  }
});

moveBox函数:

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

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

http://jsfiddle.net/rTe8U/11/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多