SVG foreignObject not working properly on Safari
Safari에서 svg 내 foreignObject를 사용하면서, 엘리먼트의 위치가 안맞는 이슈가 있었다.
엘리먼트의 position이 static, fixed가 아닌 경우 위치가 left: 0, top: 0 에서 렌더링 된다. (개발자 도구에서 엘리먼트 위치를 찍어보면 정상적으로 나온다.)
이슈화 된지는 매우 오래되었으나, position: fixed;
외의 별다른 해결책은 안보인다.
23113 - Layer content inside HTML in SVG foreignObject renders in the wrong place
공식적인 해결책은 나오지 않았기 때문에, 이런 방법들을 사용했다.
position: fixed;
<style>
#parents {
position: fixed;
}
#child {
position: relative;
}
</style>
<foreignObject>
<div id="parents">
<div id="child">foreignObject</div>
</div>
</foreignObject>
단, 이경우에는 position: fixed;를 가진 엘리먼트가 다른 엘리먼트 위에 렌더링 된다. (Safari 한정)
svg는 z-index가 없기 때문에 나중에 렌더링 되는 엘리먼트가, 다른 엘리먼트 위에 렌더링 되는데, Safari의 경우 position: fixed;를 사용하면 렌더링 순서와 상관 없이 가장 위에 렌더링 된다.
// 엘리먼트들의 position default value는 static 이기 때문에,
// 별도의 position 속성을 적용하지 않는다.
<style>
#parents {
}
#child {
}
</style>
<foreignObject>
<div id="parents">
<div id="child">foreignObject</div>
</div>
</foreignObject>
이 경우에는 position: fixed; 에서 발생했던 렌더링 순서 문제가 없다. 타 브라우저 처럼 dom 순서대로 렌더링 된다.