画像変更

ある日、インターネットで素晴らしいギャラリーに出くわしました。住所を忘れましたが、彼女の考えは私の記憶に残りました。 そして、あるサイトでは、ある種の非標準的な写真の変更が必要でした(減衰とクリーピングはすでに退屈でした)そして、私はそれについて思い出しました。







ポイントは何ですか? そのため、画像は部分(正方形、ストライプなど)で開き、表示されるだけでなく、すべてに効果が詰め込まれます。



それでは、始めましょう。





最初に小さな設定を行います

change_img={

x:7,

y:10,

sort:4,

delay:{

st:5000,

animate:1000,

cadr:50

},

div_id: 'slider_photo'

}




* This source code was highlighted with Source Code Highlighter .








change_img={

x:7,

y:10,

sort:4,

delay:{

st:5000,

animate:1000,

cadr:50

},

div_id: 'slider_photo'

}




* This source code was highlighted with Source Code Highlighter .










ここでは、すべてがシンプルで明確だと思います。 行/列の数、並べ替えの種類(詳細は後述)、変更時の遅延、写真付きdivのid。



一番下の行は、画像を含むdivに、背景が配置された小さなdivasがいっぱいであり、必要に応じて既に回転していることです。



最初に、正方形の幅と高さを計算します

r=$( '#' +change_img.div_id+ ' img' );

change_img_x=(r[0].height/change_img.x+ '' ).replace(/(.*)\.(.*)/, "$1" )-1+1;

change_img_y=(r[0].width/change_img.y+ '' ).replace(/(.*)\.(.*)/, "$1" )-1+1;



* This source code was highlighted with Source Code Highlighter .








r=$( '#' +change_img.div_id+ ' img' );

change_img_x=(r[0].height/change_img.x+ '' ).replace(/(.*)\.(.*)/, "$1" )-1+1;

change_img_y=(r[0].width/change_img.y+ '' ).replace(/(.*)\.(.*)/, "$1" )-1+1;



* This source code was highlighted with Source Code Highlighter .












これらの非常に正方形でdivを埋めます

function create_div_img(){

x=0;

for (i=0;i<change_img.x;i++)

for (k=0;k<change_img.y;k++){



d= document .createElement( 'DIV' );

$(d).css({

position: 'absolute' ,

top:change_img_x*i+ 'px' ,

left:change_img_y*k+ 'px' ,

opacity:0,

'z-index' :10,

background: 'url("' +src_i[x]+ '")' ,

'backgroun-position' : '-' +(change_img_y*k)+ 'px-' +(change_img_x*i)+ 'px'

});

d.className= 'img_change_s_0' ;d.style.backgroundPosition= '-' +(change_img_y*k)+ 'px -' +(change_img_x*i)+ 'px' ;



document .getElementById( 'img_change_' +x).appendChild(d);

}

}




* This source code was highlighted with Source Code Highlighter .








function create_div_img(){

x=0;

for (i=0;i<change_img.x;i++)

for (k=0;k<change_img.y;k++){



d= document .createElement( 'DIV' );

$(d).css({

position: 'absolute' ,

top:change_img_x*i+ 'px' ,

left:change_img_y*k+ 'px' ,

opacity:0,

'z-index' :10,

background: 'url("' +src_i[x]+ '")' ,

'backgroun-position' : '-' +(change_img_y*k)+ 'px-' +(change_img_x*i)+ 'px'

});

d.className= 'img_change_s_0' ;d.style.backgroundPosition= '-' +(change_img_y*k)+ 'px -' +(change_img_x*i)+ 'px' ;



document .getElementById( 'img_change_' +x).appendChild(d);

}

}




* This source code was highlighted with Source Code Highlighter .










まあ、すべてが簡単です-絶対配置で正方形を作成するための2サイクル



そして今、これらの部分のスムーズな拡張を作成する関数自体

function div_animate(){

s=0;

setTimeout(ferter,change_img.delay.cadr);

function ferter(){

if (s>=change_img.x*change_img.y) return ;

$(referrer[arr_chagr[s++]]).animate({opacity:1,width:change_img_y,height:change_img_x},change_img.delay.animate);

setTimeout(ferter,change_img.delay.cadr);

}

}




* This source code was highlighted with Source Code Highlighter .








function div_animate(){

s=0;

setTimeout(ferter,change_img.delay.cadr);

function ferter(){

if (s>=change_img.x*change_img.y) return ;

$(referrer[arr_chagr[s++]]).animate({opacity:1,width:change_img_y,height:change_img_x},change_img.delay.animate);

setTimeout(ferter,change_img.delay.cadr);

}

}




* This source code was highlighted with Source Code Highlighter .










ここでも、すべてが明確です-タイミングによって、新しい広場のアニメーションを呼び出します。 ブラウザを最小化して展開すると(any)、クラッシュし、正方形がほぼ同時に表示されるため、setIntervalを拒否しました。



さて、コードを注意深く見ると、arr_chagr配列が表示されています。この配列は(まだ)どこでも宣言されておらず、何もしません。

この配列は、正方形の外観のシーケンスを担当します。 まず、設定で、ソートタイプ(0〜5)を設定します。



次に、この機能を検討してください。

