2017-03-08 1 views
2

JavaScriptの初心者ですが、マウスホイールをスクロールして画像サイズのサイズを変更しようとしています。私はこれをChromeで実行します。JavaScript - マウスホイールで画像サイズを変更しようとしています

このコードは高さのサイズを変更しますが、幅は変更しません。私はimg1.heightとimg1.widthに数字を代入することで紙の上でそれを試してみましたが、それは動作しますが、コードを実行すると動作しません。

HTMLは

<img id="img1" src="https://upload.wikimedia.org/wikipedia/commons/7/73/HDRI_Sample_Scene_Balls_(Auto_Exposure).jpg" style="position:absolute; transition: 1s all"> 

JAVASCRIPT --- 間違ったコードは、動作していない、唯一の高さは

function changeSize(e) { 
    var img1 = document.getElementById("img1"); 
    var slope = img1.height/img1.width; 

    img1.height = img1.height + e.deltaY; 
    img1.width = img1.height/slope; 
} 

function init() { 
    window.onwheel = changeSize; 
} 

window.onload = init; 
同じHTMLコードで

、作品次のコードを変更しますが、私は理解していません新しい高さを変数にコピーし、その高さの代わりにその変数を使用するのがなぜ効果があるのでしょうか。

JAVASCRIPT --- 正しいコード、作業、高さと幅の両方が答えを

function changeSize(e) { 
    var img1 = document.getElementById("img1"); 
    var slope = img1.height/img1.width; 
    var change = img1.height + e.deltaY; 

    img1.height = change; 
    img1.width = change/slope; 
} 

function init() { 
    window.onwheel = changeSize; 
} 

window.onload = init; 

感謝を変更します。

+1

は全く高さを変更しないでください変更しないように、最初のコードであるため、幅が高さの更新に依存します、サイズを変更すると高さが自動的にリサイズされ、縦横比は維持されます – Justinas

+0

CSSの幅をリサイズするときの高さの自動調整ですか?何か全く違う? – George

+0

まあ、技術的にはブラウザのことです。 – Justinas

答えて

1
img1.height = img1.height + e.deltaY; 
img1.width = img1.height/slope; 

は以下のスニペットでそれを試してみてください。問題は、イメージのプロパティが非同期に設定されていることです。以前に割り当てられている高さの値を、読み出すためには、あなたはこのように、onloadイベントを待つ必要があります。

img1.height = img1.height + e.deltaY; 
img1.onload = function() { 
    img1.width = img1.height/slope; 
} 
+0

答えと説明をありがとう! :) 2番目のコードブロックの2行目にタイプミスがあります。 ** img1 ** – George

+0

はい、タイプミスがありました。修正しました。ありがとう! –

0

マークアップ/ cssで1つのディメンションのみを指定し、wheelイベントでこれを変更します。アスペクト比を損なわずに画像のサイズが変更されます。像高に値を代入するとすぐにそれを読むために試みがある上に、このコードで

var image = document.getElementById('image'); 
 
image.addEventListener('wheel', function(e) { 
 
    this.width += Math.floor(e.deltaY); 
 
    e.preventDefault(); 
 
});
img { 
 
    position: absolute; top: 50%; left: 50%; 
 
    transform: translate(-50%, -50%); 
 
    transition: all 0.2s linear; 
 
}
<img id="image" src="//placehold.it/240x120/33d/fff">

+0

非常に良い!どのように私はこの画像の上にあるdiv要素のサイズを変更するか考えてみましょう?私は別のaddEventListenerを追加しようとしましたが、これはちょうど要素のために働くのですか? – alekbless

0

をこのコードで作業:

function changeSize(e) { 
    var img1 = document.getElementById("img1"); 
    var slope = img1.height/img1.width; 

    img1.height = img1.height + e.deltaY; 
    img1.width = img1.height/slope; 
} 

function init() { 
    window.onwheel = changeSize; 
} 

window.onload = init; 

を我々はalertを追加する場合このような:

function changeSize(e) { 
 
    var img1 = document.getElementById("img1"); 
 
    var slope = img1.height/img1.width; 
 
    img1.height = img1.height + e.deltaY; 
 
    alert(img1.height); 
 
    img1.width = img1.height/slope; 
 
} 
 

 
function init() { 
 
    window.onwheel = changeSize; 
 
} 
 

 
window.onload = init;
<img id="img1" src="https://upload.wikimedia.org/wikipedia/commons/7/73/HDRI_Sample_Scene_Balls_(Auto_Exposure).jpg" style="position:absolute; transition: 1s all">

ここで、コードは予期したとおりに動作することがわかります。しかし、注目すべき点は、img1.height = img1.height + e.deltaY;の後に書き込まれても、警告の値は更新前の画像の高さではないことです。img1.heightの値は更新されませんコードが終了するまでこれが起こっています。

このコードで
function changeSize(e) { 
    var img1 = document.getElementById("img1"); 
    var slope = img1.height/img1.width; 
    var change = img1.height + e.deltaY; 

    img1.height = change; 
    img1.width = change/slope; 
} 

function init() { 
    window.onwheel = changeSize; 
} 

window.onload = init; 

:コードは、このコードではalert

の場合で動作する理由ワーキングのthats警告ボックスが離れて現在のウィンドウからフォーカスを取り、我々が閉じたときには、再び現在のウィンドウに切り替えimg1.heightおよびimg1.widthは、変数値changeに依存します。関数の実行時に変数の値が更新されるため、画像の高さと幅が変更されます。私たちは、このコードで警告した場合も、それは画像の前の高さを示して

​​3210

今ポイントが参照するには、ということです。

そこで私は、関数の終了後の画像の変化の高さと幅と結論し、それが

+0

私はあなたのアラートを非動作コードブロックでテストしました。最初の時にのみ機能し、その後は高さの変更にもかかわらず同じ幅になりました。私は何も返さないので、関数の終了後に更新が行われるとは思わない。 – George

+0

これは変更されています。どのブラウザを使用していますか? –

+0

私は質問の冒頭で述べたようにChromeを使用しています。 – George

関連する問題