RELATEED CONSULTING
相關咨詢
選擇下列産品馬上(shàng)在線溝通(tōng)
服務時(shí)間(jiān):9:00-18:00
你(nǐ)可(kě)能遇到了下面的問題
關閉右側工具欄
Javascript與HTML5的canvas實現圖片旋轉效果
  • 作(zuò)者:admin
  • 發表時(shí)間(jiān):2013-07-02 14:16:58
  • 來(lái)源:未知

我們在微博上(shàng)可(kě)以對圖片進行(xíng)向左轉向右轉等旋轉操作(zuò),讓用戶可(kě)以從不同的視(shì)角欣賞圖片效果。本文将結合實例為(wèi)您講解如何使用Javascript結合相關技(jì)術(shù)來(lái)實現圖片的旋轉效果。我們使用HTML5的canvas标簽可(kě)對圖片進行(xíng)旋轉操作(zuò),對于ie6,7,8不支持HTML5的浏覽器(qì),我們使用IE特有(yǒu)的濾鏡效果來(lái)實現圖片旋轉。

HTML

我們在頁面中放置一張圖片,在圖片的上(shàng)方放置兩個(gè)按鈕,通(tōng)過onclick事件調用rotate()函數(shù)來(lái)控制(zhì)圖片向左向右旋轉。



 

Javascript

function rotate(obj,arr){
	var img = document.getElementById(obj);
	if(!img || !arr) return false;
	var n = img.getAttribute('step');
	if(n== null) n=0;
	if(arr=='left'){
		(n==0)? n=3:n--;
	}else if(arr=='right'){
		(n==3)? n=0:n++;
	}
	img.setAttribute('step',n);
    ...
}

我們寫了個(gè)自定義函數(shù)rotate(),其中參數(shù)obj表示要旋轉的圖片對象的id,參數(shù)arr表示旋轉方向,固定兩個(gè)值:left(向左)和(hé)right(向右)。我們設置變量n是為(wèi)了記錄上(shàng)下左右四種旋轉狀态,點擊旋轉按鈕時(shí)可(kě)以保證持續的旋轉的狀态,即每次旋轉是在上(shàng)次旋轉操作(zuò)後的基礎上(shàng)再次旋轉。

然後,我們要根據浏覽器(qì)的不同進行(xíng)不同的處理(lǐ),對于IE系浏覽器(qì),可(kě)以使用他們特有(yǒu)的濾鏡來(lái)實現旋轉效果,雖然我們不建議使用濾鏡,但(dàn)為(wèi)了兼容IE老版本,我們不得(de)不重操這把舊(jiù)刀。

function rotate(obj,arr){
	...
    //對IE浏覽器(qì)使用濾鏡旋轉
	if(document.all) {
		img.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ n +')';
	// 對現代浏覽器(qì)寫入HTML5的元素進行(xíng)旋轉: canvas
	}else{
    	...
    }
}

代碼中,我們使用document.all判斷是否為(wèi)IE浏覽器(qì),如果是則使用濾鏡,而對于firefox和(hé)chrome這樣的現代浏覽器(qì),我們使用canvas來(lái)實現旋轉效果。

function rotate(obj,arr){
	...
	// 對現代浏覽器(qì)寫入HTML5的元素進行(xíng)旋轉: canvas
	}else{
    	var c = document.getElementById('canvas_'+obj);
		if(c== null){
			img.style.visibility = 'hidden';
			img.style.position = 'absolute';
			c = document.createElement('canvas');
			c.setAttribute("id",'canvas_'+obj);
			img.parentNode.appendChild(c);
		}
		var canvasContext = c.getContext('2d');
		switch(n) {
			default :
			case 0 :
				c.setAttribute('width', img.width);
				c.setAttribute('height', img.height);
				canvasContext.rotate(0 * Math.PI / 180);
				canvasContext.drawImage(img, 0, 0);
				break;
			case 1 :
				c.setAttribute('width', img.height);
				c.setAttribute('height', img.width);
				canvasContext.rotate(90 * Math.PI / 180);
				canvasContext.drawImage(img, 0, -img.height);
				break;
			case 2 :
				c.setAttribute('width', img.width);
				c.setAttribute('height', img.height);
				canvasContext.rotate(180 * Math.PI / 180);
				canvasContext.drawImage(img, -img.width, -img.height);
				break;
			case 3 :
				c.setAttribute('width', img.height);
				c.setAttribute('height', img.width);
				canvasContext.rotate(270 * Math.PI / 180);
				canvasContext.drawImage(img, -img.width, 0);
				break;
		};
    }
}

代碼中,我們創建canvas元素對象,并将圖片賦予canvas對象,當變量n處于不同的狀态(上(shàng)下左右四個(gè)方向)時(shí),使用canvas重新對圖像進行(xíng)繪制(zhì)。關于canvas标簽的使用,大(dà)家(jiā)可(kě)以參照下本站(zhàn)文章:HTML5之畫(huà)布Canvas

當然,圖片的旋轉效果實現還(hái)有(yǒu)一種解決方案,繞開(kāi)html5,針對各不同的浏覽器(qì),比如firefox下面可(kě)以用-moz-transform: rotate(); webkit可(kě)以用-webkit-transform: rotate(); 但(dàn)這并不如html5的canvas實現的效果好。