javascript - 在触摸设备上悬停状态后启用链接而不影响正常滚动

标签 javascript jquery css hover touch

我有一个 figure 元素,它有一个悬停状态,影响图中的其他元素; imgfigcaption 等。通过使用以下 jQuery,我已经能够在触摸设备上“工作”这种效果:

$('.portfolio__img').on("touchEnd", function (e) {
    "use strict"; //satisfy the code inspectors
    var link = $(this); //preselect the link
    if ( $( link ).hasClass( "portfolio__img--taphover" ) ) {
        return true;
    } else {
        link.addClass("portfolio__img--taphover");
        $('.portfolio__img').not(this).removeClass("portfolio__img--taphover");
        e.preventDefault();
        return false; //extra, and to make sure the function has consistent return points
    }
})

// portfolio__img--taphover` has the same CSS rules as `figure:hover, figure:focus`

我忘记了从哪里获得代码,但那是一篇博文。这工作得很好,但我对它并不完全满意。如果您触摸并滚动,那么向下滚动页面很长一段距离,您可能会错过悬停效果,因为该元素可能不在 touchEnd 的视口(viewport)内。但是,我的图形元素是 100% 宽度,因此使用 touchStart 会影响滚动,因为当用户触摸屏幕时会立即应用悬停效果。我环顾四周,似乎没有 touchTap 或类似事件。我想这是因为如果用户正在触摸(点击)屏幕以显示某些内容,或者触摸以滑动和滚动,则很难确定。我尝试了 touchMove,但效果不佳。

我确信有一种方法可以使用 CSS 实现,例如让我的覆盖链接具有较低的 z-index,它只会在悬停时变得更高。或许我可以将 z-index 更改延迟到点击事件之后,但我仍然会陷入检测点击与触摸/滚动的整个问题。有没有其他人遇到过这种行为并为此感到恼火,和/或找到了解决方案?

我的 HTML:

<figure class="grid__item  mobile--one-half  desk--one-quarter  portfolio__img">

    <img class="portfolio__test" srcset="<?php echo $image_src; ?> 1536w, 
        <?php echo $image_src_1024; ?> 1024w, 
        <?php echo $image_src_900; ?> 900w, 
        <?php echo $image_src_600; ?> 600w,
        <?php echo $image_src_320; ?> 320w"
    sizes="(min-width: 78.75em) 25vw, (min-width: 30em) 50vw, 100vw" 
    alt="<?php the_field( 'portfolio_alt_text' ); ?>">
    <figcaption>
        <div class="table">
            <div class="table-cell">
                <h2><?php the_sub_field( 'portfolio_description' ); ?></h2>
            </div>
        </div>
    </figcaption>
    <a class="portfolio__link" href="<?php the_sub_field( 'portfolio_link' ); ?>">View More</a>

</figure>

相关 CSS:

.portfolio__link {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    z-index: 1;
}

干杯。一旦我找到一个好的解决方案,我会在适当的时候更新这个问题,以防没有人有!

编辑:更新了 Codepen 示例

所以我意识到我之前并没有那么清楚,所以我做了几个代码笔来说明我遇到的问题:

没有正确的链接(href="#")http://codepen.io/patrickwc/pen/yyYVeV

如果您使用触摸设备触摸这些链接,悬停效果会起作用并且非常好。您仍然可以在不触发悬停效果的情况下滑动和滚动,当您在触摸前一个框后触摸另一个框时,效果会停止在前一个框上并很好地应用于当前框。我正在寻找这种行为。 @Edgar Sanchez 你提到了 permorance,它不是 jank 或任何事实,只要你触摸框,使用 touchstart,效果就会触发。我想要的是像悬停效果这样的效果,它仍然允许您滑动和滚动过去而不会触发悬停状态(或 --taphover 类)。

使用正确的链接(无 js)http://codepen.io/patrickwc/pen/jEbVWq

显然,现在这些盒子不能很好地工作。浏览器试图将您带到 http://www.something.com/立即,不考虑悬停状态。

理想情况下,我想要一些仅在悬停状态后启用 jac-rollover__link 的 javascript。我想这实际上可行,也许 jquery 的悬停状态可以使该类使它的 z-index 更高……我现在就试一试。

最佳答案

我设法通过纯 CSS 让它工作。我把 visibility: hidden 放在 jac-rollover__link 上,然后我在可见性上使用了 CSS transition,长度为 0s 但延迟为 0.5s,这是同时悬停效果需要完成。所以,viola 没有 javascript,它在我目前测试过的所有东西上都运行良好。我想几乎所有的触摸设备都支持 CSS 转换,所以应该没问题。

代码以防对他人有帮助:

.jac-rollover {
    ...

    &:hover,
    &:focus {

        .jac-rollover__link {
            visibility: visible;
            transition: visibility 0s 0.5s;
        }
    }
}

.jac-rollover__link {
    ...
    visibility: hidden;
}

关于javascript - 在触摸设备上悬停状态后启用链接而不影响正常滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065430/

相关文章:

javascript - 客户关系管理 2011 "$ is undefined"

javascript - 用 javascript 制作的动画 li - 为什么它们都同时移动?

javascript - col可调整大小的行显示 :none; and the custom anchors relating to the row to have a display:none;

javascript - 内联 div 没有排成一行

jQuerymobile : The alert in mobile safari shows -- file://null

html - 使用 HTML/CSS 制作两个行的 div

javascript - 我想使用纯 javaScript 通过 webRTC 进行点对点视频聊天

javascript - 使用 AJAX 下载 PHP 创建的 PDF

javascript - 如果 Sequelize 中不存在嵌套记录,如何获取所有记录

jquery-ui 自动完成 : set source by callback function not working