如何在 AnythingSlider 中应用滑动

发布于 2024-12-15 09:29:48 字数 212 浏览 1 评论 0 原文

我正在使用官方 滑动支持 github.com/ProLoser/AnythingSlider/wiki" rel="nofollow">文档 但它不适用于嵌入式 YouTube 视频。

I'm using the swipe support mentioned in the official documentation but it's not working on embedded youtube videos.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

年少掌心 2024-12-22 09:29:48

问题是 YouTube 视频实际上是带有 HTML5 和嵌入视频的 iframe。因此,在视频上滑动不会注册 iframe 之外的内容。最简单的解决方案是在视频上放置覆盖层并使其仅覆盖视频。这样做的问题是你无法点击视频本身来播放它,你必须使用控件。

这个更新的演示中,覆盖层覆盖了视频并使控件可见(添加一个 background: #f00; 滑动覆盖层 css 即可看到它)。控件的高度为 40 像素,因此您会看到叠加层的高度已考虑到这一点。

这是 css(此演示中滑块的大小为 300 x 200):

.swipe-overlay {
    position: absolute;
    width: 300px;
    height: 160px;
    top: 0;
    left: 0;
}

这是更新的初始化代码:

$('#slider').anythingSlider({

    // Callback when the plugin finished initializing
    onInitialized: function(e, slider) {

        var time = 1000, // allow movement if < 1000 ms (1 sec)
            range = 50,  // swipe movement of 50 pixels triggers the slider
            x = 0, t = 0, touch = "ontouchend" in document,
            st = (touch) ? 'touchstart' : 'mousedown',
            mv = (touch) ? 'touchmove' : 'mousemove',
            en = (touch) ? 'touchend' : 'mouseup';

        $('<div class="swipe-overlay"></div>')
            .appendTo(slider.$window)
            .bind(st, function(e){
                // prevent image drag (Firefox)
                e.preventDefault();
                t = (new Date()).getTime();
                x = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX;
            })
            .bind(en, function(e){
                t = 0; x = 0;
            })
            .bind(mv, function(e){
                e.preventDefault();
                var newx = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX,
                r = (x === 0) ? 0 : Math.abs(newx - x),
                // allow if movement < 1 sec
                ct = (new Date()).getTime();
                if (t !== 0 && ct - t < time && r > range) {
                    if (newx < x) { slider.goForward(); }
                    if (newx > x) { slider.goBack(); }
                    t = 0; x = 0;
                }
            });
    }

});

The problem is YouTube videos are actually iframes with HTML5 and embedded video inside. So, swiping across the video doesn't register with the content outside of the iframe. The easiest solution would be to place an overlay over the video and have it cover just the video. The problem with this is that you can't tap on the video itself to make it play, you have to use the controls.

In this updated demo, the overlay covers the video and leaves the controls visible (add a background: #f00; to the swipe overlay css to see it). The controls are 40 pixels tall so you'll see the height of the overlay takes this into account.

Here is the css (the slider is 300 x 200 in size for this demo):

.swipe-overlay {
    position: absolute;
    width: 300px;
    height: 160px;
    top: 0;
    left: 0;
}

and this is the updated initialization code:

$('#slider').anythingSlider({

    // Callback when the plugin finished initializing
    onInitialized: function(e, slider) {

        var time = 1000, // allow movement if < 1000 ms (1 sec)
            range = 50,  // swipe movement of 50 pixels triggers the slider
            x = 0, t = 0, touch = "ontouchend" in document,
            st = (touch) ? 'touchstart' : 'mousedown',
            mv = (touch) ? 'touchmove' : 'mousemove',
            en = (touch) ? 'touchend' : 'mouseup';

        $('<div class="swipe-overlay"></div>')
            .appendTo(slider.$window)
            .bind(st, function(e){
                // prevent image drag (Firefox)
                e.preventDefault();
                t = (new Date()).getTime();
                x = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX;
            })
            .bind(en, function(e){
                t = 0; x = 0;
            })
            .bind(mv, function(e){
                e.preventDefault();
                var newx = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX,
                r = (x === 0) ? 0 : Math.abs(newx - x),
                // allow if movement < 1 sec
                ct = (new Date()).getTime();
                if (t !== 0 && ct - t < time && r > range) {
                    if (newx < x) { slider.goForward(); }
                    if (newx > x) { slider.goBack(); }
                    t = 0; x = 0;
                }
            });
    }

});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文