์ƒˆ์†Œ์‹

Languages/Java Script

๐Ÿ‘‰๐Ÿป[Js] ๋ฌธ์„œ์˜ ๊ธฐํ•˜ํ•™์  ํŠน์„ฑ

  • -
๋ฐ˜์‘ํ˜•

๋ชจ๋“  ํฌ์ŠคํŒ…์€ ์ธํ”„๋Ÿฐ [์ƒํ™œ์ฝ”๋”ฉ] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ•์˜์˜ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ

์ถœ์ฒ˜๋Š” ์•„๋ž˜์˜ ์ฃผ์†Œ๋กœ "egoing Lee"๋‹˜์˜ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. 

์ƒ์—…์ ์ธ ์˜๋„๊ฐ€ ์•„๋‹Œ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ด๋†“๋Š” ๋ชฉ์ ์œผ๋กœ ํฌ์ŠคํŒ… ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

www.inflearn.com/course/javascript-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B0%95%EC%A2%8C#

 

์›น๋ธŒ๋ผ์šฐ์ € 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

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.