HighChartsã®ãµãŒããŒåŽã¬ã³ãã©ãŒãå®è£ ããããšããŠããŸãã çµæã®SVGããŒã¯ã¢ããã«ãxãyãå¹ ãé«ãã®å€ãããããšããã«ãªãããšãé€ããŠããã¹ãŠãæ£åžžã«æ©èœããŠããããã«èŠããŸãã ããã€ãã®ãããã°ãéããŠãoffsetWidthãoffsetHeightãoffsetTopãoffsetLeftããã¹ãŠèŠçŽ ããšã«æªå®çŸ©ã§ãããšããäºå®ã«åé¡ãç¹å®ãããšæããŸãã
ãããã®ããããã£ã¯ãå°æ¥ã®ãªãªãŒã¹ã«å«ãŸããäºå®ã§ããïŒ ãŸããåœé¢ã¯å®è£ ã§ããåé¿çã¯ãããŸããïŒ
http://www.w3.org/TR/cssom-view/ãå®è£ ããå¿ èŠããããšæã
SVGã®åé¡ã®ããã€ãã解決ããã¯ãã®cssomã®çµ±åãéå§ããŸããã
offset *ããããã£ã«ã¢ã¯ã»ã¹ã§ããã°ããã£ã³ãã¹é¢é£ã®ãããžã§ã¯ãã«å¿ èŠã«ãªããŸãã
ãã®åé¡ã®é²æç¶æ³ã¯ã©ãã§ããïŒ Highchartsã䜿çšããããã¯ãšã³ããµã°ã¬ã³ããªã³ã°ã®ãã®ãããªæ©èœããããããã§ãã
ç§ãããã欲ããã§ã:)
å©ãã«ãªãäºåã®ãµã€ã¯ã«ã¯ãããŸããïŒ å人çã«ã¯svg1.1ã¯å¿ èŠãããŸããããçãããããã«åãçµãã®ã«ååãªã»ã©è奮ããŠããã°ãçéžãæäŒã£ãŠãããããšæããŸãã
@tmpvar ïŒãæäŒããããã®ã§ããããµãŒããŒãµã€ãã®JSé¢é£ã®ãã®ã¯ããªãæ°ããã§ãã
å€åããªãã¯ã©ãããå§ããã¹ããç§ã«ãã³ããäžããããšãã§ããç§ã¯äœããåããããã«æåãå°œããããšãã§ããŸã:)
ãµãŒããŒã§highchartsãæå¹ã«ããããã«ãSVG1.1ã«ãéåžžã«èå³ããããŸãã ãã«ããæäŸãããã®ã§ãããæåã«SVG 1.0ãšãã®çŸåšã®jsdomã§ã®å®è£ ã«ã€ããŠç解ããå¿ èŠããããŸããããã«ã¯ããã°ããæéããããå ŽåããããŸã;ïŒ
ããã§ã®æåã®ã¹ãããã¯ããã¹ãã¹ã€ãŒãïŒhttp://www.w3.org/Graphics/SVG/WG/wiki/Test_Suite_OverviewïŒã®ã³ããŒãååŸããããããããã¬ã¹ã«å€æããããšã ãšæããŸãïŒããã¯ããªãã®äœæ¥ãããããŸããïŒ
次ã«ã level2/svg.js
ãè¿œå ããŠãå®è£
ãéå§ã§ããŸãã
ç§ã¯ãããããããæçµçã«åé¿ããã§ãããããä»ã®ãšããjsdomã®åªå é äœã®ãªã¹ãã®äžäœã«ã¯ãããŸããã
@href svg1.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ãWebãã©ãŠã¶ãŒã§ãã¹ããããšãçµæã¯æ¬¡ã®ããã«ãªããŸãã
{ 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ã«ãã£ãŠææ¡ããã解決çã¯ã¡ãã»ãŒãžã衚瀺ãããŸãã
@zallekããªãã¯ãã§ã«offsetLeftããµããŒãããŠãããšæããŸãïŒïŒ window.HTMLElement.prototype.offsetLeft
ã¯äœãè¿ããŸããïŒ ãããæªå®çŸ©ä»¥å€ã®å Žåãç§ã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãã
@tobyhinloopenã«æè¬ããŸããããªãã®è§£æ±ºçã¯ç§ã«ãšã£ãŠéåžžã«åœ¹ã«ç«ã¡ãŸããã :)
@tobyhinloopenãœãªã¥ãŒã·ã§ã³ãæçš¿ããŠããã ãããããšãããããŸãïŒ ããã¯éåžžã«äŸ¿å©ã§ãå€æ°ã䜿çšããŠãªãã»ããã®å€ãèšå®ãã this
ãé€å€ããéãæ©èœããŸãã this
ã¯æªå®çŸ©ã§åºãŠããŸããããã¯ãã³ã³ããã¹ããå®éã®ã¯ã©ã¹ã§ã¯ãªãããšãèãããšããã®çš®ã®æå³ããããŸãã ããã¯ããªããæåŸ
ããããšã§ããïŒ
@jordantomaxããã¯ãé¢æ°ãå®çŸ©ãããŠãããšãã§ã¯ãªããé¢æ°ãåŒã³åºããããšãã«èŠçŽ ã«ãã€ã³ããããŸãã 'this'ã¯ãä»»æã®htmlèŠçŽ ããåŒã³åºãå Žåã®èŠçŽ ã§ããå¿ èŠããããŸãã
ããã§ãªãå Žåã¯ãäŸãèŠãŠã¿ãããšæããŸãã
@tobyhinloopenè¿
éãªå¯Ÿå¿ã«æè¬ããŸãã ãããç§ãæåŸ
ããããšã§ãã å®éã®ãã©ãŠã¶ç°å¢ã䜿çšããŠcodesandboxã§åé¡ãåçŸããããšãããšãæ£ããæ©èœããŸãã ããããjestã䜿çšãããšã this
ãæªå®çŸ©ãšããŠè¡šç€ºãããŸãã ç§ãçµéšããŠããããšã瀺ãããã«å°ããªãµã³ãã«ãªããžããªãäœæããŸãããã»ããã¢ãããééã£ãŠããå¯èœæ§ããããŸãã
https://github.com/jordantomax/jest-htmlelement-prototype-sandbox
é¢é£ããŠãjestãšjsdomã䜿çšããŠscrollIntoView
ãããªã¡ãœããããªãŒããŒã©ã€ãããã®ã«ãåé¡ããããŸãã ãããè¡ãããã®æšå¥šãããæ¹æ³ã¯ãããŸããïŒ
ã©ããããããšãããããŸããïŒ
get: () => {}
ã䜿çšããŠããããã ãšæããŸã- () => {}
é¢æ°ã®æ§æãthis
å°ç¡ãã«ããŸãã 代ããã«get() {}
ïŒæšå¥šïŒãŸãã¯get: function() {}
ïŒä»£æ¿ïŒã䜿çšãããšãæ©èœããŸãã @jordantomax
ãŸãããã¹ãã¹ã€ãŒãã®it
/ describe
=>
ããŸãã ç§ã¯åè«ãç¥ããŸããããMOCHAã«ããããããããæšå¥šãããŸããthis
ã§ããªãã®it
/ test
/ describe
ã®ãã¹ãŠã®çš®é¡ãæã£ãŠããŸãç¢å°æ©èœã䜿çšãããšã¢ã¯ã»ã¹ã§ããªããŠãŒãã£ãªãã£ã ããšãã°ãã¢ã«ã«ã¯this.slow()
ã this.timeout(4000)
ãªã©ããããŸãã
https://mochajs.org/#arrow -functions
é¢é£ããŠãjestãjsdomã䜿çšããŠscrollIntoViewãªã©ã®ã¡ãœããããªãŒããŒã©ã€ãããéã«ãåé¡ãçºçããŸãã ãããè¡ãããã®æšå¥šãããæ¹æ³ã¯ãããŸããïŒ
éåžžãMDNã«ã¯ããçš®ã®ããªãã£ã«ããããŸãã ãã以å€ã®å Žåã¯ãä»æ§ã«åºã¥ããŠããŒãºã«åã£ãæ¹æ³ã§å®è£ ããŠã¿ãŠãã ããã ãã¹ãŠã倱æããå Žåã¯ãå¥ã®ãã¹ãç°å¢ã䜿çšããŠãã ããã JSDomã«ã¯ãã®å ŽæããããŸãããããæç¹ã§ã代ããã«å®éã®ãã©ãŠã¶ãŒãæ€èšããããšããå§ãããŸãã å€ãã®ãã¹ãç°å¢ã§ã¯ãå®éã®ãã©ãŠã¶ãŒã§ã®ãã¹ãïŒåæã«è€æ°ã®å Žåã§ãïŒãå¯èœã§ãããšåæã«ãéçºãã·ã³ã«ãªã¢ã«ã¿ã€ã ã§ã¬ããŒããè¿ããŸãã IIRCã«ã«ãã¯ãããè¡ããŸã-> https://karma-runner.github.io/latest/index.html
ç§ã¯èªåã®ãã·ã³ã§äžåºŠã«è€æ°ã®ãã©ãŠã¶ãŒïŒFirefoxã¯ããŒã ãµãã¡ãªã€ã³ã¿ãŒããããšã¯ã¹ãããŒã©ãŒãšããž+ã·ãã¥ã¬ãŒã¿ãŒã®ã¢ãã€ã«ãã©ãŠã¶ãŒïŒãéããŠããŸãããããããã¯ãã¹ãŠKarma + Mochaã䜿çšããŠãªã¢ã«ã¿ã€ã ã§å ±åããŸããã
@tobyhinloopenããã§ããããªãã¯ãã¹ãŠã®ã¢ã«ãŠã³ãã«ããŸãïŒ ããããšãããããŸããïŒïŒ getComputedStyle
ãå¿
èŠãªçç±ã«ã€ããŠã¯ãŸã å°ãããããŸãããããã®ã¡ãœãããæå®ããŠã»ãã¿ãŒãäœæããããšã¯å¯èœã§ããã ç§ã«ãšã£ãŠãããã¯ããŸãããããã§ãïŒ
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 ã ç§ã¯ããã«çãããŒãžã§ã³ã䜿çšããŠããŸãã getComputedStyle
ã¯ãã€ã³ã©ã€ã³ã§ãªãéããå人çã«ãŠããããã¹ãã«cssãè¿œå ããããšã¯æ±ºããŠãªãã®ã§ãå®éã«ã¯å¿
èŠãªããšæããŸãããã®ããã .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