SVG와 HTML5 Canvas의 차이점은 무엇입니까? 둘 다 나에게 똑같은 일을하는 것 같다. 기본적으로 둘 다 좌표 점을 사용하여 벡터 아트 워크를 그립니다.
내가 무엇을 놓치고 있습니까? SVG와 HTML5 Canvas의 주요 차이점은 무엇입니까? 왜 하나를 선택해야합니까?
SVG와 HTML5 Canvas의 차이점은 무엇입니까? 둘 다 나에게 똑같은 일을하는 것 같다. 기본적으로 둘 다 좌표 점을 사용하여 벡터 아트 워크를 그립니다.
내가 무엇을 놓치고 있습니까? SVG와 HTML5 Canvas의 주요 차이점은 무엇입니까? 왜 하나를 선택해야합니까?
답변:
Wikipedia 참조 : http://en.wikipedia.org/wiki/Canvas_element
SVG는 브라우저에서 도형을 그리기위한 초기 표준입니다. 그러나 SVG는 기본적으로 더 높은 수준에 있습니다. 그 이유는 그려진 각 모양이 장면 그래프 또는 DOM에서 객체로 기억되고 이후에 비트 맵으로 렌더링되기 때문입니다. 즉, SVG 객체의 속성이 변경되면 브라우저가 자동으로 장면을 다시 렌더링 할 수 있습니다.
위의 예에서 직사각형이 그려지면 시스템에서 그려 졌다는 사실을 잊습니다. 위치를 변경하려면 사각형으로 덮일 수있는 모든 개체를 포함하여 전체 장면을 다시 그려야합니다. 그러나 동등한 SVG의 경우 직사각형의 위치 속성을 간단히 변경할 수 있으며 브라우저는이를 다시 그리는 방법을 결정합니다. 캔버스를 레이어로 칠한 다음 특정 레이어를 다시 만드는 것도 가능합니다.
SVG 이미지는 XML로 표현되며 복잡한 장면은 XML 편집 도구로 만들고 유지 관리 할 수 있습니다.
SVG 장면 그래프를 사용하면 이벤트 핸들러를 객체와 연결할 수 있으므로 직사각형이 onClick 이벤트에 응답 할 수 있습니다. 캔버스에서 동일한 기능을 얻으려면 마우스 클릭의 좌표를 그려진 사각형의 좌표와 수동으로 일치시켜 클릭되었는지 여부를 확인해야합니다.
개념적으로 캔버스는 SVG가 구축 될 수있는 하위 수준의 프로토콜입니다. [인용 필요] 그러나 이것은 (일반적으로) 경우가 아니며 독립적 인 표준입니다. Canvas 용 장면 그래프 라이브러리가 있고 SVG에는 비트 맵 조작 기능이 있기 때문에 상황이 복잡합니다.
업데이트 : 마크 업 언어 능력 때문에 SVG를 사용합니다. XSLT로 처리 할 수 있고 노드에 다른 마크 업을 저장할 수 있습니다. 마찬가지로 마크 업 (화학)에 SVG를 포함 할 수 있습니다. 이를 통해 마크 업 조합으로 SVG 속성 (예 : 렌더링)을 조작 할 수 있습니다. 이것은 Canvas에서 가능할 수 있지만 훨씬 더 어렵다고 생각합니다.
SVG는 "그리기"프로그램과 같습니다. 드로잉은 각 모양에 대한 드로잉 지침으로 지정되며 모든 모양의 일부를 변경할 수 있습니다. 드로잉은 모양 지향적입니다.
캔버스는 "페인트"프로그램과 같습니다. 픽셀이 화면에 닿으면 그것이 바로 당신의 그림입니다. 다른 픽셀로 덮어 쓰는 것 외에는 모양을 변경할 수 없습니다. 그림은 픽셀 지향적입니다.
일부 프로그램에서는 도면을 변경할 수있는 것이 매우 중요합니다. 예를 들어 드 래프팅 앱, 다이어그램 작성 도구 등. 따라서 SVG는 여기에서 이점이 있습니다.
일부 예술적 프로그램에서는 개별 픽셀을 제어 할 수있는 것이 중요합니다.
SVG보다 Canvas에서 마우스 드래그를 통한 사용자 조작을위한 뛰어난 애니메이션 성능을 얻는 것이 더 쉽습니다.
컴퓨터 화면의 단일 픽셀은 종종 4 바이트의 정보를 소비하며 요즘 컴퓨터 화면에는 몇 메가 바이트가 걸립니다. 따라서 사용자가 이미지를 편집 한 다음 다시 업로드 할 수 있도록하려면 Canvas가 불편할 수 있습니다.
대조적으로 SVG를 사용하여 전체 화면을 덮는 몇 가지 모양을 그리는 것은 몇 바이트를 차지하고 빠르게 다운로드되며 다른 방향으로 내려갈 때와 동일한 이점으로 쉽게 다시 업로드 할 수 있습니다. 따라서 SVG는 Canvas보다 빠를 수 있습니다.
Google은 SVG로 Google지도를 구현했습니다. 이는 웹 앱에 빠른 성능과 부드러운 스크롤을 제공합니다.
Canvas와 SVG의 상위 수준 요약
캔버스
SVG
자세한 차이점은 http://msdn.microsoft.com/en-us/library/ie/gg193983(v=vs.85).aspx 를 참조 하십시오.
그들이 무엇인지, 그들이 당신을 위해 무엇을하는지에는 차이가 있습니다.
형식 대 API에 대해 조금 더 자세히 설명하려면 :
svg를 사용하면 다양한 도구에서 파일을보고, 저장하고, 편집 할 수 있습니다. 캔버스를 사용하면 그냥 그리면 화면의 결과 이미지와 별도로 방금 한 작업에 대해 아무것도 유지되지 않습니다. 두 가지 모두에 애니메이션을 적용 할 수 있으며 SVG는 지정된 요소와 속성 만보고 다시 그리기를 처리하는 반면, 캔버스에서는 API를 사용하여 각 프레임을 직접 다시 그려야합니다. 둘 다 크기를 조정할 수 있지만 SVG는 자동으로 수행하지만 캔버스를 다시 사용하면 주어진 크기에 대한 그리기 명령을 다시 실행해야합니다.
SVG와 Canvas에서 저를 가장 감동시킨 두 가지는
DOM없이 Canvas를 사용할 수있는 기능. SVG는 DOM에 크게 의존하고 복잡성이 증가함에 따라 성능이 저하됩니다. 게임 디자인처럼.
SVG 사용의 장점은 Canvas에없는 플랫폼간에 해상도가 동일하게 유지된다는 것입니다.
이 사이트에서 더 많은 세부 정보가 제공됩니다. http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/
그것은 절대적으로 귀하의 필요 / 요구 사항에 달려 있습니다.
화면에 이미지 / 차트 만 표시하려면 캔버스가 권장됩니다. (예 : PNG, GIF, BMP 등)
예를 들어 차트 위에 마우스를 올려 놓으면 디스플레이 품질을 손상시키지 않고 특정 영역을 확대하려는 경우 그래픽의 기능을 확장하려면 SVG를 선택합니다. (좋은 예는 AutoCAD, Visio, GIS 파일입니다).
셰이프 커넥터가있는 동적 흐름도 생성 도구를 구축하려면 CANVAS보다 SVG를 선택하는 것이 좋습니다.
화면 크기가 커지면 더 많은 픽셀을 그려야하므로 캔버스가 저하되기 시작합니다.
화면에서 개체 수가 증가
하면 DOM 에 개체 를 계속 추가하면서 SVG 성능이 저하 되기 시작합니다 .
또한 참조하십시오 : http://msdn.microsoft.com/en-us/library/gg193983(v=vs.85).aspx
SVG
사용 사례에 따라 SVG는 로고, 차트에 사용됩니다. 그 이유는 벡터 그래픽을 그리고 잊어 버렸기 때문입니다. 크기 조정 (또는 확대 / 축소)과 같이 뷰 포트가 변경되면 자동으로 조정되며 다시 그릴 필요가 없습니다.
캔버스
캔버스는 화면에 픽셀을 페인팅하여 수행되는 비트 맵 (또는 래스터)입니다. 주어진 영역에서 게임이나 그래픽 경험 ( https://www.chromeexperiments.com/webgl ) 을 개발하는 데 사용되며 픽셀을 페인트하고 다른 영역을 다시 그려 변경합니다. 래스터 유형이므로 뷰 포트가 변경되면 완전히 다시 그려야합니다.
참고
http://www.sitepoint.com/7-reasons-to-consider-svgs-instead-of-canvas
http://en.wikipedia.org/wiki/WebGL
http://vector-conversions.com/vectorizing/raster_vs_vector.html
SVG
파일 형식과 같은 도면의 사양입니다. SVG는 문서입니다. HTML 파일과 같은 SVG 파일을 교환 할 수 있습니다. 또한 SVG 요소와 HTML 요소가 동일한 DOM API를 공유하기 때문에 JavaScript를 사용하여 HTML DOM을 생성하는 것과 동일한 방식으로 SVG DOM을 생성 할 수 있습니다. 그러나 SVG 파일을 생성하기 위해 JavaScript가 필요하지 않습니다. 간단한 텍스트 편집기만으로도 SVG를 작성할 수 있습니다. 그러나 도면에서 도형의 좌표를 계산하려면 최소한 계산기가 필요합니다.
CANVAS
그냥 그리기 영역입니다. 캔버스의 내용을 생성하려면 JavaScript를 사용해야합니다. 캔버스를 교환 할 수 없습니다. 문서가 아닙니다. 그리고 캔버스의 요소는 DOM 트리의 일부가 아닙니다. DOM API를 사용하여 캔버스의 내용을 조작 할 수 없습니다. 대신 전용 캔버스 API를 사용하여 캔버스에 모양을 그려야합니다.
의 장점은 SVG
도면을 문서로 교환 할 수 있다는 것입니다. 의 장점은 CANVAS
내용을 생성하는 데 덜 장황한 JavaScript API가 있다는 것입니다.
다음은 유사한 결과를 얻을 수 있음을 보여주는 예입니다.하지만 JavaScript에서 수행하는 방법은 매우 다릅니다.
// Italic S in SVG
(function () {
const ns='http://www.w3.org/2000/svg';
let s = document.querySelector('svg');
let p = document.createElementNS (ns, 'path');
p.setAttribute ('id', 'arc');
p.setAttribute ('d', 'M 0.9 -0.9 a 0.8,0.4 -10 0,0 -0.9,0.9');
s.appendChild (p);
let u = document.createElementNS (ns, 'use');
u.setAttribute ('href', '#arc');
u.setAttribute ('transform', 'rotate(180)');
s.appendChild (u);
})();
// Italic S in CANVAS
(function () {
let c = document.querySelector('canvas');
let w = c.width = c.clientWidth;
let h = c.height = c.clientHeight;
let x = c.getContext('2d');
x.lineWidth = 0.05 * w;
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*0.02, h*0.4,
w*0.4, -h*0.02,
w*0.95, h*0.05);
x.moveTo (w/2, h/2);
x.bezierCurveTo (w*(1-0.02), h*(1-0.4),
w*(1-0.4), h*(1+0.02),
w*(1-0.95), h*(1-0.05));
x.stroke();
})();
svg, canvas {
width: 3em;
height: 3em;
}
svg {
vertical-align: text-top;
stroke: black;
stroke-width: 0.1;
fill: none;
}
canvas {
vertical-align: text-bottom;
}
div {
float: left;
}
<div><svg viewBox="-1 -1 2 2"></svg>VG</div>
<div>CANVA<canvas></canvas></div>
보시다시피 결과는 거의 동일하지만 JavaScript 코드는 완전히 다릅니다.
SVG는 사용하여 DOM API를 사용하여 생성 createElement
, setAttribute
및 appendChild
. 모든 그래픽은 속성 문자열에 있습니다. SVG에는 더 강력한 기본 요소가 있습니다. 예를 들어 CANVAS에는 SVG 아크 경로와 동일한 것이 없습니다. CANVAS 예제는 Bezier 곡선으로 SVG 호를 에뮬레이션하려고합니다. SVG에서는 변형을 위해 요소를 재사용 할 수 있습니다. CANVAS에서는 요소를 재사용 할 수 없습니다. 대신 두 번 호출하려면 JavaScript 함수를 작성해야합니다. SVG에는 viewBox
정규화 된 좌표를 사용하여 회전을 단순화하는가 있습니다. 캔버스에서 당신은 자신의 기준으로 좌표를 계산해야 clientWidth
하고clientHeight
. 그리고 CSS로 모든 SVG 요소의 스타일을 지정할 수 있습니다. CANVAS에서는 CSS로 스타일을 지정할 수 없습니다. SVG는 DOM이므로 모든 SVG 요소에 이벤트 핸들러를 할당 할 수 있습니다. CANVAS의 요소에는 DOM과 DOM 이벤트 핸들러가 없습니다.
그러나 반면에 CANVAS 코드는 훨씬 읽기 쉽습니다. XML 네임 스페이스는 신경 쓸 필요가 없습니다. 그리고 DOM을 빌드 할 필요가 없기 때문에 그래픽 함수를 직접 호출 할 수 있습니다.
교훈은 분명합니다. 그래픽을 빠르게 그리려면 CANVAS를 사용하십시오. CSS로 스타일을 지정하거나 그래픽에서 DOM 이벤트 핸들러를 사용하려는 등 그래픽을 공유해야하는 경우 SVG를 빌드하십시오.
SVG
Object Model 기반입니다.
큰 렌더링 영역을 사용하는 데 적합합니다.
SVG는 이벤트 핸들러에 대한 모든 지원을 제공합니다.
스크립트 및 CSS를 통해 수정이 가능합니다.
SVG는 더 나은 확장 성을 가지고 있습니다.
SVG는 벡터 기반입니다 (모양으로 구성됨).
SVG는 게임 그래픽에 적합하지 않습니다. SVG는 해상도에 의존하지 않습니다.
SVG는 API 애니메이션에 사용할 수 있습니다.
SVG는 고품질 및 모든 해상도로 인쇄하는 데 적합합니다.
캔버스 요소
픽셀 기반입니다.
작은 렌더링 사용에 적합
Canvas는 이벤트 핸들러에 대한 어떠한 자원도 제공하지 않습니다.
수정은 스크립트를 통해서만 허용됩니다.
캔버스는 확장 성이 떨어집니다.
캔버스는 래스터 기반 (픽셀로 구성됨)입니다.
캔버스는 게임 그래픽에 적합합니다.
캔버스는 해상도에 전적으로 의존합니다.
Canvas에는 애니메이션 용 API가 없습니다.
캔버스는 고품질 및 고해상도 인쇄에 적합하지 않습니다.