| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- /**
- CWS Parallax scroll plugin
- **/
- (function ( $ ){
-
- $.fn.cws_prlx = cws_prlx;
- window.addEventListener( 'scroll', function (){
- if ( window.cws_prlx != undefined && !window.cws_prlx.disabled ){
- window.cws_prlx.translate_layers();
- }
- }, false );
- window.addEventListener( 'resize', function (){
- var i, section_id, section_params;
- if ( window.cws_prlx != undefined ){
- if ( window.cws_prlx.servant.is_mobile() ){
- if ( !window.cws_prlx.disabled ){
- for ( layer_id in window.cws_prlx.layers ){
- window.cws_prlx.layers[layer_id].el.removeAttribute( 'style' );
- }
- window.cws_prlx.disabled = true;
- }
- }
- else{
- if ( window.cws_prlx.disabled ){
- window.cws_prlx.disabled = false;
- }
- for ( section_id in window.cws_prlx.sections ){
- section_params = window.cws_prlx.sections[section_id];
- if ( section_params.height != section_params.el.offsetHeight ){
- window.cws_prlx.prepare_section_data( section_id );
- }
- }
- }
- }
- }, false );
- function cws_prlx ( args ){
- var factory, sects;
- sects = $( this );
- if ( !sects.length ) return;
- factory = new cws_prlx_factory( args );
- window.cws_prlx = window.cws_prlx != undefined ? window.cws_prlx : new cws_prlx_builder ();
- sects.each( function (){
- var sect = $( this );
- var sect_id = factory.add_section( sect );
- if ( sect_id ) window.cws_prlx.prepare_section_data( sect_id );
- });
- }
- function cws_prlx_factory ( args ){
- var args = args != undefined ? args : {};
- args.def_speed = args.def_speed != undefined && !isNaN( parseInt( args.def_speed ) ) && parseInt( args.def_speed > 0 ) && parseInt( args.def_speed <= 100 ) ? args.def_speed : 50;
- args.layer_sel = args.layer_sel != undefined && typeof args.layer_sel == "string" && args.layer_sel.length ? args.layer_sel : ".cws_prlx_layer";
- this.args = args;
- this.add_section = cws_prlx_add_section;
- this.add_layer = cws_prlx_add_layer;
- this.remove_layer = cws_prlx_remove_layer;
- }
- function cws_prlx_builder (){
- this.servant = new cws_servant ();
- this.sections = {};
- this.layers = {};
- this.calc_layer_speed = cws_prlx_calc_layer_speed;
- this.prepare_section_data = cws_prlx_prepare_section_data;
- this.prepare_layer_data = cws_prlx_prepare_layer_data;
- this.translate_layers = cws_prlx_translate_layers;
- this.translate_layer = cws_prlx_translate_layer;
- this.conditions = {};
- this.conditions.layer_loaded = cws_prlx_layer_loaded_condition;
- this.disabled = false;
- }
- function cws_prlx_add_section ( section_obj ){
- var factory, section, section_id, layers, layer, i;
- factory = this;
- section = section_obj[0];
- layers = $( factory.args.layer_sel, section_obj );
- if ( !layers.length ) return false;
- section_id = window.cws_prlx.servant.uniq_id( 'cws_prlx_section_' );
- section.id = section_id;
- window.cws_prlx.sections[section_id] = {
- 'el' : section,
- 'height' : null,
- 'layer_sel' : factory.args.layer_sel
- }
- if ( /cws_Yt_video_bg/.test( section.className ) ){ /* for youtube video background */
- section.addEventListener( "DOMNodeRemoved", function ( e ){
- var el = e.srcElement ? e.srcElement : e.target;
- if ( $( el ).is( factory.args.layer_sel ) ){
- factory.remove_layer( el.id );
- }
- }, false );
- section.addEventListener( "DOMNodeInserted", function ( e ){
- var el = e.srcElement ? e.srcElement : e.target;
- if ( $( el ).is( factory.args.layer_sel ) ){
- factory.add_layer( el, section_id );
- }
- }, false );
- }
- section.addEventListener( "DOMNodeRemoved", function ( e ){ /* for dynamically removed content */
- window.cws_prlx.prepare_section_data( section_id );
- },false );
- section.addEventListener( "DOMNodeInserted", function ( e ){ /* for dynamically added content */
- window.cws_prlx.prepare_section_data( section_id );
- },false );
- for ( i = 0; i < layers.length; i++ ){
- layer = layers[i];
- factory.add_layer( layer, section_id )
- }
- return section_id;
- }
- function cws_prlx_add_layer ( layer, section_id ){
- var factory, layer_rel_speed, layer_params;
- factory = this;
- layer.id = !layer.id.length ? window.cws_prlx.servant.uniq_id( 'cws_prlx_layer_' ) : layer.id;
- layer_rel_speed = $( layer ).data( 'scroll-speed' );
- layer_rel_speed = layer_rel_speed != undefined ? layer_rel_speed : factory.args.def_speed;
- layer_params = {
- 'el' : layer,
- 'section_id' : section_id,
- 'height' : null,
- 'loaded' : false,
- 'rel_speed' : layer_rel_speed,
- 'speed' : null
- }
- window.cws_prlx.layers[layer.id] = layer_params;
- return layer.id;
- }
- function cws_prlx_remove_layer ( layer_id ){
- var layers;
- layers = window.cws_prlx.layers;
- if ( layers[layer_id] != undefined ){
- delete layers[layer_id];
- }
- }
- function cws_prlx_prepare_section_data ( section_id ){
- var section, section_params, layer_sel, layers, layer, layer_id, i;
- if ( !Object.keys( window.cws_prlx.sections ).length || window.cws_prlx.sections[section_id] == undefined ) return false;
- section_params = window.cws_prlx.sections[section_id];
- section = section_params.el;
- section_params.height = section.offsetHeight;
- section_obj = $( section );
- layers = $( section_params.layer_sel, section_obj );
- for ( i=0; i<layers.length; i++ ){
- layer = layers[i];
- layer_id = layer.id;
- if ( layer_id ) window.cws_prlx.prepare_layer_data( layer_id, section_id );
- }
- }
- function cws_prlx_prepare_layer_data ( layer_id, section_id ){
- window.cws_prlx.servant.wait_for( 'layer_loaded', [ layer_id ], function ( layer_id ){
- var layer_params, layer;
- layer_params = window.cws_prlx.layers[layer_id];
- layer = layer_params.el;
- layer_params.height = layer.offsetHeight;
- window.cws_prlx.calc_layer_speed( layer_id );
- window.cws_prlx.translate_layer( layer_id );
- layer_params.loaded = true;
- }, [ layer_id ]);
- }
- function cws_prlx_translate_layers (){
- var layers, layer_ids, layer_id, i;
- if ( window.cws_prlx == undefined ) return;
- layers = window.cws_prlx.layers;
- layer_ids = Object.keys( layers );
- for ( i = 0; i < layer_ids.length; i++ ){
- layer_id = layer_ids[i];
- window.cws_prlx.translate_layer( layer_id );
- }
- }
- function cws_prlx_translate_layer ( layer_id ){
- var layer_params, section, layer, layer_translation, style_adjs;
- if ( window.cws_prlx == undefined || window.cws_prlx.layers[layer_id] == undefined ) return false;
- layer_params = window.cws_prlx.layers[layer_id];
- if ( layer_params.speed == null ) return false;
- if ( layer_params.section_id == undefined || window.cws_prlx.sections[layer_params.section_id] == undefined ) return false;
- section = window.cws_prlx.sections[layer_params.section_id].el;
- if ( window.cws_prlx.servant.is_visible( section ) ) {
- layer = layer_params.el;
- layer_translation = ( section.getBoundingClientRect().top - window.innerHeight ) * layer_params.speed;
- style_adjs = {
- "WebkitTransform" : "translate(-50%," + layer_translation + "px)",
- "MozTransform" : "translate(-50%," + layer_translation + "px)",
- "msTransform" : "translate(-50%," + layer_translation + "px)",
- "OTransform" : "translate(-50%," + layer_translation + "px)",
- "transform" : "translate(-50%," + layer_translation + "px)"
- }
- for ( key in style_adjs ){
- layer.style[key] = style_adjs[key];
- }
- }
- }
- function cws_servant (){
- this.uniq_id = cws_uniq_id;
- this.wait_for = cws_wait_for;
- this.is_visible = cws_is_visible;
- this.is_mobile = cws_is_mobile;
- }
- function cws_uniq_id ( prefix ){
- var d, t, n, id;
- var prefix = prefix != undefined ? prefix : "";
- d = new Date();
- t = d.getTime();
- n = parseInt( Math.random() * t );
- id = prefix + n;
- return id;
- }
- function cws_wait_for ( condition, condition_args, callback, callback_args ){
- var match = false;
- var condition_args = condition_args != undefined && typeof condition_args == 'object' ? condition_args : new Array();
- var callback_args = callback_args != undefined && typeof callback_args == 'object' ? callback_args : new Array();
- if ( condition == undefined || typeof condition != 'string' || callback == undefined || typeof callback != 'function' ) return match;
- match = window.cws_prlx.conditions[condition].apply( window, condition_args );
- if ( match == true ){
- callback.apply( window, callback_args );
- return true;
- }
- else if ( match == false ){
- setTimeout( function (){
- cws_wait_for ( condition, condition_args, callback, callback_args );
- }, 10);
- }
- else{
- return false;
- }
- }
- function cws_is_visible ( el ){
- var window_top, window_height, window_bottom, el_top, el_height, el_bottom, r;
- window_top = window.pageYOffset;
- window_height = window.innerHeight;
- window_bottom = window_top + window_height;
- el_top = $( el ).offset().top;
- el_height = el.offsetHeight;
- el_bottom = el_top + el_height;
- r = ( el_top > window_top && el_top < window_bottom ) || ( el_top < window_top && el_bottom > window_bottom ) || ( el_bottom > window_top && el_bottom < window_bottom ) ? true : false;
- return r;
- }
- function cws_is_mobile (){
- return window.innerWidth < 768;
- }
- function cws_prlx_layer_loaded_condition ( layer_id ){
- var layer, r;
- r = false;
- if ( layer_id == undefined || typeof layer_id != 'string' ) return r;
- if ( window.cws_prlx.layers[layer_id] == undefined ) return r;
- layer = window.cws_prlx.layers[layer_id].el;
- switch ( layer.tagName ){
- case "IMG":
- if ( layer.complete == undefined ){
- console.log( 'img hasn\'t complete property' );
- }
- else{
- if ( !layer.complete ){
- return r;
- }
- }
- break;
- case "DIV": /* for youtube video background */
- if ( /^video-/.test( layer.id ) ){
- return r;
- }
- break;
- }
- return true;
- }
- function cws_prlx_calc_layer_speed ( layer_id ){
- var layer_params, layer, section_id, section_params, window_height;
- layer_params = window.cws_prlx.layers[layer_id];
- layer = layer_params.el;
- section_id = layer_params.section_id;
- section_params = window.cws_prlx.sections[section_id];
- window_height = window.innerHeight;
- layer_params.speed = ( ( layer_params.height - section_params.height ) / ( window_height + section_params.height ) ) * ( layer_params.rel_speed / 100 );
- }
- }(jQuery));
|