2016-08-21 4 views
2

배경 이미지가 <img>이고 5 개의 별도 캔버스 레이어 (해먹의 사용자 정의 가능한 부분 5 개를 구성)은입니다. 이 이미지 3 개 모두가 각각 {display:none;} 요소에 완전히로드 될 때까지 기다린 다음 모든 이미지를 한 번에 사라지게해야합니다.모든 이미지로드 후, 이미지 태그, 이미지 오브젝트 및 배경 이미지

일부 연구를 마친 후 imagesLoaded 라이브러리를 발견했습니다. 문서에서는 배경 이미지와 이미지에 사용할 수 있지만 캔버스 이미지를로드하는 데 사용하는 이미지 개체에 대해서는 확신 할 수 없습니다.

문제 :

1) 아직 개별적으로로드하고 fadeIn은 기다리지 않습니다.

2) 콘솔에서 count은 어떤 이유로 든 홀수로 증가합니다 (예 : 1, 3, 5, 7, 11

3) 또한 이러한 이미지는로드시 이미 캐시 될 수 있습니다.

이 코드는 가장 깨끗하거나 효율적이지 않습니다. 기본 개념을 이해 한 후에 정리할 계획입니다. imagesLoaded가 가장 좋은 방법이 아니라면 무엇을 권하고 싶습니까? 나는 그저 효과있는 것을 원한다.

JSFiddle

HTML :

<div id="container"> 
<div id="logo"><img src="https://upload.wikimedia.org/wikipedia/commons/8/82/Dell_Logo.png"/></div> 
<canvas id="canvas1" width="1000" height="1000"></canvas> 
<canvas id="canvas2" width="1000" height="1000"></canvas> 
<canvas id="canvas3" width="1000" height="1000"></canvas> 
<canvas id="canvas4" width="1000" height="1000"></canvas> 
<canvas id="canvas5" width="1000" height="1000"></canvas> 
</div> 

CSS :

#container { 
    height:1000px; 
    width:1000px; 
    position: relative; 
    display:none; 
    background-position: top left; 
    background-repeat: no-repeat; 
    background-size: cover; 
} 
#logo { 
    width: 200px; 
    height: 200px; 
    position:absolute; 
    top: 50px; 
    left: 400px; 
} 
img { 
    max-width: 100%; 
} 
#canvas1 { 
    position: absolute; 
    top:0; 
    left:0; 
    display:none; 
} 
#canvas2 { 
    position:absolute; 
    top:0; 
    left:0; 
    display:none; 
} 
#canvas3 { 
    position:absolute; 
    top:0; 
    left:0; 
    display:none; 
} 
#canvas4 { 
    position:absolute; 
    top:0; 
    left:0; 
    display:none; 
} 
#canvas5 { 
    position:absolute; 
    top:0; 
    left:0; 
    display:none; 
} 

자바 스크립트 :

var canvas1 = document.getElementById('canvas1'); 
var canvas2 = document.getElementById('canvas2'); 
var canvas3 = document.getElementById('canvas3'); 
var canvas4 = document.getElementById('canvas4'); 
var canvas5 = document.getElementById('canvas5'); 
var context1 = canvas1.getContext('2d'); 
var context2 = canvas2.getContext('2d'); 
var context3 = canvas3.getContext('2d'); 
var context4 = canvas4.getContext('2d'); 
var context5 = canvas5.getContext('2d'); 

var count = 0; 

var img1 = new Image(); 
var img2 = new Image(); 
var img3 = new Image(); 
var img4 = new Image(); 
var img5 = new Image(); 

img1.src = 'https://cdn.shopify.com/s/files/1/1408/4812/t/11/assets/single-side-main-burgundy.png'; 
img2.src = 'https://cdn.shopify.com/s/files/1/1408/4812/t/11/assets/single-side-secondary-aqua.png'; 
img3.src = 'https://cdn.shopify.com/s/files/1/1408/4812/t/11/assets/single-side-pouch1-aqua.png'; 
img4.src = 'https://cdn.shopify.com/s/files/1/1408/4812/t/11/assets/single-side-pouch2-aqua.png'; 
img5.src = 'https://cdn.shopify.com/s/files/1/1408/4812/t/11/assets/single-side-pouch3-aqua.png'; 


$("#container").css("background-image", "url(http://www.hotel-r.net/im/hotel/ba/house-3.jpg)"); 
img1.onload = function() { 
    context1.drawImage(img1, 0 , 0, 1000, 1000); 
} 
img2.onload = function() { 
    context2.drawImage(img2, 0 , 0, 1000, 1000); 
} 
img3.onload = function() { 
    context3.drawImage(img3, 0 , 0, 1000, 1000); 
} 
img4.onload = function() { 
    context4.drawImage(img4, 0 , 0, 1000, 1000); 
} 
img5.onload = function() { 
    context5.drawImage(img5, 0 , 0, 1000, 1000); 
} 

function fadeInAll(speed) { 
    $("#container").fadeIn(speed); 
    $("#canvas1").fadeIn(speed); 
    $("#canvas2").fadeIn(speed); 
    $("#canvas3").fadeIn(speed); 
    $("#canvas4").fadeIn(speed); 
    $("#canvas5").fadeIn(speed); 
    $('#logo').fadeIn(speed); 
} 

$('#container').imagesLoaded({ background: true }, function() { 
    count++; 
    afterAllLoading(); 
}); 
$('#logo').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 
$('img1').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 
$('img2').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 
$('img3').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 
$('img4').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 
$('img5').imagesLoaded(function() { 
    count++; 
    afterAllLoading(); 
}); 

function afterAllLoading() { 
     console.log(count++); 
    if (count >= 7) { 
     fadeInAll(1000); 
    } 
} 

답변

3

아이러니하게도, 문제는 console.log(count++) 함께. 그러면 count도 증가하므로 원하는 전에 7을 누르십시오. 따라서 fadeInAll 메서드가 호출 될 때까지 이미지의 절반 만로드됩니다. 대신 console.log(count)으로 전화해야합니다.

아마도 작동 할 것입니다.하지만 모든 캔버스 주위에 상위 컨테이너 요소가있는 코드를 단순화 한 다음 해당 부모의 displaynone으로 설정하는 것이 좋습니다. 그런 다음, 7 명의 자식 대신 하나의 부모 요소를 페이드 인하는 것에 대해 걱정할 필요가 있으며, 항상 함께 페이드 인 및 페이드 아웃됩니다.