微信H5页面框架设计 h5_slide.js用法介绍

1. 习惯所致,通常开始写代码之前写一点准备代码, 完全是为了减少代码量方便阅读

$ = function(sel, holder){ 
    return [].slice.call( (holder||document).querySelectorAll(sel) );
};
$.on = function(dom, eventType, f){
    [].concat(dom).forEach(function(d){
        eventType.split(/\W+/).forEach(function(type){
            d.addEventListener(type, f ,false);
        });
    });
    return $;
};

2.  第一步创建一个类似swiper的切换效果,当然我们只是操作纵向,在CSS3中使用 transform 位置变换 + 过渡效果,很容易实现,关键是需要在事件绑定时候进行计算。另外,如果所有页面都是100%宽100%高的话自然不需要考虑内部滚动事件,我们这里需要考虑更多的事情,所以最好使用额外的一个透明层做事件绑定,然后操作与真实的section内容。

container = $("#container")[0]
holder = document.createElement("div"),
holder.style.cssText = "position: absolute;width: 100%;height: 100%;left: 0;top: 0;z-index: 1;";
container.appendChild(holder);

3. 切换的方法我暂且定做  transform_set(dom/*当前section*/, i/*前移还是后移i个section*/); 大概就是酱紫了

var H = document.documentElement.clientHeight;
        if( "undefined" === typeof i ){
            i = dom | 0;
        }else if( "number" != typeof dom ){
            i = sections.indexOf(dom) + i;
        }
        i = Math.min( Math.max( 0, i ), sections.length - 1);
        
css_model = function(h,l){
            return "-webkit-transform: translate3d("+(l|0)+"px, "+(h|0)+"px, 0); transform: translate3d("+(l|0)+"px, "+(h|0)+"px, 0);";
        };
        
sections.forEach(function(section, index){
                switch(index){
                    case i:
                        current_index = i;
                        section.style.cssText = css_model();
                        break;
                    case i+1:
                        section.style.cssText = css_model(H);
                        break;
                    case i-1:
                        section.style.cssText = css_model(-H);
                        break;
                    default:
                        section.style.cssText = css_model( (index > i) ? H : -H );
                }
            });

4. 注意事件绑定的时候需要判断方向,来确定切换是前移还是后移

// 事件
    var startTy, curTy, endTy, autoStep;
    $.on(holder, "touchstart", function(e){
        var touch = e.touches[0];
            startTy = curTy = touch.clientY;
    }).on(holder, "touchend", function(e){
        var touch = e.changedTouches[0],  //只判断单点触控
                endTy = touch.clientY;
        transform_set(sections[current_index], startTy > endTy ? 1 : -1);
        startTy = curTy = endTy = 0;
    }).on(document, "keydown", function(e){    // key 和 mouse 事件只是为了方便PC浏览器
        switch(e.keyCode){
            case 32:
            case 39:
            case 40: transform_set(sections[current_index], 20); break;
            case 37:
            case 38: transform_set(sections[current_index], -20); break;
        }
    }).on(document, "mousewheel", function(e){
        transform_set(sections[current_index], e.wheelDeltaY < 0 ? 20: -20);
    });

这节先到这里,事实上已经完成了一个方便的swiper效果。  然并卵,复杂的内容还木有开始(scrollTop位置检测,内置元素的相对transform设置和参数设计,动画元素分组,图片loading,按钮元素模拟穿透等), 详情关注本系列文章。

在前文中,我们简单讲了一个移动端整页切换的效果处理,本文主要来识别滚屏动画的进度接口设置。

 

考虑到单页面内滚动高度可能随着不同屏幕分辨率有所不同,我们设计的接口只是提供一个滚动百分比的参数,这个参数的值可以从 0 ~ 1.

run(per/*滚动百分比*/,dir/*滚动方向*/) // 滚动方向不一定用得上,暂且留着。

我们将这个run假定注册在原生的dom元素上面,再加一个run的className来识别,那么相关代码就会如下:

$.on(holder, "touchstart", function(e){
        var touch = e.touches[0];
            startTy = curTy = touch.clientY;
}).on(holder, "touchmove", function(e){
        var touch = e.changedTouches[0],
                endTy = touch.clientY;
        run( curTy - endTy, e);
        curTy = endTy;
});
    function run(dir, e){
        e.stopPropagation();
        e.preventDefault();
        var _this = sections[current_index];
        var st = _this.scrollTop,
            ch = _this.clientHeight,
            sh = _this.scrollHeight;
        scrollTy = st;
        st = _this.scrollTop = _this.scrollTop + dir;
        
        // 这里还有判断跳切换页面的逻辑
        
        $(".run", _this).forEach(function(r){  // 对当前section中的所有.run循环,判断是否存在run方法
            if( typeof r.run === "function" ){
                var per = _this.scrollTop == (sh-ch) ? 1 : _this.scrollTop / (sh-ch);
                r.run(per, dir);  // 存在这个方法就执行它, 把per带上。 per计算来自于当前滚动高度÷最大滚动高度
            }
        });
    }

