POPSブログ

簡易SLICE-PHOTO/2

40

  Category:  jquery2012/03/02 pops 

簡易SLICE-PHOTO-2、画像をスライスして、一部フェードエフェクトを加えてみました。
動作が重いため閲覧には、Google Chrome を推奨します。


簡易SLICE-PHOTO-2

pops-slicephoto02.js

スライス、サンプル表示 (一部をフェード処理)



簡易SLICE-PHOTO-1 pops-slicephoto01.js を少し改造して一部フェードを加えてみました。
HTML構造を直接書きますが、残り画像はJS側スクリプトに記述します。HTML構造、CSSは簡易SLICE-PHOTO-1と同一です。

  • 簡易記述方式のJSです。読み込めば直ぐ実行します。
  • サイクルタイムは、JSで2種設定できます。書き換えてください。
    (スタートまでの時間、サイクル、スライドの時間など、画像の大きさ状況にあわせる)
  • JSで必要な設定をして上書き保存する。
  • 画像は個人で、5-10枚用意ください。
  • 画像名、画像までのパスはJSに記載します、随時ロード形式です。
    (その都度、画像をロードしますので、画像転送量を少し抑えることができます)
  • 画像の大きさで、CSSをも変更ください。
  • TOPページ用途です。複数の設置は原則できません。
  • 基本的に pops-slicephoto01.js とほぼ同じです。
  • IE8 はキレイに動作しません。Google Chrome を利用ください。

簡単な動作の説明

説明図


詳細は、簡易SLICE-PHOTO-1をご覧ください。
伸縮しない、スライス画像をプラスして、フェード処理を加えてみました。但し、表示、動作はマシンの性能が大きく関わりますので十分な注意が必要です。上の図は当方のスライス要素伸縮の区分です。


簡単なスクリプト説明


本来スライス要素の伸縮方向を考えて4種類のスケールパターンを持っています。
現在は3番です、新たに伸縮しない、0番を加えてフェードさせます。
//random-scale/0.3
var random_sc = Math.floor(Math.random() * 2);
var random_scale=0;
if (random_sc > 0) {random_scale=3;}

50%の確率でフェードさせます。
0番は伸縮しないのでフェードかスライドさせます。

そのほか少しだけ「スケールパターン」により変更箇所があります。

フェードインの場合最初は透明度0を設定しているだけです。

