weui 多网页切换效果分析

weui的文档写的不怎么详尽,简单的来讲WeUI 为微信 Web 服务量身设计的h5框架。

WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含button、cell、dialog、 progress、 toast、article、icon等各式元素。

严格的讲它是一个css库。算一个精简的库。

如果要用jQuery开发的话,head部分,需要加载如下信息:

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0" />
        <title>我的</title>
         <link rel="stylesheet" href="https://cdn.bootcss.com/weui/1.1.0/style/weui.min.css" />   //weui的压缩版css
         <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-weui/0.8.0/css/jquery-weui.min.css">   //jQuery weui的压缩版css,因为这个UI会提供比较多的插件
        <link rel="stylesheet" href="../css/example.css"/>    //weui 官方demo提供的css
        <link rel="stylesheet" type="text/css" href="../css/jiaj.css" />    //我们实际场景使用的css
        <script src="../js/libs/storage.js"></script>    //我们开发中需要用到的storage方法
        <script src="../js/config.js"></script>    //我们开发中需要用到的服务器配置文件
        <script src="../js/interface.js"></script>   //我们开发中需要使用到的接口文件
    </head>

body中根据官方文档,需要给body添加属性ontouchstart。

多页操作的demo模板:

<script type="text/html" id="tpl_myDoctor">   //每个模板id对应body中a标签的id,tpi_是模板id的前缀
           <div class="page">   //每个模板内容都要放在page里
                <!--医生列表-->
                <div class="weui-cells">
                    <div class="weui-panel__bd">
                        <div class="weui-media-box weui-media-box_appmsg">
                            <div class="weui-media-box__hd">
                                <img class="weui-media-box__thumb" src="../img/doctor/55.jpg" >
                            </div>
                            <div class="weui-media-box__bd">
                                <h4 class="weui-media-box__title">潘仁和</h4>
                                <p class="weui-media-box__desc">骨科</p>
                                <p class="weui-media-box__desc">上海交通大学医学院附属瑞金医院</p>
                            </div>
                            <div class="weui_jia_cell_ft"></div>
                        </div>
                    </div>
                </div>
                <div class="weui-cells">
                    <div class="weui-panel__bd">
                        <div class="weui-media-box weui-media-box_appmsg">
                            <div class="weui-media-box__hd">
                                <img class="weui-media-box__thumb" src="../img/doctor/55.jpg" >
                            </div>
                            <div class="weui-media-box__bd">
                                <h4 class="weui-media-box__title">潘仁和</h4>
                                <p class="weui-media-box__desc">骨科</p>
                                <p class="weui-media-box__desc">上海交通大学医学院附属瑞金医院</p>
                            </div>
                            <div class="weui_jia_cell_ft"></div>
                        </div>
                    </div>
                </div>
            </div>
        </script>

我们再看模板页面对应在body中的a标签:

<body ontouchstart>   //wap上要触发按钮的active态,必须触发ontouchstart事件,可以在body上加上ontouchstart 全局触发
    <div class="container js_container">    //class 为 js_container,当触发点击事件时,实际上是在点击js_container
          <div class="page">
                //这里是定义与响应模板内容的

                //以cell为我的医生为例
                <div class="weui-cells">
                    <a href="javascript:;" class="weui-cell weui-cell_access js_cell" data-id="myDoctor">   //当点击这个a标签时,触发ontouchstart的js_container,会把class为js_cell绑定到这个触发事件上
                        <div class="weui-cell__bd">
                            <p>我的医生</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                </div>

          </div>
    </div>
    <script src="https://res.wx.qq.com/open/libs/zepto/1.1.6/zepto.js"></script>
    <script src="../js/libs/example.js"></script>   //官方提供的页面切换js
    <script src="https://res.wx.qq.com/open/libs/weuijs/1.0.0/weui.min.js"></script>   //weui js
        <!--tabbar-->
    <script type="text/javascript" src="../js/doctor/tab.js"></script></body>    

凡跳转网页的效果定义与响应,给a标签添加:

<a class="weui_cell js_cell" href="javascript:;" data-id="button">
    <span class="weui_cell_hd">
      <img src="/images/icon_nav_button.png" class="icon_nav" alt=""></span>
    <div class="weui_cell_bd weui_cell_primary">
        <p>Button</p>
    </div>
    <div class="weui_cell_ft">
    </div>
</a>
  • class="weui_cell js_cell"
  • data-id="button"
// page stack
    var stack = [];
    var $container = $(‘.js_container‘);
    $container.on(‘click‘, ‘.js_cell[data-id]‘, function () {
        var id = $(this).data(‘id‘);
        go(id);
    });

头几行,定义了一个stack,我们想一下那个推进来的效果,

  • 默认显示,为栈的第一个元素
  • 如果push进来就,stack里push一个,设置为当前显示的
  • 如果点击返回呢,stack里pop出去最后一个,设置上一个为显示的
  • 如果返回了栈顶,点返回就没效果了

这里的click事件,它的事件是.js_cell[data-id]

也就是class=js_cell,并且有data-id属性。

对比一下button的按钮

<a class="weui_cell js_cell" href="javascript:;" data-id="button">

如此,大概你就该明白了。

那么事件里面是

var id = $(this).data(‘id‘);
go(id);

就用button这个例子讲,这个id应该是data-id="button"里的button,对吧?

然后go就跳转了,也就是push的效果应该是它弄的

