享受生活,熱愛重構,大家好,我是Json。
在現在這個到處是HTML5話題的時代,好像不懂點HTML5都有點落伍。那我也跟上潮流一把吧,今天給大家分享的是基於HTML5的自助切圖。
在組裡經常會被某設計師叫切板仔,確實重構很大一部分工作都花在切圖上,而如何提高切圖效率或者讓切圖自助化也是我們重構師的追求。基於這個前提我自己抱著研究的心態,使用HTML5大致實現了一下。一開始覺得HTML5是個很神秘很高深的東西,其實當你去了解他,你會發現他是很空虛,且很容易上…………….手的。
這裡使用到的HTML5技術包括:
本地預覽(FileReader)
拖拽(drag & drop)
切圖(canvas)
拖拽:
拖拽基本事件如下:
DataTransfer 對象 退拽對象用來傳遞的媒介,使用一般為Event.dataTransfer。 draggable 屬性 就是標簽元素要設置draggable=true,否則不會有效果,例如: <div title=”拖拽我” draggable=”true”&rt;列表1</div:rt;</td&rt; ondragstart 事件 當拖拽元素開始被拖拽的時候觸發的事件,此事件作用在被拖曳元素上 ondragenter 事件 當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上 ondragover 事件 拖拽元素在目標元素上移動的時候觸發的事件,此事件作用在目標元素上 ondrop 事件 被拖拽的元素在目標元素上同時鼠標放開觸發的事件,此事件作用在目標元素上 ondragend 事件 當拖拽完成後觸發的事件,此事件作用在被拖曳元素上 drageleave事件 當拖拽離開此處時觸發,只在離開這個對象時觸發一次,此事件作用在目標元素上 Event.preventDefault() 方法 阻止默認的些事件方法等執行。在ondragover中一定要執行preventDefault(),否則ondrop事件不會被觸發。另外,如果是從其他應用軟件或是文件中拖東西進來,尤其是圖片的時候,默認的動作是顯示這個圖片或是相關信息,並不是真的執行drop。此時需要用用document的ondragover事件把它直接干掉。 Event.effectAllowed 屬性 就是拖拽的效果。圖1是頁面上所使用到拖拽的地方。左圖為拖拽上傳圖片,右圖為拖拽參考線。
介紹完拖拽基本事件後,再來看下頁面是如何通過拖拽將本地圖片通過拖拽的方式拖到頁面指定區域使用圖片上傳,這也是拖拽現在比較常用到的功能。
給document增加拖拽事件,當拖拽元素進入頁面時改變目標元素樣式提示用戶目標元素位置,當拖拽元素離開頁面後還原樣式。代碼如下:
document.ondragleave = function(e){
e.preventDefault();
var el = document.getElementById('target_box');
el.className = el.className.replace(/over/g,'');
}
document.ondrop = function(e){
e.preventDefault();
}
document.ondragenter = function(e){
e.preventDefault();
var el = document.getElementById('target_box');
el.className = el.className + ' over';
}
document.ondragover = function(e){
e.preventDefault();
var el = document.getElementById('target_box');
el.className = el.className + ' over';
}
當圖片被拖到上傳區域後通過FileReader方法讀取本地文件,然後將圖片通過canvas來繪制,如果圖片的寬度是大於畫布1000px將水平居中處理,這裡因為切圖的時候需要將圖片完整切出來,所以在設置canvas寬度時需要顯示成圖片的大小,所以這裡使用了負marginLeft(這裡將圖片寬度減1000得出超出1000的區域,然後再除於2得出marginLeft的值)外面套一層1000px的方式來實現水平居中。代碼如下:
var box = document.getElementById('target_box');
box.ondrop = function(e){
e.preventDefault();
//獲取文件列表
var fileList = e.dataTransfer.files;
var reader = new FileReader();
reader.onload = function(e){
var img = new Image();
img.src = this.result;
img.onload = function(){
if(this.width>1000){
canvas.style.marginLeft = ((this.width - 1000)/2) * -1 + 'px';
}
canvas.width = this.width;
canvas.height = this.height;
ctx.drawImage(this,0,0);
}
}
reader.readAsDataURL(fileList[0]);
document.getElementById('target_box').style.display = 'none';
document.getElementById('doc').style.display = 'display';
};
本地預覽(FileReader)
這裡因為標尺不需要做任何事情處理只需要拖拽效果,所以只需要增加draggable屬性就可以,代碼如下:
然後給目標元素增加Drop事件,當拖拽的標尺在目標元素上放開時新建一個參考線並通過offsetY來獲取鼠標釋放時的Y坐標,然後再將這個Y坐標存到數組裡。
//增加標尺目標事件
document.getElementById('cvs').ondrop = function(ev){
var div = document.createElement('div');
div.style.width = '100%'
div.style.height = '1px';
div.style.background = '#4affff';
div.style.position = 'absolute'
div.style.top = ev.offsetY + 18 + 'px';
document.getElementById('screen').appendChild(div);
rulerTop.push(ev.offsetY);
return false;
}
Canvas:
這裡先介紹下canvas的drawImage方法,切圖的核心方法就是這個,我們先來看看官方給出的使用方法與解釋:
drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight)
image 所要繪制的圖像。這必須是表示 #FormatImgID_3# 標記或者屏幕外圖像的 Image 對象,或者是 Canvas 元素。 sourceX, sourceY 圖像將要被繪制的區域的左上角。這些整數參數用圖像像素來度量。 sourceWidth, sourceHeight 圖像所要繪制區域的大小,用圖像像素表示。 destX, destY 所要繪制的圖像區域的左上角的畫布坐標。 destWidth, destHeight 圖像區域所要繪制的畫布大小。了解了drawImage方法後我們來看下,如何通過drawImage達到切圖效果,其實這裡的切圖,只是通過drawImage加上高寬和偏移量來實現所謂的