//フェード透明度、開始、終点の値
var start_alpha=1,end_alpha=1;
//FADE-SET、終了処理での判定フラグ
fade_set = '';
//fadeの対象は0番
if (random_scale == 0) {
	if (slice_move_type == 'in') {
		start_alpha=0;end_alpha=1;fade_set='fade';
		//事前に一括処理
		slicebase.find(".slice_bk").css({'opacity':0});
	}
	if (slice_move_type == 'out') {start_alpha=1;end_alpha=0;fade_set='fade';}
}
本来は、
slice_chips[k].css({'opacity':start_alpha}).delay(delay_st[k]).animate({'left':anim_X,'top':anim_Y,...............
で処理するのが通常ですが、IEで処理が重なり遅いので、事前に一括処理しています。
IE以外ではOKのコードです。

終了処理でフェード処理された場合に、戻すための判定フラグです。
fade_set 'fade'

終了処理で
//fade
if (fade_set=='fade') {
	slicebase.find(".slice_bk").css({'opacity':1});
	slicebase.find(".slice_bk").css({'filter':'none'});
}
一応機能しているようです。だめな場合もあります。「IEのお天気」次第ですから、、

HTMLの構成次第ではIEアルファフィルターの削除を行わなくとも良い場合があります。
IEアルファフィルターの振る舞いは「IEのお天気」次第で、修正に何日もかかる場合もあります。
よって「フェード」を行わないほうが賢明です。


設置方法

簡易SLICE-PHOTO-1を参照ください。【参照】簡易SLICE-PHOTO-1


JS、CSS、Loading画像

JS pops-slicephoto02.js 通常方式

同一のループを何段にも重ねていますが、勿論1つのループで処理は可能ですが、正確なdelay値をアニメで処理させるために、あえて分割しています。マシン環境により正確にdelay値を送出できるとは限りません。ActinScriptなどとは同一に出来ません。中には使用していない変数もあります。


//pops-slicephoto02.js
//setTimeout loading 通常方式
//POPS WEB KOUBOU

(function($){

	$(function(){

		var bs_W = 640;
		var bs_H = 200;
		var split_h = 12;
		var split_v = 4;
		var split_total = split_h*split_v;

		var first_time = 12000;//スタートまでの時間、5000以上 
		var cycle_time = 8000;//サイクル 5000以上
		var speed = 600;//拡大縮小時間 400-1000
		var delay_speed = 200;//delay基準時間 100-200
		//TEXT表示
		var text_use="";//use

		//画像までのパス
		var path='/main/images/';
		//画像名を登録する
		var img_urls=['photo_m1.jpg','photo_m2.jpg','photo_m3.jpg','photo_m4.jpg'];
		var list_len=img_urls.length;

		//jQueryObjectCache
		var imgholder_elm,transition_base_elm,slicebase,cleaner_elm;
		var img_url,img_url2,loading,thumbshowbox;
		var imgPreloader;//opela

		//chash
		transition_base_elm = $('#slice_box');
		imgholder_elm = $('#slice_box #s_imgholder');
		slicebase = $('#slice_box #slice_base');
		loading = $('#slice_box #s_loading');

		var count = 0;
		var img_url = "";
		var keep_url = "";

		//slice-OBJ
		var slice_chips = [];
		//slice in
		var slicebs_pos_x = [],slicebs_pos_y = [],slicebs_W = [],slicebs_H = [];
		var slice_W = 0,slice_H = 0,slice_Wb = 0,slice_Hb = 0;

		//IN OUT
		var in_type_nm = ['in','out','in','out','in','out'];

		//移動位置配列
		var mv_posX = [];
		var mv_posY = [];

		var sliceflag = 0;
		var anime_move = "";
		var box_len;
		var box_len2;
		var delayflag = 0;
		//FADE-SET
		var fade_set = '';

		//global
		var gl_roop_v = 0;
		//Even算出
		var even_v = 1;
		if (split_v % 2 != 0) {even_v = 0;}

		//------------------------------------------------

		//init
		var init = function () {

			//loading-Set
			loading.css({'width':bs_W,'height':bs_H,'display':'none'});
			//sliceBox非表示
			slicebase.css({'display':'none'});

			var roop_v = split_total;
			//global
			gl_roop_v = roop_v;

			//スライス要素を作る
			//make chip
			var sliceboxs="";
			for (var i=0; i < roop_v; i++) {
				sliceboxs += '<div id="'+ 'slice'+ i + '" class="slice_bk"></div>';
			}
			//append #slice_base
 			$('#slice_base').append(sliceboxs);
			//len
			box_len = $('.slice_bk').length;
			//slice chips
			for (var i=0; i < roop_v; i++) {
				slice_chips[i] = $("#slice"+i);
			}
			slicebase.find(".slice_bk").css({'display':'none'});

			//slice-set
			slice_set()

			//最初の画像をINNER画像BOX1にセット表示する
			keep_url=path+img_urls[count];
			//次ぎの画像の番号セット
			count = 1;

			//START Main-timer-set
			window.setTimeout(nextImage,first_time);

		}

		//slice-set
		function slice_set() {

			//スライス
			slice_W = Math.round(bs_W/split_h);//YOKO
			slice_H = Math.round(bs_H/split_v);//TATE
			slice_Wb = bs_W - slice_W * (split_h - 1);
			slice_Hb = bs_H - slice_H * (split_v - 1);

			var k = 0;
			for (var i=0; i < split_h; i++) {
				for (var j=0; j < split_v; j++) {
					//大きさ保存
					slicebs_W[k] = slice_W;
					if (i == split_h - 1) {slicebs_W[k] = slice_Wb;}
					slicebs_H[k] = slice_H;
					if (j == split_v - 1) {slicebs_H[k] = slice_Hb;}
					//位置保存
					slicebs_pos_x[k] = slice_W * i;
					slicebs_pos_y[k] = slice_H * j;

					k ++;
				}
			}
		}

		//sliceImage-view関数
		function sliceImage (){

			anime_move = 'move';
			set_text("");

			//delayクリア
			var delay_st=[];

			//多目的判定用
			var chgxyflag = Math.floor(Math.random() * 5);
			//多目的判定用2 追加
			var chgflag = Math.floor(Math.random() * 2);
			//delayed遅延させる/20%
			var delayed = Math.floor(Math.random() * 5);
			//IN OUT
			var slice_move_type = in_type_nm[Math.floor(Math.random() * in_type_nm.length)];
			//標準delay_no 0-7
			var delay_no = Math.floor(Math.random() * 7);
			//random-scale/0.3
			var random_sc = Math.floor(Math.random() * 2);
			var random_scale=0;
			if (random_sc > 0) {random_scale=3;}

			//url
			var slice_url = img_url;
			//OUTは下層画像URL取得
			if (slice_move_type == 'out') {slice_url = imgholder_elm.children("img").attr('src');}

			//BOX欄外移動
			slicebase.css({'top':0,'left':0,'width':bs_W,'height':bs_H});

			//背景画像挿入
			var k = 0;
			for (var i=0; i < split_h; i++) {
				for (var j=0; j < split_v; j++) {
					slice_chips[k].css({'left':slicebs_pos_x[k]});
					slice_chips[k].css({'top':slicebs_pos_y[k]});
					//BACKGROUND-SET url
					slice_chips[k].css({'width':slicebs_W[k],'height':slicebs_H[k],'background-image':'url('+ slice_url + ')'});
					//BACKGROUND-SET position
					slice_chips[k].css({'backgroundPosition':(slicebs_pos_x[k] * -1) + 'px ' + (slicebs_pos_y[k] * -1) + 'px'});
					k ++;
				}
			}

			//chips-display
			slicebase.find(".slice_bk").css({'display':'block'});

			if (slice_move_type == 'out') {imgholder_elm.children("img").empty().attr({'src':img_url}).css({'display':'block'});}

			//スケール変更なし、現在使用されていない
			if (random_scale == 0) {width_v = slicebs_W[k];height_v = slicebs_H[k];}

			//初期の大きさ-SET
			var pos_sx = 0;
			var pos_sy = 0;
			var pos_sx_c = 0;
			var pos_sy_c = 0;
			var k = 0;
			for (var i=0; i < split_h; i++) {
				for (var j=0; j < split_v; j++) {

					pos_sx_c = 0;
					pos_sy_c = 0;
					if (random_scale > 0) {
						pos_sx_c=Math.floor(slicebs_W[k] / 2);
						pos_sy_c=Math.floor(slicebs_H[k] / 2);
					}
					//XY
					//その場中心補正、実際には場所をずらして中心補正をしているようにみせかけて要る
					pos_sx = slicebs_pos_x[k] + pos_sx_c;
					pos_sy = slicebs_pos_y[k] + pos_sx_c;
					//in css
					if (slice_move_type == 'in') {
						if (random_scale == 0) {
							slice_chips[k].css({'top':pos_sy,'left':pos_sx,'width':slicebs_W[k],'height':slicebs_H[k]});
						}
						if (random_scale > 0) {
							slice_chips[k].css({'top':pos_sy,'left':pos_sx,'width':0,'height':0});
						}
					}
					//outはcss移動なし、大きさそのまま
					if (slice_move_type == 'out') {
						//移動位置配列に位置保存
						mv_posX[k]=pos_sx;
						mv_posY[k]=pos_sy;
					}

					k ++;
				}
			}

			//delay-SET/delay_no
			var flag3 = 1;
			var kk = 0;//方向違いカウント
			var kkk = 0;//半分でカウントダウン
			var k = 0;
			for (var i=0; i < split_h; i++) {
				for (var j=0; j < split_v; j++) {

					//縦方向にカウント
					kk = i * split_v + j;

					kkk=k;
					if (k > (split_total-1)/2) {kkk = Math.abs(split_total-k)-1;}

					if (delay_no == 0) {delay_st[k] = k * delay_speed;}
					if (delay_no == 1) {delay_st[k] = kk * delay_speed;}//50
					if (delay_no == 2) {delay_st[k] = Math.abs(k-split_total/2) * delay_speed;}//100
					//外から
					if (delay_no == 3) {delay_st[k] = kkk*delay_speed;}//100
					//IE対策、本来は、(i+j)
					if (delay_no > 3) {delay_st[k] = (i+j+k/split_total/4) * delay_speed;}
					//delayed遅延
					if (delayed == 1) {
						if (flag3 < 0) {delay_st[k] +=500;}
					}

					k ++;
					flag3 *= -1;

				}
				if (even_v) {flag3 *= -1;}
			}

			//delay反転
			if (chgxyflag > 2) {
				delay_st.reverse();
			}

			var text="SPLIT: " + split_total + " /IN.OUT "+ slice_move_type + " /DELAY " + delay_no + "";
			set_text(text);
			//set_text("START");

			//フェード透明度
			var start_alpha=1,end_alpha=1;
			//FADE-SET
			fade_set = '';
			//fade
			if (random_scale == 0) {
				if (slice_move_type == 'in') {
					start_alpha=0;end_alpha=1;fade_set='fade';
					slicebase.find(".slice_bk").css({'opacity':0});
				}
				if (slice_move_type == 'out') {start_alpha=1;end_alpha=0;fade_set='fade';}
			}

			//BOX 0.0移動
			slicebase.css({'top':0,'left':0});
			slicebase.css({'display':'block'});

			//アニメ実行、IN OUT 共用にして、取替え用変数
			var anim_W,anim_H,anim_X,anim_Y;
			//スライスアニメカウント
			sliceflag = 0;
			var k = 0;
			for (var i=0; i < split_h; i++) {
				for (var j=0; j < split_v; j++) {

					//IN OUT 差し替え
					if (slice_move_type == 'in') {anim_W=slicebs_W[k];anim_H=slicebs_H[k];anim_Y=slicebs_pos_y[k];anim_X=slicebs_pos_x[k];}
					if (slice_move_type == 'out') {
						if (random_scale > 0) {anim_W=0;anim_H=0;anim_X=mv_posX[k];anim_Y=mv_posY[k];}
						if (random_scale == 0) {anim_W=slicebs_W[k];anim_H=slicebs_H[k];anim_X=mv_posX[k];anim_Y=mv_posY[k];}
					}

					//anime/IN OUT共用]
					slice_chips[k].delay(delay_st[k]).animate({'left':anim_X,'top':anim_Y,'width':anim_W,'height':anim_H,'opacity':end_alpha},speed,function() {
						sliceflag ++;
						//goto slice_image_parts/new_split_total
						if (sliceflag == split_total) {slice_image_parts();}
					});
					k ++;
				}
			}

		};

		//end-anime
		function slice_image_parts() {
			sliceflag = 0;
			imgholder_elm.children("img").empty().attr({'src':img_url}).css({'display':'block'});

			slicebase.css({'left':bs_W,'display':'none'});	
			anime_move = '';
			//fade
			if (fade_set=='fade') {
				slicebase.find(".slice_bk").css({'opacity':1});
				slicebase.find(".slice_bk").css({'filter':'none'});
			}
			fade_set='';

			//keep-url
			keep_url=img_url;
			//cycle-time
			setTimeout(nextImage,cycle_time);
		};

		//NEXT
		function nextImage() {
			//カウントアップ
			count++;
			if (count > list_len-1) {count = 0;}
			//imgタグに入れる、URL取得
			img_url = path+img_urls[count];
			imgload ();
		}

		//imgPreloader
		var imgload = function() {
			//loading
			loading.css({'display':'block'});
			//set-imgPreloader
			imgPreloader = new Image();
			//onload
			imgPreloader.onload = function() {
				//loading
				loading.css({'display':'none'});
				sliceImage();
			}
			//url
			imgPreloader.src = img_url;
		}

		//set-text
		function set_text(text) {
			if (text_use == 'use') {
				$('#view_text').text(text);
			}
		}

		//init start
		init();

	});

})(jQuery);

Loading画像 31x31



CSS pops-slicephoto02.css / 01と同一


/* pops-slicephoto02.css 日本語*/

#pops_slice_photo {
	display:block;
	position:relative;
	width:640px;
	height:200px;
	background-color:#000000;
}
#pops_slice_photo #slice_box {
	display:block;
	position:absolute;
	top:0;left:0;
	width:640px;
	height:200px;
	background-color:#000000;
	overflow:hidden;
}