function go(id){
    var $tpl = $($(‘#tpl_‘ + id).html()).addClass(‘slideIn‘).addClass(id);
    $container.append($tpl);
    stack.push($tpl);
    // why not use `history.pushState`, https://github.com/weui/weui/issues/26
    //history.pushState({id: id}, ‘‘, ‘#‘ + id);
    location.hash = ‘#‘ + id;

    $($tpl).on(‘webkitAnimationEnd‘, function (){
        $(this).removeClass(‘slideIn‘);
    }).on(‘animationend‘, function (){
        $(this).removeClass(‘slideIn‘);
    });
    // tooltips
    if (id == ‘cell‘) {
        $(‘.js_tooltips‘).show();
        setTimeout(function (){
            $(‘.js_tooltips‘).hide();
        }, 3000);
    }
}

看一下源码

  • $container.append($tpl);是dom元素插入
  • stack.push($tpl); 视图栈压入最新的
  • location.hash = ‘#‘ + id;是pushstate更改url地址
  • 其他就是动画或者根据id干点坏事了

稍微注意一下:我们push的页面从哪里来的?

 var $tpl = $($(‘#tpl_‘ + id).html()).addClass(‘slideIn‘).addClass(id);
 $container.append($tpl);

我们知道id是data-id="button"里的button,也就是说我们要根据id=“tpl_button”来找模板里的html。

想想我们之前是不是拷贝了一个这样的模板?

ok,只要是class=js_cell,并且有data-id属性的就会触发点击时间,根据tpl_button里的内容显示(push)。

这是push,那么返回pop呢?

// location.hash = ‘#hash1‘ 和点击后退都会触发`hashchange`,这个demo页面只关心后退
$(window).on(‘hashchange‘, function (e) {
    if (/#.+/gi.test(e.newURL)) {
        return;
    }
    var $top = stack.pop();
    if (!$top) {
        return;
    }
    $top.addClass(‘slideOut‘).on(‘animationend‘, function () {
        $top.remove();
    }).on(‘webkitAnimationEnd‘, function () {
        $top.remove();
    });
});

ocation.hash变了

  • var $top = stack.pop();很明显出栈了
  • if (!$top) {return;} 是如果栈顶,不做操作
  • 然后处理$top,然后出栈的视图移除掉

最外面的视图移除了,很明显就是上一个视图显示了。

so,原理就是这么简单.

下面是全部的代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0" />
        <title>患者我的</title>
         <link rel="stylesheet" href="https://cdn.bootcss.com/weui/1.1.0/style/weui.min.css" />
         <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-weui/0.8.0/css/jquery-weui.min.css">
        <link rel="stylesheet" href="../css/example.css"/>
        <link rel="stylesheet" type="text/css" href="../css/jiaj.css" />
        <script src="../js/libs/storage.js"></script>
        <script src="../js/config.js"></script>
        <script src="../js/interface.js"></script>
    </head>
    <body ontouchstart>
        <div class="container js_container">
            <div class="page">
                <!--头像-->
                <div class="weui-jiaj-panel">
                    <div class="weui-jia-cell-column-center">
                        <img src="../img/doctor/55.jpg" alt="代表头像" class="weui-jiaj-img" />
                        <h4 class="weui-media-box__title">礼拜五</h4>
                    </div>
                </div>
                <!--帮助多少人-->
                <div class="weui-jiaj-panel">
                    <div class="weui-jia-cell-row">
                        <h4 class="weui-jiaj-media-doctor-title-gray">共问诊</h4>
                        <h2 class="weui-media-box__title weui-jiaj-media-doctor-title">1</h2>
                        <h4 class="weui-media-jiaj-title-gray">人</h4>
                    </div>
                </div>

                <div class="weui-cells">
                    <a href="javascript:;" class="weui-cell weui-cell_access js_cell" data-id="myDoctor">
                        <div class="weui-cell__bd">
                            <p>我的医生</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                </div>

                <div class="weui-cells">
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>我的提问</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>我看过的答案</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                </div>

                <div class="weui-cells">
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>我的信息</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>修改手机号</p>
                        </div>
                        <div class="weui-cell__ft">
                            13918185896
                        </div>
                    </a>
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>扫一扫</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                </div>

                <div class="weui-cells">
                    <a href="" class="weui-cell weui-cell_access">
                        <div class="weui-cell__bd">
                            <p>我的钱包</p>
                        </div>
                        <div class="weui-cell__ft">
                        </div>
                    </a>
                </div>
                <!--底部菜单-->
                <div class="weui-tabbar" style="height: 45px;position: fixed;">
                    <li class="weui-navbar__item weui-bar__item_on">发现</li>
                    <li class="weui-navbar__item">问医生</li>
                    <li class="weui-navbar__item">我的</li>
                </div>
            </div>
        </div>
        <!--医生列表模板-->
        <script type="text/html" id="tpl_myDoctor">
           <div class="page">
                <!--医生列表-->
                <div class="weui-cells">
                    <div class="weui-panel__bd">
                        <div class="weui-media-box weui-media-box_appmsg">
                            <div class="weui-media-box__hd">
                                <img class="weui-media-box__thumb" src="../img/doctor/55.jpg" alt="">
                            </div>
                            <div class="weui-media-box__bd">
                                <h4 class="weui-media-box__title">潘仁和</h4>
                                <p class="weui-media-box__desc">骨科</p>
                                <p class="weui-media-box__desc">上海交通大学医学院附属瑞金医院</p>
                            </div>
                            <div class="weui_jia_cell_ft"></div>
                        </div>
                    </div>
                </div>
                <div class="weui-cells">
                    <div class="weui-panel__bd">
                        <div class="weui-media-box weui-media-box_appmsg">
                            <div class="weui-media-box__hd">
                                <img class="weui-media-box__thumb" src="../img/doctor/55.jpg" alt="">
                            </div>
                            <div class="weui-media-box__bd">
                                <h4 class="weui-media-box__title">潘仁和</h4>
                                <p class="weui-media-box__desc">骨科</p>
                                <p class="weui-media-box__desc">上海交通大学医学院附属瑞金医院</p>
                            </div>
                            <div class="weui_jia_cell_ft"></div>
                        </div>
                    </div>
                </div>
            </div>
        </script>
        <script src="https://res.wx.qq.com/open/libs/zepto/1.1.6/zepto.js"></script>
        <script src="../js/libs/example.js"></script>
        <script src="https://res.wx.qq.com/open/libs/weuijs/1.0.0/weui.min.js"></script>
        <!--tabbar-->
        <script type="text/javascript" src="../js/doctor/tab.js"></script>
    </body>
</html>

效果国A  <->  B:

官方切换效果js:

/**
 * Created by jfengjiang on 2015/9/11.
 */

$(function () {
    // page stack
    var stack = [];
    var $container = $(‘.js_container‘);
    //这里的click事件,它的事件是.js_cell[data-id],也就是class=js_cell,并且有data-id属性
    $container.on(‘click‘, ‘.js_cell[data-id]‘, function () {
        //用button这个例子讲,这个id应该是data-id="button"里的button
        //然后go就跳转了,也就是push的效果应该是它弄的
        var id = $(this).data(‘id‘);
        go(id);
    });

    //返回页方法
    //location.hash = ‘#hash1‘ 和点击后退都会触发`hashchange`,这里操作面的后退操作
    //location.hash变了
    $(window).on(‘hashchange‘, function (e) {
        if (/#.+/gi.test(e.newURL)) {
            return;
        }
        //var $top = stack.pop();很明显出栈了
        var $top = stack.pop();
        //if (!$top) {return;} 是如果栈顶,不做操作
        if (!$top) {
            return;
        }
        //给$top添加或删除页面动画的css
        $top.addClass(‘slideOut‘).on(‘animationend‘, function () {
            $top.remove();
        }).on(‘webkitAnimationEnd‘, function () {
            $top.remove();
        });
    });

    //跳转页 方法
    function go(id){
        //push的页面从哪里来呢?
        //id是data-id="button"里的button,也就是说我们要根据id=“tpl_button”来找模板里的html。
        //只要是class=js_cell,并且有data-id属性的就会触发点击时间,根据tpl_button里的内容显示(push)
        //这就是push,跳转到子页的方法
        var $tpl = $($(‘#tpl_‘ + id).html()).addClass(‘slideIn‘).addClass(id);
        //$container.append($tpl);是dom元素插入
        $container.append($tpl);
        //stack.push($tpl); 视图栈中push最新的页面
        stack.push($tpl);
        //location.hash = ‘#‘ + id;是pushstate更改url地址
        location.hash = ‘#‘ + id;

        //下面是页面的动画而添加或删除的class
        $($tpl).on(‘webkitAnimationEnd‘, function (){
            $(this).removeClass(‘slideIn‘);
        }).on(‘animationend‘, function (){
            $(this).removeClass(‘slideIn‘);
        });
        // 消息提醒
        if (id == ‘cell‘) {
            $(‘.js_tooltips‘).show();
            setTimeout(function (){
                $(‘.js_tooltips‘).hide();
            }, 3000);
        }
    }

    if (/#.*/gi.test(location.href)) {
        go(location.hash.slice(1));
    }

    // toast
    $container.on(‘click‘, ‘#showToast‘, function () {
        $(‘#toast‘).show();
        setTimeout(function () {
            $(‘#toast‘).hide();
        }, 5000);
    });
    $container.on(‘click‘, ‘#showLoadingToast‘, function () {
        $(‘#loadingToast‘).show();
        setTimeout(function () {
            $(‘#loadingToast‘).hide();
        }, 5000);
    });

    $container.on(‘click‘, ‘#showDialog1‘, function () {
        $(‘#dialog1‘).show();
        $(‘#dialog1‘).find(‘.weui_btn_dialog‘).on(‘click‘, function () {
            $(‘#dialog1‘).hide();
        });
    });
    $container.on(‘click‘, ‘#showDialog2‘, function () {
        $(‘#dialog2‘).show();
        $(‘#dialog2‘).find(‘.weui_btn_dialog‘).on(‘click‘, function () {
            $(‘#dialog2‘).hide();
        });
    })
});

参考链接:

http://i5ting.github.io/weui-practice/#1

时间: 2024-10-15 09:26:37

weui 多网页切换效果分析的相关文章

css图片切换效果分析+翻译整理

Demos:http://tympanus.net/Tutorials/CSS3SlidingImagePanels/ 出处:http://tympanus.net/codrops/2012/01/17/sliding-image-panels-with-css3/ 这个教程将介绍如何使用纯CSS创建一个干净的幻灯图片面板.主要想法是在面板中使用背景图片,然后在点击标签后让动画起效. 今天我们将向您展示如何创建仅适用于CSS一些巧妙的滑动图像面板.该想法是使用背景图像的面板和一个标签上点击时动画

在uwp仿IOS的页面切换效果

有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码. 先分析IOS的页面切换.用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画.导航到新页面时,使用页面前进的动画. UWP自带很多切换效果,位于 Windows.UI.Xaml.Media.Animation 中.与苹果的切换效果最接近的是 PaneThemeTransition (而不是EdgeUIThemeTransition). PaneThemeTransition

用Fragment实现Tab页面切换效果初步总结

前言: 最近在Android项目中需要在活动中实现多页面切换的功能,第一次是实现的过程中,是让Activity同时去加载三个界面的,通过点击tab按钮对页面设置隐藏和显示,实现页面切换效果,但是后面发现这种实现方式其实存在很多问题: 首先,同时去加载三个页面,切换Activity的速度会变慢,尤其是布局中如果有很多ImageView,ImageButton等使用到图片资源的控件时,切换效果非常不好: 其次,由于使用了很多图片资源,在退出Activity的时候,像Drawable,Bitmap等一

[JS]图片自动切换效果(学习笔记)

上次在下载的网页中看到 javascript实现图片自动切换效果: <style text="text/css"> /*图片滚动栏*/.container, .container * {    margin: 0;    padding: 0;}.container {    width: 1005px;    height: 395px;    float: right;    overflow: hidden;    position: relative;    rig

基于jquery多种切换效果的焦点图(兼容ie6)

随着html5和css3的诞生.各种非常酷.非常炫的网页焦点图在各个前端技术网上满天飞.基于html5和css3技术的焦点图有一个弊端就是要在ie9以上才支持.这让需兼容ie6到ie8的页面又爱又恨.下面为大家介绍一款完全基于juery的焦点图,而且这款插件完美支持ie6,多种百叶窗切换,效果还是相当赏目的.无图无真相,还是先上图 点击这里在线预览 点击这里下载源码 使用教程 这款插件代码很简洁,使用也非常简单.看截图 ok.今天就和大家分享到这里.周末好快,作为一名码农真是苦逼,明天还要早起,

网页3D效果库Three.js初窥

网页3D效果库Three.js初窥 背景 一直想研究下web页面的3D效果,最后选择了一个比较的成熟的框架Three.js下手 ThreeJs官网 ThreeJs-github; 接下来我会陆续翻译 Three.js官网的文档,部分文字和代码为我个人添加. 第一部分:three.js介绍 创建场景 这部分的目标是为Three.js做一个简单的介绍,我们会以创建一个场景,一个旋转的立方里开始,文章的结尾会有一个可运行的完整示例为你解惑. 开始之前 在你使用Three.js之前,你需要在你的电脑上建

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

导航条点击按钮切换效果

<!--[if IE]><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><![endif]--><html xmlns="http://www.w3.org/1999/xhtml"><head>&

用html+css+js实现选项卡切换效果

文章转载自:http://tongling.github.io/JSCards/ 用html+css+js实现选项卡切换效果 使用之前学过的综合知识,实现一个新闻门户网站上的常见选项卡效果: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居 200万内购五环三居 140万安家东三环 北京首现零首付楼盘 53万购东5环50平 京楼盘直降5000 中信府 公园楼王现房 家居: 40平出租屋大改造 美少女的混搭小窝 经典清新简欧爱家 90平老房焕发新生 新中式的酷色温情 66平撞色活泼家居