๐๐ป[Js] ๋ฌธ์์ ๊ธฐํํ์ ํน์ฑ
- -
๋ชจ๋ ํฌ์คํ ์ ์ธํ๋ฐ [์ํ์ฝ๋ฉ] ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ
์ถ์ฒ๋ ์๋์ ์ฃผ์๋ก "egoing Lee"๋์ ์๋ฃ์ ๋๋ค.
์์ ์ ์ธ ์๋๊ฐ ์๋ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํด๋๋ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์ ๋๋ค.
์น๋ธ๋ผ์ฐ์ Javascript (์๋ฐ์คํฌ๋ฆฝํธ) - ์ธํ๋ฐ
์ํ์ฝ๋ฉ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ข ์ ๋๋ค. ์น๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ ์ ์ดํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ ํผ๋ฐ์ค๋ฅผ ๊ณต๋ถํด ๋ด ๋๋ค. ์ด๊ธ ์น ๊ฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด JavaScript ์จ๋ผ์ธ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ข
www.inflearn.com
๋ฌธ์์ ๊ธฐํํ์ ํน์ฑ
์ด๋ฒ ์๊ฐ์๋ ์์๋ค์ ์์น์ ํฌ๊ธฐ๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด๋ค.
์์์ ํฌ๊ธฐ์ ์์น
์ฐ์ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์. (์คํ)
<style>
body{
padding:0;
margin:0;
}
#target{
width:100px;
height:100px;
border:50px solid #1065e6;
padding:50px;
margin:50px;
}
</style>
<div id="target">
Coding
</div>
<script>
var t = document.getElementById('target');
console.log(t.getBoundingClientRect());
</script>
ํ๋ฉด์ ํ์๋ ๋ชจ์ต์ ์๋์ ๊ฐ๋ค.
์ฆ ์๋ฆฌ๋จผํธ์ ํ ๋๋ฆฌ์ body ํ๊ทธ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ 50px์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ ๋๋ฆฌ๋ฅผ ํฌํจํ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ๋ 300px์ด๋ค.
์ด ๊ฐ์ ์์๋ด๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ API๊ฐ getBoundingClientRect์ด๋ค.
์ด๋ฅผ ์ฝ์์์ ์คํํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
์ฆ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ์ ์์น๋ฅผ ์๊ณ ์ถ์ ๋๋ getBoundingClientRect๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
getBoundingClientRect์ width ,hight ๊ฐ์ IE๋ ์ ๊ณตํ์ง ์๋๋ค.
๋ง์ฝ ์๋ฆฌ๋จผํธ๊ฐ ์ค์ฒฉ๋์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์์ ๊ฐ์ด ์๋ฆฌ๋จผํธ๋ฅผ ์ค์ฒฉํ์ ๋ coding ์๋ฆฌ๋จผํธ์ ๋ฌธ์์์ ๊ฑฐ๋ฆฌ๋ 200px์ด๋ค. getBoundingClientRect๋ฅผ ํธ์ถํด๋ณด์. (์คํ)
<style>
body{
padding:0;
margin:0;
}
div{
border:50px solid #1065e6;
padding:50px;
margin:50px;
}
#target{
width:100px;
height:100px;
}
</style>
<div>
<div id="target">
Coding
</div>
</div>
<script>
var t = document.getElementById('target');
console.log(t.getBoundingClientRect());
console.log(t.offsetParent);
</script>
์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
์ฆ ์๋ฆฌ๋จผํธ์ ์์น๋ฅผ ์๋ฏธํ๋ top, right์ ๊ฐ์ ํตํด์ ๊ธฐ์ค์ด ๊ทธ ๋ถ๋ชจ๊ฐ ์๋๋ผ body๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ offsetParent ์์ฑ์ ํธ์ถํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ถ๋ชจ ์ค CSS position์ ๊ฐ์ด static์ธ td, th, table ์๋ฆฌ๋จผํธ๊ฐ ์๋ค๋ฉด ์ด ์๋ฆฌ๋จผํธ๊ฐ offsetParent๊ฐ ๋๋ค.
์ฆ, ์ธก์ ์ ๊ธฐ์ค์ ๋๋ ์๋ฆฌ๋จผํธ๊ฐ ๋๊ตฌ๋๋ฅผ ์๊ณ ์ถ์ ๋ offsetParent๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ getBoundingClientRect๋ฅผ ์ง์ํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๊ฒฝ์ฐ offsetLeft์ offsetTop ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ค.
ํ ๋๋ฆฌ๋ฅผ ์ ์ธํ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ๋ฅผ ์๊ณ ์ถ๋ค๋ฉด ClientWidth, ClientHeight๋ฅผ ์ฌ์ฉํ๋ค. (์คํ)
<script>
var t = document.getElementById('target');
console.log('clientWidth:', t.clientWidth, 'clientHeight:', t.clientHeight);
</script>
Viewport
์์์ ์์น๋ฅผ ์๊ฐํ ๋๋ ์ฌ์ค ์กฐ๊ธ ๋ ๋ณต์กํด์ง๋ค. ๋ฌธ์๊ฐ ๋ธ๋ผ์ฐ์ ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ ์คํฌ๋กค์ด ๋ง๋ค์ด์ง๋๋ฐ
์คํฌ๋กค์ ๋ฐ๋ผ์ ์์น์ ๊ฐ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ฐ์ viewport์ ๋ํ ์ดํด๊ฐ ์ ํ๋์ด์ผ ํ๋ค.
viewport์ ์ขํ
์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ทฐํฌํธ๋ ๋ฌธ์์ ๋ด์ฉ ์ค ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ์์ญ์ ์๋ฏธํ๋ค.
์ด์ ๋ฐ๋ผ์ ๋ฌธ์์ ์ขํ๊ฐ ์๊ณ ๋ทฐํฌํธ์ ์ํ๊ฐ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์์์ ์ดํด๋ณธ getBoundingClientRect๋ viewport์ ์ขํ๋ฅผ ์ฌ์ฉํ๋ค.
์๋ ์์ ๋ฅผ ์คํํด๋ณด๋ฉด 1์ด์ ํ๋ฒ์ฉ getBoundingClientRect์ top ์์ฑ๊ณผ window.pageYOffset์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค. (์คํ)
<style>
body{
padding:0;
margin:0;
}
div{
border:50px solid #1065e6;
padding:50px;
margin:50px;
}
#target{
width:100px;
height:2000px;
}
</style>
<div>
<div id="target">
Coding
</div>
</div>
<script>
var t = document.getElementById('target');
setInterval(function(){
console.log('getBoundingClientRect : ', t.getBoundingClientRect().top, 'pageYOffset:', window.pageYOffset);
}, 1000)
</script>
์ ์ฝ๋์์ setInterval ํจ์๋ () ์์ ๋ค์ด์๋ function์ 1000 ์ฆ 1์ด์ ํ๋ฒ์ฉ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๋ ๋ฉ์๋ ์ด๋ค.
์ด๋ฅผ ํตํด์ ์ ์ ์๋ ๊ฒ์ getBoundingClientRect์ ๊ฐ์ด ์คํฌ๋กค์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋ ๋ทฐํฌํธ์ ์ขํ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
๋ํ ์คํฌ๋กค์ ์ ๋๋ฅผ ์๊ณ ์ถ์ ๋๋ pageYOffset์ ์ฌ์ฉํ๋ฉด ๋๋ค๋ ๊ฒ๋ ์ ์ ์๋ค.
์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ pageYOffset ๋์ scrollTop ์์ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
์ด๋ฅผ ํตํด์ getBoundingClientRect๋ ๋ทฐํฌํธ (๋์ ๋ณด์ด๋ ๋ถ๋ถ) ๋ถํฐ ์๋ฆฌ๋จผํธ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ฆ, view port์ ์ขํ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
์์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด getBoundingClientRect + pageYOffset ์ ๋ํด์ฃผ๋ฉด ! ๊ทธ ๋ฌธ์์ body์ body ์๋ฆฌ๋จผํธ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์์๋ผ ์ ์๋ค.
๋ฌธ์์ ์ขํ
๊ทธ๋ผ ๋ฌธ์์ ์ขํ๋ฅผ ์๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋? ๋ทฐํฌํธ์ ์ขํ์ ์คํฌ๋กค๋ ์ ๋๋ฅผ ๋ํด์ ์ ์ ์๋ค. ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์กฐ๊ธ ์์ ํ๋ค. (์คํ)
setInterval(function(){
console.log('getBoundingClientRect : ', t.getBoundingClientRect().top, 'pageYOffset:', window.pageYOffset, 'document y:', t.getBoundingClientRect().top+window.pageYOffset);
}, 1000)
์คํฌ๋กค
๊ทธ๋ผ ๋ฌธ์์ ์คํฌ๋กค ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด๋ป๊ฒ ํ๋ ๊ฒ์ผ๊น? scrollLeft์ scrollTop ํ๋กํผํฐ๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. (์คํ)
<style>
body{
padding:0;
margin:0;
}
div{
border:50px solid #1065e6;
padding:50px;
margin:50px;
}
#target{
width:100px;
height:2000px;
}
</style>
<input type="button" id="scrollBtn" value="scroll(0, 1000)" />
<script>
document.getElementById('scrollBtn').addEventListener('click', function(){
window.scrollTo(0, 1000);//0์ x, y = 1000๋งํผ ์์ง์ด๋ผ๋ ๊ฒ
})
</script>
<div>
<div id="target">
Coding
</div>
</div>
์์ฒ๋ผ ํด๋ฆญ์ผ๋ก ์ง์ ํ ๊ฐ๋งํผ ์คํฌ๋กค์ ์์ง์ผ ์ ์๋ค.(ํ์ดํผ๋งํฌ ๋ง๋ฅ ํ์ด์ง๋ฅผ ์ฎ๊ธฐ๊ณ ํ๋ ๊ฒ์ผ๋ก ์์ฉ ๊ฐ๋ฅ)
์คํฌ๋ฆฐ์ ํฌ๊ธฐ
์คํฌ๋ฆฐ์ ํฌ๊ธฐ๋ ๋ชจ๋ํฐ์ ํฌ๊ธฐ์ ๋ธ๋ผ์ฐ์ ๋ทฐํฌํธ์ ํฌ๊ธฐ๊ฐ ์๋ค. ์ด๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค. (์คํ)
<script>
console.log('window.innerWidth:', window.innerWidth, 'window.innerHeight:', window.innerHeight);
console.log('screen.width:', screen.width, 'screen.height:', screen.height);
</script>
window.inner*์ ๋ทฐํฌํธ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๊ณ , screen.*์ ์คํฌ๋ฆฐ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
์ฆ inner๋ ๋ณด์ด๋ ํฌ๊ธฐ screen์ ์ค์ ์ปดํจํฐ์ ์คํฌ๋ฆฐ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค.
์นํ์ด์ง์ ํญ์ ์ผ๋ง๋งํผ์ผ๋ก ์ ํ ์ง ์์ฌ๊ฒฐ์ ํ ๋, ์ด๋ฐ ์ ๋ณด๋ฅผ ์์งํ์ฌ ์น ํ์ด์ง๋ฅผ ๋ง๋๋๋ฐ ์๊ธดํ๊ฒ ์ฌ์ฉ๋๋ค.
์ฐธ๊ณ
๋๊ฐ์ viewport์ ๋ํ์ฌ
๊ฐ๋น์ ํธ์คํ ์๋น์ค:์นํธ์คํ ,์น๋ฉ์ผํธ์คํ ,์ผํ๋ชฐํธ์คํ ,๋จ๋ ์๋ฒ,๋์์ํธ์คํ
errdoc.gabia.net
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐๐ป[Js] addEventListener() | ์ด๋ฒคํธ ์ ํ | ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง (0) | 2021.02.10 |
---|---|
[Js] ์ด๋ฒคํธ | ๋ฑ๋ก๋ฐฉ๋ฒ & inline | ํ๋กํผํฐ ๋ฆฌ์ค๋ (0) | 2021.02.10 |
[Js] Text๊ฐ์ฒด | ๊ฐ API | ์กฐ์ API (0) | 2021.02.10 |
[Js ] Document ๊ฐ์ฒด (0) | 2021.02.10 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค