【问题标题】:Creating simple pure Javascript slider on swipe for mobile devices在移动设备的滑动上创建简单的纯 Javascript 滑块
【发布时间】:2018-11-11 19:04:19
【问题描述】:

我想为在小屏幕尺寸上搜索图像创建类似于谷歌滑块的东西,只需缩小浏览器宽度或从手机访问它,然后在谷歌搜索框中输入“图像”,例如,您将看到 3 张图像在 Google 搜索框下方,您可以滑动以显示更多图片。

因此将有大约 6 张图像彼此相邻,但 2 张完全显示,第三张图像的一半左右,而其他 3 张将被隐藏。

当用户向左滑动第 3 张图像时,其他 3 张图像将变得可见,如果用户已经向左滑动,则应该仍然可以向右滑动以显示第一张图像。

我尝试在谷歌上分析过,但是有些元素我第一次看到,我不知道如何找到相关的JS函数,如果这是用纯JS做的。

这就是我到目前为止所尝试的:

var ImageIndex = 0;

function swipe(event){
    var touch = event.targetTouches[0];
    var midpoint = Math.floor(screen.width/2);
    var px = touch.pageX;
    var items = document.getElementsByClassName('image-wrapper');
    var itemActive = items[ImageIndex]; 
    if(px < midpoint){
        itemActive.style.marginLeft = '-100%';
        itemActive.style.transition = '1s';
        if (ImageIndex < items.length) {
            ImageIndex = ImageIndex + 1;
        }else{
            ImageIndex = 0;
        }
    }else{
        itemActive.style.marginLeft = '0px';
        itemActive.style.transition = '1s';
        if (ImageIndex >= 1 ) {
            ImageIndex = ImageIndex - 1;
        }else{
            ImageIndex = 0;
        }
    }
}

CSS:

.images-gallary{
    background-color: #000;
    overflow: hidden;
    height: 73px;
    white-space: nowrap;
}

.image-wrapper{
    width: 100%;
    display: inline-block;
    text-align: center;
}

#secondItem{
    background: #fff;
}

HTML:

<div class="images-gallary" ontouchmove="swipe(event)">
    <div class="image-wrapper" id="firstItem">
        <img class="image" src="http://placehold.it/73/200">
    </div>
    <div class="image-wrapper" id="secondItem">
        <img class="image" src="http://placehold.it/73/300">
    </div>
    <div class="image-wrapper">
        <img class="image" src="http://placehold.it/73/400">
    </div>
</div> <!-- .images-gallary -->

这段代码只是滑动前 2 张图片,我得到一个错误:

Uncaught TypeError: Cannot read property 'style' of undefined

那么如何自定义该代码以按顶部所述工作?

我不想使用 Jquery 或任何库,只是纯 JS 代码。

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    所以你的问题是在这种情况下if (ImageIndex &lt; items.length) {。您总共有 3 个元素,因此当 ImageIndex 为 2 时,它会将其增加到 3 并且您在 html 中有 3 个图像 items[ImageIndex] 将返回未定义。

    所以将条件改为if (ImageIndex &lt; items.length - 1) {

    【讨论】:

    • 你是对的,修复了错误,但是如何实现 2 和半图像的想法?
    • 在初始状态下用户向左滑动时应该是什么行为。它应该移动到第二张图片还是第三张?
    • 现在有 6 张图片,我想要以下 2 种情况中的 1 张:完全显示 1-2 张图片,隐藏第 3 张图片和最后 3 张图片的一部分,当用户向左滑动第 3 张图片的隐藏部分会显示出来,另外 3 张图片也会显示,如果用户向左滑动,他可以再次向右滑动
    • 案例2:显示3张图片/1张图片,用户可以在滑动时滑动显示其他3张。
    • 还有一件事,当我向左滑动图像时,3 个图像容器占用margin-left: -100%,所以当我滑动第一个图像时,只有 3 个图像被移出屏幕,并且只有主容器images-gallary 可见
    【解决方案2】:

    将您的第一个条件ImageIndex &lt; items.length 替换为ImageIndex &lt; (items.length - 1),因为此处的总图像长度为3,并尝试访问items[3] 的样式(undefined

    if (ImageIndex < (items.length - 1)) {
       ImageIndex = ImageIndex + 1;
    }else {
       ImageIndex = 0;
    }
    

    在第二种情况下你应该在其他情况下用ImageIndex = items.length - 1;替换ImageIndex = 0;,因为在px &gt; midpointImageIndex &lt; 1的情况下总是初始化相同的值ImageIndex = 0;

    if (ImageIndex >= 1 ) {
       ImageIndex = ImageIndex - 1;
    }else {
       ImageIndex = items.length-1;
    }
    

    您的最终代码如下所示:

    var ImageIndex = 0;
    
    function swipe(event){
        var touch = event.targetTouches[0];
        var midpoint = Math.floor(screen.width/2);
        var px = touch.pageX;
        var items = document.getElementsByClassName('image-wrapper');
        var itemActive = items[ImageIndex]; 
        if(px < midpoint){
            itemActive.style.marginLeft = '-100%';
            itemActive.style.transition = '1s';
            if (ImageIndex < (items.length - 1)) {
                ImageIndex = ImageIndex + 1;
            }else{
                ImageIndex = 0;
            }
        }else{
            itemActive.style.marginLeft = '0px';
            itemActive.style.transition = '1s';
            if (ImageIndex >= 1 ) {
                ImageIndex = ImageIndex - 1;
            }else{
                ImageIndex = items.length - 1;
            }
        }
    }
    

    【讨论】:

    • 谢谢我更新了它,你有方法来实现问题顶部的想法吗?
    • 还有一件事,当我向左滑动图像时,3 个图像容器占用margin-left: -100%,所以当我滑动第一个图像时,只有 3 个图像被移出屏幕,并且只有主容器images-gallary 可见
    • 第二个你可以为所有图像提供默认 css,并且一次应该激活一个图像,其他图像将使用默认 css,如大量使用translate。活动图像将可见。
    • 我想始终显示 3 张图片,共 6 张,用户可以向左和向右滑动每次显示一张并隐藏另一张
    • @maxwell 最初所有 3 个图像都应该处于活动状态,所有其他图像都应该默认 css。根据您向左或向右滑动添加和删除类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多