完事儿,我们需要达到的效果其实就是酱紫的:

document.getElementById('logo').run = function(per, dir){
            var W = document.documentElement.clientWidth;
            this.style.cssText =
                "-webkit-transform: translate3d("+( (140+W) * per |0)+"px, "+(this.parentNode.scrollTop|0)+"px, 0); "
                +"transform: translate3d("+((140+W) * per |0)+"px, "+(this.parentNode.scrollTop|0)+"px, 0);";
        };

绑定一个run,就能按照规则执行滚动动画咯。

 

demo: http://cardistry.cn/hero/demo.html

建议用手机查看,或者使用chrome的移动端调试控制台。

查看源代码的时候你会发现如下代码:

.set = function(set,w,h,W,H){
                set.begin({x:0,y:0,rotate: 0, scale:1}).then({
                    per: .3,
                    x: w-W,
                    y: 300,
                    rotate: 180,
                    scale: .5
                }).then({
                    per: .5,
                    x: -100,
                    y: 200,
                    opacity: 1,
                    rotate: 360,
                    scale: 1
                }).then({
                    per: .7,
                    x: -100,
                    y: 200,
                    opacity: 1,
                    rotate: 240,
                    scale: 1.5
                }).then({
                    per: .8,
                    x: -100,
                    y: 200,
                    opacity:.2,
                    rotate: 120,
                    scale: 1
                }).end({x:w-W,y:H-h,rotate:0, scale:1});
            };

看起来很高大上的样子, 写动画好像更加方便了。这个其实就是基于上面run的一个线性封装,具体实现

前文提到,在一版页面内部滚动时候我们使用一个run方法传入参数per执行,期望接口使用者方便调用。

然而事实上, 还有一些个通用的执行过程可以进行抽离,例如我们期望通过如下方式书写动画:

.set = function(set,w,h,W,H){
                set.begin({x:0,y:0,rotate: 0, scale:1}).then({
                    per: .3,
                    x: w-W,
                    y: 300,
                    rotate: 180,
                    scale: .5
                }).then({
                    per: .5,
                    x: -100,
                    y: 200,
                    opacity: 1,
                    rotate: 360,
                    scale: 1
                }).then({
                    per: .7,
                    x: -100,
                    y: 200,
                    opacity: 1,
                    rotate: 240,
                    scale: 1.5
                }).then({
                    per: .8,
                    x: -100,
                    y: 200,
                    opacity:.2,
                    rotate: 120,
                    scale: 1
                }).end({x:w-W,y:H-h,rotate:0, scale:1});
            };

看起来像CSS3-animation实现过程呶。  建立在run方法已经可以被检测执行的基础上,我们可以想办法把这些数据构建一个run方法来:

 

1. 处理过程存储和参数部分:

var trace = [],
                        set = {
                            begin: function(d){d.per = d.per || 0;trace.push(d);return this;},
                            end: function(d){d.per = d.per || 1;trace.push(d);return this;},
                            then: function(d){trace.push(d);return this;}
                        },
                        w = r.offsetWidth,
                        h = r.offsetHeight,
                        W = document.documentElement.clientWidth,
                        H = document.documentElement.clientHeight;

2. 执行dom的set方法,将过程存储到trace数组中:

r.set(set,w,h,W,H);

3. 封装成为run方法(过程中依次循环数组,当属于某区间时候计算区间内属性的线性变换并且赋值)支持的属性有限,位置变换移动端不能使用left、top:

r.run = function(per, dir){
                        for (var i = 1; i < trace.length; i++) {
                            if( trace[i-1].per <= per && trace[i].per >= per ){
                                var prev = trace[i-1],
                                    next = trace[i],
                                    rate = (per - prev.per) / (next.per - prev.per),
                                    _x = (prev.x+(next.x-prev.x)*rate) || 0,
                                    _y = (prev.y+(next.y-prev.y)*rate) + sections[current_index].scrollTop || 0,
                                    _o = (prev.opacity+(next.opacity-prev.opacity)*rate),
                                    _s = (prev.scale+(next.scale-prev.scale)*rate),
                                    _r = (prev.rotate+(next.rotate-prev.rotate)*rate),
                                    _s = isNaN(_s) ? 1 : _s;
                                    _r = isNaN(_r) ? 0 : _r;
                                var cssText =
                                    "-webkit-transform: scale("+_s+") translate3d("+_x+"px, "+_y+"px, 0) rotate("+_r+"deg);"
                                    +"transform: scale("+_s+") translate3d("+_x+"px, "+_y+"px, 0) rotate("+_r+"deg);"
                                    + ( isNaN(_o) ? "" : ("opacity: " + _o+ ";") );
                                this.style.cssText = cssText;
                                return ;
                            }
                        };
                    };

时间: 2025-01-02 09:50:03

