【问题标题】:Screen Transition: How to always move from left-to-right屏幕过渡:如何始终从左向右移动
【发布时间】:2012-04-30 11:09:03
【问题描述】:

我正在开发一个电话应用程序,屏幕顶部有两个按钮:“返回”和“下一步”。每当我单击下一个按钮时,屏幕都会从右向左移动,而在大多数情况下,我单击后退按钮,它都会从左向右移动;然而,每隔一段时间,点击“返回”就会从右到左转换。

这是后退按钮的代码:

.html

<a href="#" data-rel="back"  data-role="button" data-inline="true" data-transition="myTransition" data-direction="reverse">Back</a>

.js

(function( $, undefined ) {

$.mobile.page.prototype.options.backBtnText  = "Back";
$.mobile.page.prototype.options.addBackBtn   = false;
$.mobile.page.prototype.options.backBtnTheme = null;
$.mobile.page.prototype.options.headerTheme  = "a";
$.mobile.page.prototype.options.footerTheme  = "a";
$.mobile.page.prototype.options.contentTheme = null;

$( document ).delegate( ":jqmData(role='page'), :jqmData(role='dialog')", "pagecreate", function( e ) {

var $page = $( this ),
    o = $page.data( "page" ).options,
    pageRole = $page.jqmData( "role" ),
    pageTheme = o.theme;

$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() {
    var $this = $( this ),
        role = $this.jqmData( "role" ),
        theme = $this.jqmData( "theme" ),
        contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ),
        $headeranchors,
        leftbtn,
        rightbtn,
        backBtn;

    $this.addClass( "ui-" + role ); 

    //apply theming and markup modifications to page,header,content,footer
    if ( role === "header" || role === "footer" ) {

        var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme;

        $this
            //add theme class
            .addClass( "ui-bar-" + thisTheme )
            // Add ARIA role
            .attr( "role", role === "header" ? "banner" : "contentinfo" );

        // Right,left buttons
        $headeranchors  = $this.children( "a" );
        leftbtn = $headeranchors.hasClass( "ui-btn-left" );
        rightbtn = $headeranchors.hasClass( "ui-btn-right" );

        leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;

        rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;

        // Auto-add back btn on pages beyond first view
        if ( o.addBackBtn && 
            role === "header" &&
            $( ".ui-page" ).length > 1 &&
            $this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) &&
            !leftbtn ) {

            backBtn = $( "<a href='#' class='ui-btn-left' data-"+ $.mobile.ns +"rel='back' data-"+ $.mobile.ns +"icon='arrow-l'>"+ o.backBtnText +"</a>" )
                // If theme is provided, override default inheritance
                .attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme )
                .prependTo( $this );                
        }

        // Page title
        $this.children( "h1, h2, h3, h4, h5, h6" )
            .addClass( "ui-title" )
            // Regardless of h element number in src, it becomes h1 for the enhanced page
            .attr({
                "tabindex": "0",
                "role": "heading",
                "aria-level": "1"
            });

    } else if ( role === "content" ) {
        if ( contentTheme ) {
            $this.addClass( "ui-body-" + ( contentTheme ) );
        }

        // Add ARIA role
        $this.attr( "role", "main" );
    }
});
});

})( jQuery );

编辑:

这是我创建的过渡

function myTransitionHandler( name, reverse, $to, $from ) {

var deferred = new $.Deferred(),
    reverseClass = reverse ? " reverse" : "",
    viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,
    doneFunc = function() {

        $to.add( $from ).removeClass( "out in reverse " + name );

        if ( $from && $from[ 0 ] !== $to[ 0 ] ) {
            $from.removeClass( $.mobile.activePageClass );
        }

        $to.parent().removeClass( viewportClass );

        deferred.resolve( name, reverse, $to, $from );
    };

$to.animationComplete( doneFunc );

$to.parent().addClass( viewportClass );

if ( $from ) {
    $from.addClass( name + " out" + reverseClass );
}
$to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass );

return deferred.promise();
}

// Make our transition handler public.
$.mobile.transitionHandlers["myTransition"] = myTransitionHandler;

我可以添加任何代码来使单击后退按钮时屏幕始终从左向右移动吗?

【问题讨论】:

    标签: javascript jquery html jquery-mobile transition


    【解决方案1】:

    jQuery mobile 似乎只允许您指定转换 (seen here),然后在您指定 data-direction="reverse" 属性时为其相反的方向编程。

    我也遇到过这种行为,即后退按钮(甚至是浏览器的后退按钮)有时会触发“向前作用”转换。我不会去改变这个/强制一个按钮总是在同一个方向上转换。

    不过,setting up your own transitions 中可能会有一些承诺。如果您要这样做(我没有这样做),那么无论 jQuery mobile 认为它是正向还是反向,并且无论 data-direction 属性如何,您都可以应用只向一个方向进行的转换。

    .my.slide.out {
        -webkit-transform: translateX(-100%);
        -moz-transform: translateX(-100%);
        -webkit-animation-name: slideouttoleft;
        -moz-animation-name: slideouttoleft;
    }
    .my.slide.in {
        -webkit-transform: translateX(-100%);
        -moz-transform: translateX(-100%);
        -webkit-animation-name: slideouttoleft;
        -moz-animation-name: slideouttoleft;
    }
    

    然后将这些过渡应用到您的后退按钮。

    【讨论】:

    • 我尝试将自己的过渡添加到页面,但这对页面移动的方式没有影响
    • @HipHipArray;您是否将 data-transition 属性指定为您创建的新转换的名称?您可能想用您尝试过的内容更新您的问题。你应该做一些与默认设置完全不同的事情,直到你确定你正在使用你创建的过渡。
    • 是的,我确实将创建的转换添加到数据转换属性...我将编辑我的问题并添加我创建的内容
    • @HipHipArray;感谢您更新问题,但我没有看到您的转换定义 - 只是转换处理程序。我的建议仍然是,在您确定已将属性连接到自定义转换之前,您将做一些与向左/向右滑动截然不同的事情。在您确定它正在使用您的之前,它可能只是回退到默认转换。也许尝试创建自定义颜色“过渡”、淡化等...当您确信它正在使用您的颜色时,您可以放弃使用 reverse 属性,而始终从左到右过渡。
    • 对不起,我已经完成了过渡定义,我会在下一次编辑时添加,但是这是一个非常好的主意,我会尝试大幅更改过渡,以便我可以确保它正在工作,然后将其更改为移动我想要的方式.. 会让您知道我的进展情况并更新我的答案
    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多