CSS3实现整屏切换效果

总是能看见非常多广告或者站点都是使用整屏滚动的效果,一直看着都心痒痒,想自己也实现一个。近期刚学习到css3的动画效果,所以尝试使用css3做了一个整屏切换。

页面结构

实现思路与大众方法相似。如图

每一个section就是一页内容。它的大小充满了屏幕(红色区域)。一个container由多个section构成,我们通过改变container的位置,来达到页面切换的效果。

container向下走。页面好像上移了,container向上走,页面就下移了。

html结构例如以下:

<!DOCTYPE html>
<html>
<head lang="ch">
    <meta charset="UTF-8">
    <!--适配移动端-->
    <meta name=”viewport” content="width=device-width, user-scalable=no, initial-scale=1.0">
    <title></title>
    <style>
        body, html{
            padding: 0;
            margin: 0;
        }

        body, html {
            height: 100%;
            /**隐藏滚动栏**/
            overflow: hidden;
        }

        #container, .section {
            height: 100%;
        }

        #section0 {
            background-color: #83af9b;
        }

        #section1 {
            background-color: #764d39;
        }

        #section2 {
            background-color: #ff9000;
        }

        #section3 {
            background-color: #380d31;
        }

    </style>
</head>
<body>
<div id="container">
    <div class="section" id="section0"></div>
    <div class="section" id="section1"></div>
    <div class="section" id="section2"></div>
    <div class="section" id="section3"></div>
</div>
</body>
</html>

事件监听

此时窗口里仅仅显示一个页面,我们给其加上滚动监听。由于firefox和非firefox浏览器对滚动监听支持不同。firefox浏览器向上滚动是-120,向下滚动是120,而其它浏览器向上是5,向下是-5,所以须要作推断:

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
    //当前页面索引
    var curIndex = 0;

    var scrollFunc = function (e) {
        e = e || window.event;
        var t = 0;
        if (e.wheelDelta) {//IE/Opera/Chrome
            t = e.wheelDelta;
            if (t > 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t < 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        } else if (e.detail) {//Firefox
            t = e.detail;
            if (t < 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t > 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        }
    };

    function moveNext(){

    }

    function movePrev(){

    }

    function init(){
        /*注冊事件*/
        if (document.addEventListener) {
            document.addEventListener(‘DOMMouseScroll‘, scrollFunc, false);
        }//W3C
        window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome
    }

    init();
</script>

为了防止在第一个页面用户上滚。最后一个页面用户下滚。所以用curIndex代表当前页面索引在滚动时作了监听。当然假设要使页面循环滚动。仅仅需改动条件限制就可以。

增加动画

动画使用到了css3里的transform属性的translate3D,我们首先须要获取到屏幕的高度,然后当页面切换的时候将container上移一个屏幕高度或下移一个屏幕高度。

使用translate3D的原因是在手机端会开启硬件加速,使动画更流畅。它接收三个參数,各自是x轴、y轴和z轴的位移。如

transform: tanslate3D(10px, 30px, 0);

改动后的js代码例如以下:

<script>
    //当前页面索引
    var curIndex = 0;
    //container元素
    var container = $("#container");
    //页面总数
    var sumCount = $(".section").length;
    //窗口元素
    var $window = $(window);
    //动画时间
    var duration = 500;

    var scrollFunc = function (e) {
        e = e || window.event;
        var t = 0;
        if (e.wheelDelta) {//IE/Opera/Chrome
            t = e.wheelDelta;
            if (t > 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t < 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        } else if (e.detail) {//Firefox
            t = e.detail;
            if (t < 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t > 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        }
    };

    function moveNext(){
        container.css("transform", "translate3D(0, -" + (++curIndex) * $window.height() + "px, 0)");
    }

    function movePrev(){
        container.css("transform", "translate3D(0, -" + (--curIndex) * $window.height() + "px, 0)");
    }

    function init(){
        /*注冊事件*/
        if (document.addEventListener) {
            document.addEventListener(‘DOMMouseScroll‘, scrollFunc, false);
        }//W3C
        window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome

        //设置动画
        container.css({
            "transition": "all 0.5s",
            "-moz-transition": "all 0.5s",
            "-webkit-transition": "all 0.5s"
        });
    }
</script>

为了防止页面在滚动的时候用户继续滚动打乱节奏,能够用时间来强制控制,即在滚动期间不同意调用moveNext和movePrev函数,终于代码例如以下:

<!DOCTYPE html>
<html>
<head lang="ch">
    <meta charset="UTF-8">
    <meta name=”viewport” content="width=device-width, user-scalable=no, initial-scale=1.0">
    <title></title>
    <style>
        body, html{
            padding: 0;
            margin: 0;
        }

        body, html {
            height: 100%;
            overflow: hidden;
        }

        #container, .section {
            height: 100%;
        }

        .section {
            background-color: #000;
            background-size: cover;
            background-position: 50% 50%;
        }

        #section0 {
            background-color: #83af9b;
        }

        #section1 {
            background-color: #764d39;
        }

        #section2 {
            background-color: #ff9000;
        }

        #section3 {
            background-color: #380d31;
        }

    </style>