微信H5页面框架设计 h5_slide.js用法介绍的相关文章

C#开发微信门户及应用(44)--微信H5页面开发的经验总结

在我们开发微信页面的时候,需要大量用到了各种呈现的效果,一般可以使用Boostrap的效果来设计不同的页面,不过微信团队也提供很多这方面的资源,包括JSSDK的接口,以及Weui的页面样式和相关功能页面,给我们提供了很大的便利,本文是在自己做的一些H5微信应用页面上做了一些功能总结,希望能够给大家提供一定的帮助. 1.微信网页开发 1) JSSDK 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语

frame页面框架设计,上左右结构

问题描述 frame页面框架设计,上左右结构 求一个frame页面框架设计,上左右结构,左边两个框架是上下,右边一个框架 解决方案 <html><body><table border='1' width=""100%"" height=""100%""><tr> <td ><iframe src=''></iframe></td>

Android微信图片浏览框架设计_Android

一.业务场景 1.聊天界面发送图片==>多选点选+有右上角"发送"+图片预览==>图片预览支持右上角"发送"逻辑 2.发表动态==>多选点选+右上角"完成" + 图片预览==>图片预览支持右上角"完成"逻辑 3.个人资料更改头像==>单选点选 + 图片预览截图==>图片预览截图支持右上角"使用"逻辑 二.Intent参数设计; (Intent传参原则:尽量不要使用自定义类

Android微信图片浏览框架设计

一.业务场景 1.聊天界面发送图片==>多选点选+有右上角"发送"+图片预览==>图片预览支持右上角"发送"逻辑 2.发表动态==>多选点选+右上角"完成" + 图片预览==>图片预览支持右上角"完成"逻辑 3.个人资料更改头像==>单选点选 + 图片预览截图==>图片预览截图支持右上角"使用"逻辑 二.Intent参数设计; (Intent传参原则:尽量不要使用自定义类

Yii框架关联查询with用法介绍

Yii的关联查询确实是一个方便的东西,网上的资料也很多,但是大部分都是Ctrl+c,Ctrl+v,有些东西一直没有人出来详细的写篇文章说明一下,在参考了网上很多资源以后,加上自己的的一些理解,写下了这篇博客,给广大初学者朋友们指点一下迷津. 借鉴一点别人的东西...   YII 支持四种类型的关系: BELONGS_TO(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A (例如 Post 属于 User); HAS_MANY(有多个): 如果表 A 和 B 之间的关系是

Android图片加载框架Glide的基本用法介绍

简介 Glide是一款图片加载框架,可以在Android平台上以简单的方式加载和展示图片. dependencies { compile 'com.github.bumptech.glide:glide:3.7.0' } 在清单文件中加入权限 <uses-permission android:name="android.permission.INTERNET" /> 加载图片 http://sc.jb51.net/uploads/allimg/150709/14-150FZ

那些过目不忘的H5页面

  从引爆朋友圈的H5小游戏<围住神经猫>,到颠覆传统广告的大众点评H5专题页<我们之间只有一个字>,从2014下半年起,各种H5游戏和专题页纷纷崭露头角. "H5",这个由HTML5简化而来的词汇,借由微信这个移动社交平台,正在走进更多人的视野.本文聚焦于基于微信传播的H5页面的视觉设计,通过一些案例分析来谈谈设计思路与方法,希望与大家进行交流探讨. 功能与目标 首先从功能与设计目标来看, H5专题页主要有以下4大类型: 1.活动运营型 为活动推广运营而打造的

html5-微信h5页面如何制作,我不知道怎么写页面

问题描述 微信h5页面如何制作,我不知道怎么写页面 我懂得html5语言,但是不知道h5是不是和html5一样, 有谁做过吗?要是有个demo就更好了 解决方案 现在移动互联网如火如荼,微博过后,微信更是势不可挡.相对于微博的垃圾广告信息泛滥,微信对内容的控制不可谓不严格.当然相对于微博,微信的用户粘性更高,也就是说微信的粉丝价值更高,但是鉴于腾讯对公众号推广的限制,很多人对于微信推广真是绞尽脑汁,最终还是没什么效果,好的内容是过得优质粉丝的关键,但是靠谱的推广更是必不可少的. 现代人的时间都是

腾讯移动端H5页面设计实战分享

  <腾讯网UED体验设计之旅>一书集合了腾讯网UED团队在用户体验领域的十年探索经验,展示了大量精彩案例的设计技巧和过程.下面为该书的节选内容. 为什么要设计H5页面 移动设备的普及给媒体和娱乐带来了一场革命.根据中国互联网信息中心(CNNIC)2014年7月的报告显示,中国网民中,手机使用率达83.4%,已经超过传统PC整体80.9%的使用率.其中,手机网络新闻的使用率为74.2%,仅次于即时通信和搜索,远超其他手机网络应用.在资讯移动化的趋势下,观察近期各大门户在重大事件报道中的表现,会