开启gpu加速的高性能移动端相框组件!

通过设置新的css3新属性translateX来代替传统的绝对定位改变left值的动画原理,新属性translateX会开启浏览器自带的gpu硬件加速动画性能,提高流畅度从而提高用户体验,

代码有很详细的注释,先上代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <!--移动端相关声明-->
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <!--允许苹果设备全屏显示-->
        <meta name="apple-touch-fullscreen" content="YES"/>
        <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
        <title>滑动相框组件</title>
        <style type="text/css">
            *{margin: 0;padding: 0;}
            body{background: #333;overflow: hidden;}
            #album{width: 100%;height: 100%;overflow: hidden;}
            #album ul,li{list-style: none;overflow: hidden;height: 100%;}
            /*用css3方式把li的内容居中显示,需要绝对定位的,在js中动态加入,js代码会说明*/
            #album li{display: -webkit-box;-webkit-box-pack: center;-webkit-box-align: center;}
        </style>
    </head>
    <body>
        <div id="album"></div>
    </body>
    <script src="js/myjs.js" type="text/javascript" charset="utf-8"></script>
</html>

js代码部分

var list=[{
            height:950,
            width:800,
            src:"img/1.jpg"
        },
        {
            height: 1187,
            width: 900,
            src: "img/2.jpg"
        },
        {
            height: 766,
            width: 980,
            src: "img/3.jpg"
        },
        {
            height: 754,
            width: 980,
            src: "img/4.jpg"
        },
        {
            height: 493,
            src: "img/5.jpg",
            width: 750
        },
        {
            height: 500,
            src: "img/6.jpg",
            width: 750
        },
        {
            height: 600,
            src: "img/7.jpg",
            width: 400
        }];

    function Silder(opts){
        this.wrap=opts.obj;
        this.list=opts.list;
        //构造三部曲
        this.init();
        this.renderDOM();
        this.bindDOM();

    }
    //初次化
    Silder.prototype.init=function(){
        //算出窗口长宽比
        this.radio=window.innerHeight/window.innerWidth;

        this.scaleW=window.innerWidth;
        //当前图片的索引值
        this.index=0;

    }
    //根据数据渲染页面的原型链
    Silder.prototype.renderDOM=function(){
        var wrap =this.wrap;
        var data=this.list;
        var len=data.length;
        var scale=this.scaleW;

        this.Oul=document.createElement(‘ul‘);

        for(var i=0;i<len;i++){
            var li=document.createElement(‘li‘);
            var item=data[i];
            //设置li的相关参数
            li.style.width=scale+‘px‘;
            li.style.webkitTransform=‘translateX(‘+i*scale+‘px)‘;
            //如果item存在,do某事
            if(item){
                //如果图片的高宽比大于屏幕的高宽比,以高度来进行缩放
                if(item[‘height‘]/item[‘width‘]>this.radio){
                    li.innerHTML=‘<img height="‘+window.innerHeight+‘" src="‘+item[‘src‘]+‘"/>‘;
                }else{
                    li.innerHTML=‘<img width="‘+scale+‘" src="‘+item[‘src‘]+‘"/>‘;
                }
            }
            this.Oul.appendChild(li);
        }
        this.Oul.style.width=scale+‘px‘;
        wrap.style.height=window.innerHeight+‘px‘;
        wrap.appendChild(this.Oul);
    }
    //动画函数原型链
    Silder.prototype.go=function(num){
        var index=this.index;
        var lis=this.Oul.getElementsByTagName(‘li‘);
        var len=lis.length;
        var i;
        //把传入的转换位number类型
        i=index+num*1
        if(i>len-1){
            i=len-1
        }else if(i<0){
            i=0
        }
        //保留当前图片的索引值
        this.index=i;
        //加入过渡效果
        lis[i]&&(lis[i].style.webkitTransition=‘all 0.3s ease-out‘);
        lis[i-1]&&(lis[i-1].style.webkitTransition=‘all 0.3s ease-out‘);
        lis[i+1]&&(lis[i+1].style.webkitTransition=‘all 0.3s ease-out‘);

        //动态加入当前页,上一页,下一页绝对定位,过多绝对定位占用内存会过大,导致ios上浏览器闪退
        lis[i].style.position = ‘absolute‘;
        lis[i-1] && (lis[i-1].style.position = ‘absolute‘);
        lis[i+1] && (lis[i+1].style.position = ‘absolute‘);

        //当前页,上一页,下一页的动画切换
        lis[i]&&(lis[i].style.webkitTransform=‘translateX(0px)‘);
        lis[i-1]&&(lis[i-1].style.webkitTransform=‘translateX(-‘+this.scaleW+‘px)‘);
        lis[i+1]&&(lis[i+1].style.webkitTransform=‘translateX(‘+this.scaleW+‘px)‘);
    }
    //事件绑定的原型链
    Silder.prototype.bindDOM=function(){
        var that=this;
        var scale=that.scaleW;
        var Oul=that.Oul;
        var len=that.list.length;
        //触摸屏幕函数
        var startHandler=function(event){
            //记录刚接触屏幕的时间
            that.startTime=new Date()*1;
            //记录刚接触屏幕的x坐标
            that.startX=event.touches[0].pageX;
            //清楚位移量
            that.offsetX=0;
        }
        //在触摸屏幕移动函数
        var moveHandler=function(event){
            event.preventDefault();
            that.offsetX=event.touches[0].pageX-that.startX;
            var lis=Oul.getElementsByTagName(‘li‘);
            //关键点,取得当前页,上一页,下一页的索引值
            var i=that.index-1;
            var n=i+3;
            //遍历选出当前页,上一页,下一页的索引来do 某事
            for(i; i<n; i++){
                //手指移动时候取消过渡效果
                lis[i]&&(lis[i].style.webkitTransition=‘none‘);
                //图片跟随手指移动
                lis[i]&&(lis[i].style.webkitTransform=‘translateX(‘+((i-that.index)*scale+that.offsetX)+‘px)‘);
            }

        }
        //触摸结束函数
        var endHandler=function(event){
            var boundary=scale/5;
            var endTime=new Date()*1;
            event.preventDefault();
            if(endTime-that.startTime>300){
                //用户慢滑动的情况
                if(that.offsetX>=boundary){
                    //调用切换到下一页函数
                    that.go(‘-1‘);
                }else if(that.offsetX<0&&that.offsetX<-boundary){
                    //调用切换上一页函数
                    that.go(‘1‘);
                }else{
                    //调用留在此页函数
                    that.go(‘0‘);
                }
            }else{
                //优化用户快速滑动的情况
                if(that.offsetX>50){
                    that.go(‘-1‘);
                }else if(that.offsetX<-50){
                    that.go(‘1‘);
                }else{
                    that.go(‘0‘);
                }
            }
        }
        //绑定事件
        Oul.addEventListener(‘touchstart‘,startHandler);
        Oul.addEventListener(‘touchmove‘,moveHandler);
        Oul.addEventListener(‘touchend‘,endHandler);

    }
    //传入数据调用
    new Silder({
        ‘obj‘:document.getElementById(‘album‘),
        ‘list‘:list
    })

最后说明一下开启gpu加速会导致设备耗电量增加

时间: 2024-10-21 13:26:35

开启gpu加速的高性能移动端相框组件!的相关文章

ubuntu 14.04 安装cuda,开启GPU加速

1 首先要开启GPU加速就要安装cuda.安装cuda,首先要安装英伟达的驱动.ubuntu有自带的开源驱动,首先要禁用nouveau.这儿要注意,虚拟机不能安装ubuntu驱动.VMWare下显卡只是模拟出的一块显卡,如果你安装cuda,会卡在ubuntu图形界面无法登陆系统.所以首先我们需要装双系统. 2 win10下安装ubuntu.win10,win8,是使用uefi引导的.不同于win7等老版本.所以不可以使用EasyBCD. 首先我们对C盘进行分区.我的C盘是固态硬盘,使用win10

用CSS开启硬件加速来提高网站性能(转)

用CSS开启硬件加速来提高网站性能(转) 翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css. 你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗? 现在大多数电脑的显卡都支持硬件加速.鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅. 在桌

用CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗? 现在大多数电脑的显卡都支持硬件加速.鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅. 在桌面端和移动端用CSS开启硬件加速 CSS animations, transforms 以及 transitions 不会自动开启GPU加速,而是由浏览器的缓慢的软件渲染引擎来执行.那我们怎样才可以切换到GPU模式呢,很多浏览器提供了某些触发的CS

高性能移动端开发

不知不觉,春节就过完了,还没来得及好好享受就没了.好想来一场说走就走的旅行??,不吹水了,直接进入正题. 最近在做一个需求,发现了薄弱的地方,趁这个好机会深入了解一下,拓宽一下视野- 众所周知,网页不仅应该被快速加载,同时还应该流畅运行,比如快速响应的交互,如丝般顺滑的动画-- 在实际开发中如何做到上面所说的效果呢? 1. 确认渲染性能的分析标准 2. 准备尺子去衡量渲染性能标准 3. 对耗时多的地方进行优化 我们可以粗略的得到下面的优化目标 第一个是 首屏呈现时间,网上的资料已经非常非常多了,

编译GDAL支持OpenCL使用GPU加速

前言 GDAL库中提供的gdalwarp支持各种高性能的图像重采样算法,图像重采样算法广泛应用于图像校正,重投影,裁切,镶嵌等算法中,而且对于这些算法来说,计算坐标变换的运算量是相当少的,绝大部分运算量都在图像的重采样算法中,尤其是三次卷积采样以及更高级的重采样算法来说,运算量会成倍的增加,所以提升这些算法的处理效率优先是提高重采样的效率.由于GPU的多核心使得目前对于GPU的并行处理非常热,同时也能大幅度的提升处理速度.基于上述原因,GDALWARP也提供了基于OPENCL的GPU加速,之前在

-webkit-transform:translate3d(0,0,0)触发GPU加速,让网页动画更流畅

前段时间,依照美拍的视频效果写了一个效果类似的网页版的动画. 电脑上安装了三种浏览器:IE.Chrome.Firefox.分别作了測试,结果显示Chrome在这方面的渲染效果最差.常常出现卡顿现象.ff表现最好. 一直百思不得其解,尤其是之前使用canvas标签做图片滤镜效果,chrome浏览器竟然显示不了滤镜效果.然而其它浏览器均能正常显示,大谷歌你肿么了...对渲染多张图片和动画效果表示放弃了么... 昨天和高人聊天,说道这个情况,他说道了transform:translate3d(0,0,

基于GPU加速的三维空间分析【转】

基于GPU加速的三维空间分析 标签:supermap地理信息系统gisit 文:李凯 随着三维GIS 的快速发展和应用普及,三维空间分析技术以其应用中的实用性成为当前GIS技术研究的热点领域.面对日益庞大的三维数据处理现状,为满足GIS各行业对专业化三维空间分析的实用性需求,SuperMap GIS 7C(2015)提供了丰富且实用的基于GPU图形硬件加速的三维空间分析功能,做到“即时分析.即时完成”的超强性能,具体包括通视分析.可视域分析.动态可视域分析.阴影率统计分析.天际线分析.剖面线分析

深度学习之五:使用GPU加速神经网络的训练

使用神经网络训练,一个最大的问题就是训练速度的问题,特别是对于深度学习而言,过多的参数会消耗很多的时间,在神经网络训练过程中,运算最多的是关于矩阵的运算,这个时候就正好用到了GPU,GPU本来是用来处理图形的,但是因为其处理矩阵计算的高效性就运用到了深度学习之中.Theano支持GPU编程,但是只是对英伟达的显卡支持,而且对于Python编程而言,修改一些代码就可以使用GPU来实现加速了. 一,首先需要安装GPU环境(说明:我开始按照官网步骤发生了错误,下面是我综合网上一些资料最后安装成功之后的

GPU 加速NLP任务(Theano+CUDA)

之前学习了CNN的相关知识,提到Yoon Kim(2014)的论文,利用CNN进行文本分类,虽然该CNN网络结构简单效果可观,但论文没有给出具体训练时间,这便值得进一步探讨. Yoon Kim代码:https://github.com/yoonkim/CNN_sentence 利用作者提供的源码进行学习,在本人机子上训练时,做一次CV的平均训练时间如下,纵坐标为min/CV(供参考): 机子配置:Intel(R) Core(TM) i3-4150 CPU @ 3.50GHz, 32G,x64 显