function get_array_change(x){

reff= new Array();

for (i=0;i<x;i++)reff[i]=i;

switch (change_img.sort){

default :

case 0: return reff; break ;

case 1: return reff.reverse(); break ;

case 2: return array_x(); break ;

case 3: return array_x().reverse(); break ;

case 4: return array_casc(); break ;

case 5: return array_casc().reverse(); break ;

}

function array_x(){

arr= new Array();es=0;

for (i=0;i<change_img.y;i++)

for (k=0;k<change_img.x;k++){

arr[es++]=reff[i+k*change_img.y];

}

return arr;

}

function array_casc(){

arr= new Array();sr=change_img.y-change_img.x;

es=0;rem_x=-1;fer_y=0;rif=-1;

for (i=0;i<change_img.x;i++){

rif++;gren=0;

rem_x+=rif+1;fer_y=rif;

keyt=rem_x;miss=0;

for (k=0;k<change_img.y;k++){

if (k)keyt+=fer_y;

if (fer_y<change_img.x&&!gren)fer_y++;

else {miss++} if (miss>=sr&&k){fer_y--;gren=1;}

arr[keyt]=reff[es++];

}

}

return arr;

}

}




* This source code was highlighted with Source Code Highlighter .








function get_array_change(x){

reff= new Array();

for (i=0;i<x;i++)reff[i]=i;

switch (change_img.sort){

default :

case 0: return reff; break ;

case 1: return reff.reverse(); break ;

case 2: return array_x(); break ;

case 3: return array_x().reverse(); break ;

case 4: return array_casc(); break ;

case 5: return array_casc().reverse(); break ;

}

function array_x(){

arr= new Array();es=0;

for (i=0;i<change_img.y;i++)

for (k=0;k<change_img.x;k++){

arr[es++]=reff[i+k*change_img.y];

}

return arr;

}

function array_casc(){

arr= new Array();sr=change_img.y-change_img.x;

es=0;rem_x=-1;fer_y=0;rif=-1;

for (i=0;i<change_img.x;i++){

rif++;gren=0;

rem_x+=rif+1;fer_y=rif;

keyt=rem_x;miss=0;

for (k=0;k<change_img.y;k++){

if (k)keyt+=fer_y;

if (fer_y<change_img.x&&!gren)fer_y++;

else {miss++} if (miss>=sr&&k){fer_y--;gren=1;}

arr[keyt]=reff[es++];

}

}

return arr;

}

}




* This source code was highlighted with Source Code Highlighter .










配列内のx個の要素を取得します(arr_chagr = get_array_change(change_img.x * change_img.y);)

さて、最初の2つのケースはすべて明確です-シンプルで拡張された配列。







次に2つのケースがあります-同じことですが、垂直に並べ替えるだけです(array_x()関数)。







そして最後のものはカスケードです。 言葉で説明するのは非常に難しいと思います-このソートは、列数>行数の場合にのみ機能すると言います。 (change_img.y> change_img.x)。







カスケードに関する他の何か-問題はまた、最初は十分に速く画像が開くことでしたが、中間になると徐々に遅くなります。 原則として、最初の対角線を表示するには、1-2の正方形が必要です。最大の正方形の数は、中央の対角線になります-7は、1つの対角線の7倍、2の3.5倍などd。

標準関数div_animate()を置き換える必要がありました

function div_animate(){

s=0;

if (change_img.sort==4||change_img.sort==5){

change_img.delay.cadr=regular;

del_rem=change_img.x*change_img.y/2;

}

setTimeout(ferter,change_img.delay.cadr);

function ferter(){

if (s>=change_img.x*change_img.y) return ;

$(referrer[arr_chagr[s++]]).animate({opacity:1,width:change_img_y,height:change_img_x},change_img.delay.animate);

if (change_img.sort==4||change_img.sort==5){

if (s<del_rem)setTimeout(ferter,change_img.delay.cadr-=change_img.delay.cadr/25);

else setTimeout(ferter,change_img.delay.cadr+=change_img.delay.cadr/25);

}

else setTimeout(ferter,change_img.delay.cadr);

}

}




* This source code was highlighted with Source Code Highlighter .






一番下の行は-スクリプトが正方形の半分を通過するまで、それらを開く間隔は標準間隔/ 25(change_img.delay.cadr / 25)だけ増加し、その後同じミリ秒数だけ増加します。 その結果、画像表示の開始と中間の速度の違いはほとんど目立ちません



まあ、それだけです。



このすべてのhtmlコード

"slider_photo">

"/template/img/1.jpg"
/>

"/template/img/2.jpg"




"slider_photo">

"/template/img/1.jpg"
/>

"/template/img/2.jpg"




/>

「/template/img/3.jpg」
/>





*このソースコードは、 ソースコードハイライターで強調表示されました。



写真の美しい変更は、どのサイトにも簡単に統合でき、カスタマイズも簡単です。

IEでも動作します。



残念ながら、小さなニーズのために独自のサイトがないため、例を挙げることはできません。

すべてのコードは、 ここで表示およびダウンロードできます



updデモはここで見ることができます



upd2コードを変更しました。 現在、ほぼ純粋なjsの関数によって実装されています(jqueryはアニメーションにのみ使用されます)ありがとう、 Seldon



All Articles