</head>
<body>
<div id="container">
    <div class="section" id="section0"></div>
    <div class="section" id="section1"></div>
    <div class="section" id="section2"></div>
    <div class="section" id="section3"></div>
</div>

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
    var curIndex = 0;
    var container = $("#container");
    var sumCount = $(".section").length;
    var $window = $(window);
    var duration = 500;
    //时间控制
    var aniTime = 0;

    var scrollFunc = function (e) {
        //假设动画还没运行完,则return
        if(new Date().getTime() < aniTime + duration){
            return;
        }
        e = e || window.event;
        var t = 0;
        if (e.wheelDelta) {//IE/Opera/Chrome
            t = e.wheelDelta;
            if (t > 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t < 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        } else if (e.detail) {//Firefox
            t = e.detail;
            if (t < 0 && curIndex > 0) {
                //上滚动
                movePrev();
            } else if (t > 0 && curIndex < sumCount - 1) {
                //下滚动
                moveNext();
            }
        }
    };

    function moveNext(){
        //获取动画開始时的时间
        aniTime = new Date().getTime();
        container.css("transform", "translate3D(0, -" + (++curIndex) * $window.height() + "px, 0)");
    }

    function movePrev(){
        //获取动画開始时的时间
        aniTime = new Date().getTime();
        container.css("transform", "translate3D(0, -" + (--curIndex) * $window.height() + "px, 0)");
    }

    function init(){
        /*注冊事件*/
        if (document.addEventListener) {
            document.addEventListener(‘DOMMouseScroll‘, scrollFunc, false);
        }//W3C
        window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome

        container.css({
            "transition": "all 0.5s",
            "-moz-transition": "all 0.5s",
            "-webkit-transition": "all 0.5s"
        });
    }

    init();
</script>
</body>
</html>
时间: 2024-09-29 05:42:42

CSS3实现整屏切换效果的相关文章

分享jQuery&amp;CSS3导航标签切换效果

jquery+css3完成的菜单导航特效 引入代码: <link rel="stylesheet" type="text/css" href="css/style.css"/> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="t

CSS3 :target伪类实现Tab切换效果

用:target伪类实现Tab切换效果真的非常简单!简单到什么程度呢?它只需要下面这些代码. style.css: .song-info { position: absolute; background: #fff; } #song-info:target, #song-lyricCN:target, #song-lyricEN:target { z-index: 1; } html代码: <div class="song-nav"> <ul class="

CSS3属性之 target伪类实现Tab切换效果

CSS3 :target伪类用来改变页面中锚链接URL所指向的ID样式 代码示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>target伪类实现Tab切换效果</title> <style type="text/css"> p{ bond:li; } .tablis

很实用的HTML5+CSS3注册登录窗体切换效果

1. [代码]3个很实用的HTML5+CSS3注册登录窗体切换效果 <!DOCTYPE html><!--[if lt IE 7 ]> <html lang="en" class="no-js ie6 lt8"> <![endif]--><!--[if IE 7 ]>    <html lang="en" class="no-js ie7 lt8"> &l

实用CSS3属性之 :target伪类实现Tab切换效果

CSS3 :target伪类用来改变页面中锚链接URL所指向的ID样式,例如你要改变描链接指向#tab的元素字体颜色为蓝色,哪么你可以这样写成#tab:target {color:blue} 浏览器支持: 不支持IE8及以下的IE版本,IE9支持这个属性,其它非IE内核浏览器如:Firefox.Chrome.等这些浏览器都支持. 用法: :target伪类与:hover.:link.:visited.:focus等伪类的用法一样 :target {color:blue} 实例:CSS3 :tar

基于html5和css3响应式全屏滚动页面切换效果

分享一款全屏响应式的HTML5和CSS3页面切换效果.这个页面布局效果对于那些页面要求固定100%高度和宽度的网站和APP来说是十分有用的.效果图如下: 在线预览   源码下载 HTML wrapper div的class为st-container,里面包含作为导航按钮的radio和用于页面切换的面板st-scroll. <div class="st-container"> <input type="radio" name="radio-

css3制作惊艳hover切换效果

css3制作经验hover切换效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"&g

CSS3实现绚丽的图片切换效果

逛博客看到的一个很好看的图片切换效果,用CSS3做的,自己也尝试了一下.想法很巧妙,实现起来并不困难.将一个图片分为了四个部分,通过绝对定位的方式使每个li中显示图片的一个部分,从而拼成一个完整的图片.再对四个部分进行动画处理让第二个图片显现出来,第二个图片也是使用transform属性来先放大再还原的处理. 效果预览 附代码段: <div class="grid-box"> <ul class="pic1"> <li> <

用jQuery.touchSwipe插件实现手机端场景滑动切换效果

使用jQuery的touchSwipe插件监听触摸滑动事件,结合css3实现手机端场景滑动切换效果.最好在手机端测试代码,也可以在PC端用鼠标点击模拟滑动. 1.html代码: <div class="container"> <div class="page page0 page_current"> <h1>你好,我是0号屏幕,第一屏,鼠标单击向下/向上拖动</h1> </div> <div clas