zoukankan      html  css  js  c++  java
  • 视差滚动demo (pc)

    根据设计图设定每屏的高度,js会自动缩放到全屏尺寸,效果要大尺寸才能看的出来

    demo :http://runjs.cn/detail/uvizsekd

      1 <!DOCTYPE html>
      2 <html>
      3     <head>
      4         <meta charset="utf-8">
      5         <style>
      6             html,body{
      7                 margin:0;padding:0;
      8             }
      9             .pages{
     10                 width:100%;
     11                 height:100vh;
     12                 outline: 1px solid blue;
     13             }
     14             #a,#b,#c{
     15                 width:50%;
     16                 height:200px;
     17             }
     18             #a ,#c{
     19                 background:rgba(212,132,11,.5);
     20             }
     21             #b{
     22                 background:rgba(22,32,11,.5);
     23             }
     24         </style>
     25     </head>
     26     <body>
     27         <div class="pages">
     28             <div id="a">123</div>
     29             <div id="c">123</div>
     30         </div>
     31         <div class="pages">
     32             <div id="b">bbb</div>
     33         </div>
     34         <div class="pages">
     35         </div>
     36     </body>
     37 </html>
     38 <script src="https://code.jquery.com/jquery-2.2.4.js" integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI=" crossorigin="anonymous"></script>
     39 <script>
     40 var design_size = {"width" : 1920 }
     41 var pages = [
     42     {
     43      "height" : 4000 //* radio 
     44      ,"background" : "http://image.tianjimedia.com/uploadImages/2012/221/960UAS60H799.jpg"
     45     ,"elems" : [
     46             {"id" : "#a"
     47              ,"start" : {"left" : 0 , "top" : 0}
     48              ,"end" : {"left": 200 , "top" : 3600}
     49             }
     50             ,{"id" : "#c"
     51              ,"start" : {"right" : 0 , "bottom" : 4000}
     52              ,"end" : {"right": 200 , "bottom" : 0}
     53             }
     54         ]
     55     },
     56     {
     57      "height" : 3500 //* radio 
     58     ,"background" : "http://image.tianjimedia.com/uploadImages/2012/072/S056Y53BS3Q6_1000x500.jpg"
     59     ,"elems" : [
     60             {"id" : "#b"
     61              ,"start" : {"right" : 0 , "top" : 0}
     62              ,"end" : {"right": 500 , "top" : 3200}
     63             }
     64         ]
     65     },
     66     {
     67      "height" : '3.0' //* radio 
     68     ,"background" : "http://image.tianjimedia.com/uploadImages/2013/065/85GSC473318U.jpg"
     69     ,"elems" : [
     70         ]
     71     },
     72 ]
     73 
     74 </script>
     75 <script>
     76 ~function (pg_conf , pg_doms){
     77     var window_height = window.innerHeight
     78     var radio = $(window).width() / design_size.width 
     79 
     80     pg_doms = $(pg_doms)
     81     var h_stack = [0]
     82         ,_pos = 0
     83         ,_play = 0
     84         ,_direct
     85 
     86     var scene , scene_dom , scene_elems
     87     var animating = false 
     88     scrollTo(document.body , 0 ,100)
     89     function scrollTo(element, to, duration) {
     90         animating = true
     91         if (duration <= 0) return animating = false;
     92         var difference = to - element.scrollTop;
     93         var perTick = difference / duration * 10;
     94 
     95         setTimeout(function() {
     96             element.scrollTop = element.scrollTop + perTick;
     97             if (element.scrollTop == to) return animating = false;
     98             scrollTo(element, to, duration - 10);
     99         }, 10);
    100     }
    101     function play(index ,opt){
    102         if (!pg_conf[index]) {
    103             return
    104         }
    105         opt = opt || {}
    106         _play = index
    107         scene = pg_conf[index]
    108         scene_dom = pg_doms.eq(index)
    109         scene_elems = scene.elems
    110         if (0 && opt.movein){
    111             if ('top' == opt.movein){
    112                 var to = h_stack[_play]
    113                 
    114             }else {
    115                 var to = h_stack[_play+1] - window_height 
    116             }
    117             if (to) scrollTo(document.body , to ,200)
    118         }
    119         ///window.scrollTo(0, h_stack[_play])
    120         /*
    121         scene_elems.forEach(function(e_conf){
    122             e_conf.dom.css('position','absolute').css(e_conf.start)
    123         })
    124         */
    125     }
    126     function roll(s){
    127         if (!scene) return
    128         if (s > scene.scrTotal) return 
    129         var process = s / scene.scrTotal
    130         
    131         //console.log(process , s, scene.scrTotal , scene.height , window.innerHeight)
    132         scene_elems.forEach(function(e_conf){
    133             var ret = {}
    134             //console.log(e_conf)
    135             for (var key in e_conf.end){
    136                 if (key in e_conf.start) {
    137                     var m = (e_conf.end[key] - e_conf.start[key] )*process + e_conf.start[key]
    138                     ret[key] = m
    139                 }
    140             }
    141             //console.log(ret)
    142             e_conf.dom.css(ret)
    143             
    144         })
    145     
    146     }
    147     var t = 0
    148     pg_conf.forEach(function(p , i){
    149         var dom = pg_doms.eq(i)
    150         if (/^d*.d*$/.test(p.height)){
    151             var height = p.height * window_height
    152         }else {
    153             var height = p.height * radio
    154         } 
    155 
    156         t += height
    157         h_stack.push(t)
    158         p.height = height
    159         p.scrTotal = height - window_height
    160         dom.css({'100%'
    161             ,height: height
    162             ,position:'relative'
    163             ,background: 'url(' + p.background+ ') '
    164             ,'background-size':'cover'
    165             ,'background-attachment' : 'fixed'
    166         })
    167         p.elems.forEach(function(e_conf){
    168             e_conf.dom = $(e_conf.id).css('position','absolute').css(e_conf.start)
    169             for (var key in e_conf.start){
    170                 e_conf.start[key] = e_conf.start[key] * radio
    171             }
    172             for (var key in e_conf.end){
    173                 e_conf.end[key] = e_conf.end[key] * radio
    174             }
    175         })
    176     })
    177     play(_play)
    178 
    179     var _threshold = window_height //-  100 
    180     function move(evt){
    181         if (animating) return 
    182         var scrl = document.body.scrollTop
    183         if (scrl > _pos)  _direct = 'down'
    184         else _direct = 'up'
    185         _pos = scrl
    186         
    187         var boudary = h_stack[_play]
    188         if ('down' == _direct){
    189             if (_play !== h_stack.length - 2){
    190                 var bound_next = h_stack[_play + 1]
    191 
    192                 if (scrl + _threshold > bound_next) {
    193                     console.log('next')
    194                     play(_play+1 ,{"movein" : "top"})
    195                 } 
    196             }
    197         }else {
    198             if (_play !== 0){
    199                 var bound_next = h_stack[_play ]
    200                 if (scrl <= bound_next){
    201                     console.log('pre')
    202                     play(_play-1 ,{"movein" : "bottom"})
    203                 
    204                 }
    205             }
    206         }
    207         boudary = h_stack[_play]
    208         roll(scrl - boudary)
    209         
    210     }
    211     window.addEventListener('scroll' , move)
    212     
    213 }(pages , '.pages')
    214 </script>
  • 相关阅读:
    xgzc— math 专题训练(一)
    floyd判圈算法
    CF961G Partitions
    luoguP4778 Counting swaps
    AT3913 XOR Tree(巧妙转换+状压dp)
    手动实现aop编程
    代理模式
    spring重点一:处理对象创建时间 个数以及方式
    spring helloword
    spring用来干什么,解决的问题
  • 原文地址:https://www.cnblogs.com/vaal-water/p/5775142.html
Copyright © 2011-2022 走看看