HighCharts์ฉ ์๋ฒ ์ธก ๋ ๋๋ฌ๋ฅผ ๊ตฌํํ๋ ค๊ณ ํฉ๋๋ค. ๊ฒฐ๊ณผ SVG ๋งํฌ์ ์ x, y, ๋๋น ๋ฐ ๋์ด ๊ฐ์ด ์ ์ฒด์ ์ผ๋ก ๋๋ฝ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ผ๋ถ ๋๋ฒ๊น ์ ํตํด offsetWidth, offsetHeight, offsetTop ๋ฐ offsetLeft๊ฐ ๊ฐ ์์์ ๋ํด ๋ชจ๋ ์ ์๋์ง ์์๋ค๋ ์ฌ์ค์ ๋ฌธ์ ๋ฅผ ์ ํํ ์ง์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ์์ฑ์ด ํฅํ ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ์์ ์ ๋๊น? ๋ํ ๋น๋ถ๊ฐ ๊ตฌํํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
http://www.w3.org/TR/cssom-view/ ๋ฅผ ๊ตฌํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ผ๋ถ SVG ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ cssom ํตํฉ์ ์์ํ์ต๋๋ค.
์คํ์ * ์์ฑ์ ์ก์ธ์คํ ์ ์๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์ ๋๋ค. ์บ๋ฒ์ค ๊ด๋ จ ํ๋ก์ ํธ์ ํ์ํ ์์ฑ์ ๋๋ค.
์ด ๋ฌธ์ ์ ์งํ ์ํฉ์ ์ด๋ป์ต๋๊น? Highcharts๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋ ์ฒ์ง ๋ ๋๋ง์ ์ํ ์ด๋ฌํ ๊ธฐ๋ฅ๋ ๊ฐ์ฌํฉ๋๋ค.
์ด๊ฒ๋ ๊ฐ๊ณ ์ถ๋ค์ :)
๋์์ด ๋ ์ฌ๋ถ์ ์ฌ์ดํด์ด ์์ต๋๊น? ๊ฐ์ธ์ ์ผ๋ก ์ ๋ svg 1.1์ด ํ์ํ์ง ์์ง๋ง ์ฌ๋ฌ๋ถ๋ ์์ ํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์์์ด ์๋๋ค๋ฉด ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
@tmpvar : ๋์์ ์ฃผ๊ณ ์ถ์ง๋ง ์๋ฒ ์ธก JS ๊ด๋ จ ํญ๋ชฉ์
์ด๋์ ์์ํด์ผ ํ๋์ง ํํธ๋ฅผ ์ฃผ์๋ฉด ์ต์ ์ ๋คํด ์์
์ ์งํํ ์ ์์ต๋๋ค. :)
์๋ฒ์์ ํ์ด์ฐจํธ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด SVG 1.1์๋ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ๋์์ ์ ๊ณตํ๊ณ ์ถ์ง๋ง ๋จผ์ SVG 1.0๊ณผ jsdom์ ํ์ฌ ๊ตฌํ์ ๋ํด ์์์ผ ํฉ๋๋ค. ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ;)
์ฌ๊ธฐ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ํ ์คํธ ์ค์ํธ(http://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_Overview)์ ์ฌ๋ณธ์ ๊ฐ์ ธ์์ ํค๋๋ฆฌ์ค๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ level2/svg.js
ํ๊ณ ๊ตฌํ์ ์์ํ ์ ์์ต๋๋ค.
๋๋ ์๋ง๋ ๊ฒฐ๊ตญ ์ด๊ฒ์ ๋ํด ์๊ฒ ๋ ๊ฒ์ด์ง๋ง, ์ง๊ธ ๋น์ฅ์ jsdom ์ฐ์ ์์ ๋ชฉ๋ก์์ ๋์ง ์์ต๋๋ค.
@href svg 1.0 ๊ตฌํ์ ๋งค์ฐ level1/core
์ ํ
์คํธ๋ฅผ ํต๊ณผํ์ง๋ง ์ค์ ๋ก svg ํน์ ํญ๋ชฉ์ ๊ตฌํํ์ง๋ ์์ต๋๋ค.
getBoundingCLientRect๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํน์ svg ์์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๊ฐ ์์ต๋๋ค.
var html = '<!DOCTYPE html><html><head><title></title></head><body style="margin: 0; padding: 0;"><svg id="svg" xmlns="http://www.w3.org/2000/svg" version="1.1" style="margin: 0; padding: 0;"><rect style="" x="10" y="10" width="100" height="100" rx="0" ry="0"/></svg></body></html>';
jsdom.env({
html : html,
src: [jquery],
done: function (errors, window) {
var $ = window.$;
var clientBox = $("#svg").find(type)[0].getBoundingClientRect();
console.log(clientBox);
}
});
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{ bottom: 0, height: 0, left: 0, right: 0, top: 0, width: 0 }
๊ทธ๋ฌ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ๋์ผํ html์ ํ ์คํธํ๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{ bottom: 110, height: 100, left: 10, right: 110, top: 10, width: 100 }
@throrin19 : #653์ ์ฝ์ด
๊ทธ๋์ ๋ฌ์ฑ์ด ๋ถ๊ฐ๋ฅํฉ๋๊น? ์ง๊ธ๊น์ง phantomJS๋ฅผ ํตํด ์ด ๋ฌธ์ ๋ฅผ ์ฐํํ ์ ์์์ง๋ง ๋งค์ฐ ๋๋ฆฌ๊ณ ํฐ SVG๊ฐ ์์ผ๋ฉด ์ถฉ๋ํฉ๋๋ค.
๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง ์ ์ฒด ๋ ์ด์์ ์์ง์ ์์ฑํด์ผ ํ๊ณ ์๋ฌด๋ ๊ทธ๋ ๊ฒ ํ ์๊ฐ์ด ์์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ์ง๋ง ๋ด ๋๊ฐ ๊ฒฝ๋ จ์ ์ผ์ผํค๊ณ ๋ ๋์ผํฉ๋๋ค.
์ฐ ์ด์ธ์ ํ ์คํธ๋ฅผ ์ํํ ์ ์์ต๋๊น?
์ด๊ฒ์ ๋งค์ฐ ๋ฐ๋์งํ ๊ธฐ๋ฅ์ ์ฐพ๋ ๋ฐ +1
๋ด ๊ฒฝ์ฐ์ ์๋ํ๋ ์ง์์ ์ํด ์ด ์ค๋ํซ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ ํ ๊ตฌํ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค๋ ๊ฒ์ ๋ช
์ฌํ์ญ์์ค. window
๋ document.parentWindow
์ด์ด์ผ ํฉ๋๋ค.
๋ ๋์ ๊ตฌํ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํ์ฅํฉ๋๋ค.
http://dev.w3.org/csswg/cssom-view/#dom -htmlelement-offsetleft
Object.defineProperties(window.HTMLElement.prototype, {
offsetLeft: {
get: function() { return parseFloat(window.getComputedStyle(this).marginLeft) || 0; }
},
offsetTop: {
get: function() { return parseFloat(window.getComputedStyle(this).marginTop) || 0; }
},
offsetHeight: {
get: function() { return parseFloat(window.getComputedStyle(this).height) || 0; }
},
offsetWidth: {
get: function() { return parseFloat(window.getComputedStyle(this).width) || 0; }
}
});
๋ค๋ฅธ ์ฌ๋์ด tobyhinloopen์ด ์ ์ํ ๊ฒ์ผ๋ก ์ฑ๊ณต์ ์ฐพ์์ต๋๊น?
@tobyhinloopen : ๋ด ๊ทธ๋ํ ๋ฐฐ๊ฒฝ, ์ถ ๋ฐ ๋ ์ด๋ธ์ด ํ์๋์ง๋ง(๋น๋ค์ด์ง ๋ฐฉ์์ผ๋ก) ๋๋จธ์ง๋ ์ฌ์ ํ ํ๋ฆฟํฉ๋๋ค. ์์ ํ ๊ทธ๋ํ๋ฅผ ์ป์ ์ ์์์ต๋๊น?
์ ์ํ ๊ตฌํ์ด ์๋ํ๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์์ต๋๋ค. ํจ๊ณผ๊ฐ ์์ผ๋ฉด ์ฐ์ฅํ์ญ์์ค. ๊ฐ๋ฅํ OffsetHeight/width์๋ ํจ๋ฉ๋ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์๋ฒฝํ ๊ตฌํ์ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์๋ํ๋๋ก ๋ช ๊ฐ์ง ํดํค ํซํฝ์ค๋ฅผ ์ ์ํฉ๋๋ค.
@tobyhinloopen์ด ์ ์ํ ์๋ฃจ์ ์ ๊ด์ฐฎ์ ๋ณด์ด์ง๋ง ์ฌ์ฉํ ๋ "์ธ๋ จ๋ ์์ฑ offsetLeft๋ฅผ ์ฌ์ฉํ ์ ์์"์ด ํ์๋ฉ๋๋ค.
@zallek ์ด๋ฏธ offsetLeft ์ง์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค :) window.HTMLElement.prototype.offsetLeft
๋ ๋ฌด์์ ๋ฐํํฉ๋๊น? ์ ์๋์ง ์์ ๊ฒฝ์ฐ ๋ด ์๋ฃจ์
์ด ์๋ํ์ง ์์ต๋๋ค.
@tobyhinloopen์ ๊ฐ์ฌ ์ธ์ฌ๋ฅผ
@tobyhinloopen ์๋ฃจ์
์ ๊ฒ์ํด ์ฃผ์
์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค! ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ offset ๊ฐ์ ์ค์ ํ๊ณ this
์ ์ธํ๋ ํ ๋งค์ฐ ์ ์ฉํ๊ณ ์๋ํฉ๋๋ค. this
๋ ์ ์๋์ง ์์ ์ํ๋ก ๋์ค๋๋ฐ, ์ปจํ
์คํธ๊ฐ ์ค์ ํด๋์ค๊ฐ ์๋๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ผ์ข
์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ด ๊ธฐ๋ํ๋ ๊ฒ์
๋๊น?
@jordantomax ์ด๊ฒ์ ํจ์๊ฐ ์ ์๋ โโ๋๊ฐ ์๋๋ผ ํจ์๊ฐ ํธ์ถ๋ ๋ ์์์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. 'this'๋ html ์์์์ ํธ์ถํ ๋ ์์์ฌ์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
@tobyhinloopen ๋น ๋ฅธ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ด๊ฐ ๊ธฐ๋ํ๋ ๊ฒ์
๋๋ค. ์ค์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ์ฌ ์ฝ๋์๋๋ฐ์ค์์ ๋ด ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ค๊ณ ํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ jest๋ฅผ ์ฌ์ฉํ ๋ this
๊ฐ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค. ๋ด๊ฐ ๊ฒฝํํ๊ณ ์๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์์ ์ํ ์ ์ฅ์๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ค์ ์ด ์๋ชป๋์์ ์ ์์ต๋๋ค.
https://github.com/jordantomax/jest-htmlelement-prototype-sandbox
๊ด๋ จํ์ฌ jest ๋ฐ jsdom์ ์ฌ์ฉํ์ฌ scrollIntoView
์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋์์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
get: () => {}
๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. () => {}
ํจ์ ๊ตฌ๋ฌธ์ด this
์ ์๋ง์
๋๋ค. ๋์ get() {}
(๊ถ์ฅ) ๋๋ get: function() {}
(๋์ฒด)๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ํฉ๋๋ค. @jordantomax
๋ํ ์ฌ์ฉ =>
์์ ํ
์คํธ ์ค์ํธ์ it
/ describe
์. JEST์ ๋ํด์๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง this
์ it
/ test
/ describe
์๋ ๋ชจ๋ ์ข
๋ฅ์ ํ์ดํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ก์ธ์คํ ์ ์๋ ์ ํธ๋ฆฌํฐ. ์๋ฅผ ๋ค์ด, ๋ชจ์นด์๋ this.slow()
, this.timeout(4000)
๋ฑ์ด ์์ต๋๋ค.
https://mochajs.org/#arrow -ํจ์
๊ด๋ จํ์ฌ jest ๋ฐ jsdom์ ์ฌ์ฉํ์ฌ scrollIntoView์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ผ๋ฐ์ ์ผ๋ก MDN์์ ์ฌ์ฉํ ์ ์๋ ์ผ์ข ์ ํด๋ฆฌํ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ตฌ ์ฌํญ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ ค๊ณ ์๋ํ์ญ์์ค. ๋ชจ๋ ์คํจํ๋ฉด ๋ค๋ฅธ ํ ์คํธ ํ๊ฒฝ์ ์ฌ์ฉํ์ญ์์ค. JSDom์ด ๊ทธ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์์ง๋ง ์ด๋ ์์ ์์ ๋์ ์ค์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ณ ๋ คํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. ๋ง์ ํ ์คํธ ํ๊ฒฝ์์ ์ค์ ๋ธ๋ผ์ฐ์ (๋์์ ์ฌ๋ฌ ๊ฐ ํฌํจ)์์ ํ ์คํธํ ์ ์์ผ๋ฉฐ ๋์์ ๊ฐ๋ฐ ์์คํ ์ ์ค์๊ฐ์ผ๋ก ๋ค์ ๋ณด๊ณ ํฉ๋๋ค. IIRC Karma๋ ์ด๊ฒ์ ์ํํฉ๋๋ค -> https://karma-runner.github.io/latest/index.html
๋ด ์ปดํจํฐ์์ ํ ๋ฒ์ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ (ํ์ด์ดํญ์ค ํฌ๋กฌ ์ฌํ๋ฆฌ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ ์์ง + ์๋ฎฌ๋ ์ดํฐ์ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ )๋ฅผ ์ด์๊ณ ๋ชจ๋ Karma + Mocha๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ค์ ๋ณด๊ณ ํ์ต๋๋ค.
@tobyhinloopen ๋ง์์ ๋น์ ์ ๋ชจ๋ ๊ณ์ ์ ์์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค!! getComputedStyle
๊ฐ ํ์ํ ์ด์ ์ ๋ํด ์ฌ์ ํ ์ฝ๊ฐ ๋ถ๋ถ๋ช
ํ๋ฉฐ ํด๋น ๋ฐฉ๋ฒ์ด ์ฃผ์ด์ง๋ฉด setter๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ฅผ ์ํด ์ด๊ฒ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Object.defineProperties(window.HTMLElement.prototype, {
offsetTop: {
get () {
return this.marginTop
},
set (offset) {
this.marginTop = offset
}
}
})
๋ค์ํ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค๐
@jordantomax getComputedStyle
๋ ์ ์ฉ๋ ์์น(์คํ์ผ์ํธ, style
์์ฑ ๋๋ JS์์)์ ์๊ด์์ด ๋ชจ๋ CSS ์์ฑ์ ๋ํด ์ค์ ๊ณ์ฐ๋ ์คํ์ผ์ ๊ฐ์ ธ์ต๋๋ค. this.marginTop
๊ฐ ๋์ผํ์ง ํ์คํ์ง ์์ง๋ง ์๋ง๋ ๊ทธ๋ด ๊ฒ ๊ฐ์ต๋๋ค (๊ทธ๋ฌ๋ ๋ถ๋ช
ํ ๋ชจ๋ CSS ์ํ์ด ์๋ ์ฌ๋ฐฑ์ ๋ํด์๋ง)
@tobyhinloopen ์,
@tobyhinloopen ๊ฐ์ฌํฉ๋๋ค. ๋ ์งง์ ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ธ๋ผ์ธ์ด ์๋ ํ ๋จ์ ํ
์คํธ์ CSS๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ getComputedStyle
๊ฐ ์ค์ ๋ก ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด .style
๊ฐ ์ถฉ๋ถํ ์ข๊ณ ๋น ๋ฆ
๋๋ค.
Object.defineProperties(window.HTMLElement.prototype, {
offsetLeft: {
get () { return parseFloat(this.style.marginLeft) || 0 }
},
offsetTop: {
get () { return parseFloat(this.style.marginTop) || 0 }
},
offsetHeight: {
get () { return parseFloat(this.style.height) || 0 }
},
offsetWidth: {
get () { return parseFloat(this.style.width) || 0 }
}
})
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? offsetWidth = 0์ด ๋ฉ๋๋ค.
const dom = new JSDOM(`<!DOCTYPE html><body></body>`);
let document = dom.window.document
let span = document.createElement("span");
span.innerHtml = 'test
span.style.fontSize = 150 + 'px';
span.style.fontFamily = 'Arial'
document.body.appendChild(span)
console.log(span.offsetWidth) // 0
์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๊น? offsetWidth = 0์ด ๋ฉ๋๋ค.
@petran ๊ธ๊ผด ํฌ๊ธฐ์ ์์๋ ๋ชจ๋ CSS ์์ฑ์ ๋ํ ์ง์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ jsdom์ด SPAN์ ๋๋น๋ฅผ ๊ณ์ฐํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ๊ฒ์ ํ์ค์ ์ด์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด JSDOM์ ๋ชฉํ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ณด๋ค ์ ํํ ๋ธ๋ผ์ฐ์ ์๋ฎฌ๋ ์ด์ ์ ์ํ์๋ฉด ์ค์ ๋ธ๋ผ์ฐ์ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ด ๊ฒฝ์ฐ์ ์๋ํ๋ ์ง์์ ์ํด ์ด ์ค๋ํซ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ ํ ๊ตฌํ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค๋ ๊ฒ์ ๋ช ์ฌํ์ญ์์ค.
window
๋document.parentWindow
์ด์ด์ผ ํฉ๋๋ค.๋ ๋์ ๊ตฌํ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํ์ฅํฉ๋๋ค.
http://dev.w3.org/csswg/cssom-view/#dom -htmlelement-offsetleft