#slice_box #s_imgholder {
	display:block;
	position:absolute;
	top:0;left:0;
	width:640px;
	height:200px;
	padding:0;
	margin:0;
	border-style:none;
	background-color:#000000;
}
#slice_box #s_imgholder img {
	padding:0;
	margin:0;
	border-style:none;
	text-decoration:none;
}

#slice_box #slice_base {
	display:block;
	position:absolute;
	top:0;left:0;
	overflow:hidden;
}
#slice_box #slice_base .slice_bk {
	position:absolute;
	background-position: 0 0;
	top:0;left:0;
	overflow:hidden;
}
#slice_box #s_loading {
	display: block;
	position:absolute;
	top:0;left:0;
	border:0;
	background: url("/main/images/loading.gif") no-repeat center center;
	background-color: none;/*Safari*/
}
#slice_box #view_text {
	display:block;
	position:absolute;
	top:5px;left:5px;
	width:80%;
	height:20px;
	color:#FF0000;
}

以上です。



[ この記事のURL ]


タグ:series , photo , Transition , jquery

[ 簡易SLICE-PHOTO シリーズ記事 ]

簡易SLIDESHOW/42012.03.14
簡易SLIDESHOW/32012.03.13
簡易SLIDESHOW/22012.03.12
簡易TRANSITION-PHOTO/42012.03.09
簡易SLICE-PHOTO/72012.03.05
簡易SLICE-PHOTO/62012.03.05
簡易SLICE-PHOTO/52012.03.04
簡易SLICE-PHOTO/42012.03.03
簡易SLICE-PHOTO/32012.03.02
簡易SLICE-PHOTO/22012.03.02
簡易SLICE-PHOTO/12012.03.01

 

ブログ記事一覧

年別アーカイブ一覧



[1]