๋ฌธ์ ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๊ธฐ
๐ก์ง์์๋ต์ https://github.com/pul8219/TIL
Issues
ํญ์ ์๋ง์ step ์ด์์์ ๋จ๊ฒจ์ฃผ์ธ์. โก๏ธ Issueํญ์ผ๋ก ์ด๋
- ์์ฑ์: Wol-dan (@pul8219)
- ์คํฐ๋ ์ฃผ์ : FrontEnd ๋ฉด์ ์คํฐ๋ https://gitlab.com/siots-study/topics/-/wikis/home
- ๊ณต๋ถ ๋ฒ์: Moving the mouse: mouseover/out, mouseenter/leave
- ๊ธฐํ: 01/16(ํ ) ~ 01/19(ํ)
-
z-index https://tost.tistory.com/87
-
innerHTML innerText
- Moving the mouse: mouseover/out, mouseenter/leave
mouseover
/mouseout
์ด๋ฒคํธ์relatedTarget
- Skipping elements
mouseover
,mouseout
์ ์์ ์์ ๊ด๋ จ- Event delegation
๐ฌ
Moving the mouse: mouseover/out, mouseenter/leave ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค.
์ถ์ฒ: https://ko.javascript.info/mousemove-mouseover-mouseout-mouseenter-mouseleave
mouseover
:๋ง์ฐ์ค ์ปค์๊ฐ ์์ ๋ฐ์ ์๋ค๊ฐ ์์ ์์ผ๋ก ์์ง์ผ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธmouseout
: ๋ง์ฐ์ค ์ปค์๊ฐ ์์ ์์ ์๋ค๊ฐ ์์ ๋ฐ์ผ๋ก ์์ง์ผ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ์ด๋ฒคํธ ๋ชจ๋ ํด๋น ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ ์ฉ๋ ์์์ ์์ ์์์๊ฒ๋ ์ ์ฉ๋๋ค. (STEP 22์์ ์ดํด๋ดค๋ค.)
mouseover
๊ณผ mouseout
์ด๋ฒคํธ๋ relatedTarget
์ด๋ผ๋ ํน๋ณํ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ค. ์ด ํ๋กํผํฐ๋ target
ํ๋กํผํฐ๋ฅผ ๋ณด์ํ๋ค. (+ mouseenter
, mouseleave
์ด๋ฒคํธ๋ relatedTarget
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ค.) ๋ง์ฐ์ค๊ฐ ์ด๋ค ์์๋ฅผ ๋ ๋ ๋ ๊ทธ ์ค ํ๋๋ target
์ด ๋๊ณ ๋ค๋ฅธ ํ๋๋ relatedTarget
์ด ๋๋ค.
mouseover
์ ๊ฒฝ์ฐ,
event.target
-> ๋ง์ฐ์ค๊ฐ ์จ ์์๋ฅผ ๊ฐ๋ฆฌํดevent.relatedTarget
-> ๋ง์ฐ์ค๊ฐ ๋ ๋์จ ์์๋ฅผ ๊ฐ๋ฆฌํด- ๋ง์ฐ์ค์ ์ด๋:
relatedTarget
->target
)
mouseout
์ ๊ฒฝ์ฐ, (mouseover
์ ๊ฒฝ์ฐ์ ๋ฐ๋)
event.target
-> ๋ง์ฐ์ค๊ฐ ๋ ๋ ์์๋ฅผ ๊ฐ๋ฆฌํดevent.relatedTarget
-> ์๋ก ๋์ฐฉํ ์์- ๋ง์ฐ์ค์ ์ด๋:
target
->relatedTarget
)
event.target
์์ฑ์ด ์ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ฅผ ๋ปํ๋ ๊ฒ์ ๊ธฐ์ตํ๋ฉด ์์ ๋ด์ฉ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
์ฐธ๊ณ : MouseEvent.relatedTarget, MDN
โ ๏ธ relatedTarget
์null
์ด ๋ ์ ์๋ค.๋ค๋ฅธ ์์๋ก๋ถํฐ ์จ ๊ฒ ์๋๊ฑฐ๋, window ๋ฐ์์ ์จ ๊ฒฝ์ฐ
relatedTarget
์null
๊ฐ์ ๊ฐ์ง๋ค.
relatedTarget
์ ์ฌ์ฉํ๋ ์ฝ๋์์null
์ผ ๊ฒฝ์ฐ์ ๋๋นํด ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
์ถ์ฒ: https://ko.javascript.info/mousemove-mouseover-mouseout-mouseenter-mouseleave
mousemove
์ด๋ฒคํธ๋ ๋ง์ฐ์ค๊ฐ ์ด๋ํ ๋ ํธ๋ฆฌ๊ฑฐ๋๋๋ฐ, ๋ง์ฐ์ค๊ฐ ์์ง์ด๋ ๋ชจ๋ ์๊ฐ(ํฝ์
์ ์์ง์ผ ๋๋ง๋ค) ๋ฐ์ํ์ง ์๋๋ค. ๋ธ๋ผ์ฐ์ ๋ Time to Time(์๊ฐํ๋ ๊ฒ๋ณด๋จ ์ฒ์ฒํ?), ๋ง์ฐ์ค์ ์์น๋ฅผ ์ฒดํฌํ๊ณ ๋ณํ๋ฅผ ์๋ฆฌ๋ฉด(์์์ฑ๋ฉด) ๊ทธ๋ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค. ์ด ๋ง์, ๋ง์ฐ์ค๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์์ง์ผ ๋ ๋ช๊ฐ์ DOM ์์๋ ๊ฑด๋๋ฐ์ด์ง(skip) ์ ์๋ค๋ ๊ฒ์ด๋ค. (์ฅ์ : ๋ชจ๋ ์์๋ง๋ค ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ ์ข์)
- ๋ง์ฐ์ค๊ฐ window ๋ฐ์์ ๋น ๋ฅด๊ฒ ์์ ์์ชฝ์ผ๋ก ์ด๋ํ๋ฉด
relatedTarget
์ดbody
๊ฐ ์๋๋ผnull
์ด ๋ ์ ์๋ค.
โน๏ธ
mouseover
์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด,mouseout
๋ ๋ฐ๋์ ์ผ์ด๋๋ค.๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ ์ด๋ค ์์ ์๋ก ๋ค์ด๊ฐ
mouseover
์ด ๋ฐ์ํ๋ค๋ฉด ์ด์ ์ ์๋ ๋ ๋ ์์์ ๋ฐ๋์mouseout
์ด ๋ฐ์
mouseover
์ mouseout
์ ์์ ์์๋ก ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ ๋์ํ๋ค๊ณ STEP 22์์ ํ์ตํ๋ค. ์์ ์ฝ๋๋ฅผ ํตํด ๋ ์์ธํ ์์๋ณด์.
id๊ฐ #out_div
์ธ div
์์ id๊ฐ #in_div
์ธ div
๊ฐ ๋ค์ด์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. mouseover
๊ณผ mouseout
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ #out_div
์๋ง ์ ์ฉํ๋ค. ํด๋น ์ด๋ฒคํธ๊ฐ ํธ๋ค๋ฌ๊ฐ ๋ฐ์ธ๋ฉ๋ ์์์ ๋ฐ์ํ ๋ ๋ฐ์ํ ์ด๋ฒคํธ ํ์
๊ณผ event.target
์์์ id๊ฐ ํ๋จ์ (๋์ ๋๋ฉฐ) ์ถ๋ ฅ๋๋ค.
<!-- html -->
<div id="out_div">
<div id="in_div"></div>
</div>
<input id="clearbtn" type="button" value="clear" />
<div id="result"></div>
/* css */
#out_div {
background: rgb(153, 113, 185);
height: 100px;
width: 100px;
display: table-cell;
text-align: center;
vertical-align: middle;
}
#in_div {
background: rgb(255, 255, 141);
height: 50px;
width: 50px;
display: inline-block;
}
// js
const div = document.getElementById('out_div');
const clearbtn = document.getElementById('clearbtn');
const result = document.getElementById('result');
div.addEventListener('mouseover', (event) => {
result.innerHTML += `<div>${event.type} ${event.target.id}</div>`;
});
div.addEventListener('mouseout', (event) => {
result.innerHTML += `<div>${event.type} ${event.target.id}</div>`;
});
clearbtn.addEventListener('click', (event) => {
result.innerHTML = '';
count = 0;
});
๊ฒฐ๊ณผ:
#out_div
์์ #in_div
๋ก ๋ง์ฐ์ค๋ฅผ ์ด๋ํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
mouseout out_div
mouseover in_div
#out_div
์๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๋๋ฐ ์ #in_div
์์์์๋ mouseover
์ ๋ํ ํธ๋ค๋ฌ๊ฐ ๋์ํ ๊น?
์ด๋ mouseover
, mouseout
์ด๋ฒคํธ์ ๊ฒฝ์ฐ ๋ถ๋ชจ์ ํ ๋น๋ ์ด๋ฒคํธํธ๋ค๋ฌ๊ฐ ์์์์๋ ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ํํ ๋งํ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง๋๊ธฐ ๋๋ฌธ์ด๋ค.
#out_div
์์ #in_div
๋ก ๋ง์ฐ์ค๋ฅผ ์ด๋ํ ๋ #out_div
์ ์์์์์ธ #in_div
์์ mouseover
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. ๋ค๋ง ํด๋น ์์ ์์์์ ๋ฐ์ํ mouseover
์ด๋ฒคํธ์ ๋ํ ์ด๋ฒคํธํธ๋ค๋ฌ๊ฐ ์์ ๋ฟ์ด๋ค. ๊ทธ๋ฐ๋ฐ mouseover
, mouseout
์ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง ๋๊ธฐ ๋๋ฌธ์(๋ฒ๋ธ๋ง์ STEP 13 ๋ฌธ์ ์ฐธ๊ณ ) #in_div
์์ ๋ฐ์ํ mouseover
์ด๋ฒคํธ ์์ฒด๊ฐ ๋ถ๋ชจ ์์๋ก ๋ฒ๋ธ๋ง๋์ด #out_div
์ ํ ๋น๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค. ์ด๋ ์ด๋ฒคํธ๊ฐ ์ค์ ๋ก ๋ฐ์ํ ๊ณณ์ #in_div
์ด๊ธฐ ๋๋ฌธ์ event.target.id
๋ก๋ #in_div
๊ฐ ์ถ๋ ฅ๋๋ค.
html, css ์ฝ๋๋ ์์ mouseover
, mouseout
์์ ์ฝ๋์ ๊ฐ๋ค.
const div = document.getElementById('out_div');
const clearbtn = document.getElementById('clearbtn');
const result = document.getElementById('result');
div.addEventListener('mouseenter', (event) => {
result.innerHTML += `<div>${event.type} ${event.target.id}</div>`;
});
div.addEventListener('mouseleave', (event) => {
result.innerHTML += `<div>${event.type} ${event.target.id}</div>`;
});
clearbtn.addEventListener('click', (event) => {
result.innerHTML = '';
count = 0;
});
๊ฒฐ๊ณผ:
mouseover
, mouseout
์ ๋ฌ๋ฆฌ mouseenter
, mouseleave
๋ ์ด๋ฒคํธ๊ฐ ๋ฒ๋ธ๋ง๋์ง ์๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋ #out_div
์ ๋ง์ฐ์ค๊ฐ ๋ค์ด๊ฐ๋ค ๋์ฌ ๋๋ง ํธ๋ค๋ฌ๊ฐ ๋์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. #out_div
์์ ํ์์์์ธ #in_div
๋ก ๋ค๋ฝ๋ ๋ฝํด๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ ํ ๋ฐ์์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
mouseover, mouseout ์์
์ฝ๋์ ๊ฐ์ด ๋ถ๋ชจ ์์ ์์ ์์ ์์๊ฐ ๊ฒน์ณ์ ธ ์๋ ์ํฉ์์, ๋ถ๋ชจ ์์๋ฅผ ๋ ๋๋ฉด ํน์ ์ ๋๋ฉ์ด์
์ด ์คํ๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
#out_div
(๋ถ๋ชจ) ์์ #in_div
(์์)์์๋ก ๋ง์ฐ์ค๊ฐ ์ด๋ํ ๋๋ ๋ถ๋ชจ ์์์ ๋ ์์ชฝ์ผ๋ก ๋ค์ด๊ฐ ๊ฒ์ด์ง ๋ถ๋ชจ ์์๋ฅผ ์์ ํ ๋ ๋ ๊ฒ์ด ์๋๋ค. ์ด๋ฅผ ๋ฐ์ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์๋ ๋ฐฉ๋ฒ๋ค์ ์ด์ฉํ๋ค.
relatedTarget
๊ฐ ์ฒดํฌ
ํธ์์ #out_div
-> #parent
, #input_div
-> #child
๋ก ๋ณ๊ฒฝ
<div id="parent">
<div id="child"></div>
</div>
<input id="clearbtn" type="button" value="clear" />
<div id="result"></div>
#parent {
background: rgb(153, 113, 185);
height: 100px;
width: 100px;
display: table-cell;
text-align: center;
vertical-align: middle;
}
#child {
background: rgb(255, 255, 141);
height: 50px;
width: 50px;
display: inline-block;
}
#red_box {
background: rgb(255, 0, 0);
height: 100px;
width: 100px;
text-align: center;
}
const div = document.getElementById('parent');
const clearbtn = document.getElementById('clearbtn');
const result = document.getElementById('result');
// id๊ฐ parent์ธ div๋ฅผ ๋ ๋๋ฉด(parent ๋ด๋ถ์ child๋ก ๊ฐ๋ ๊ฒ์ ๋ ๋๋ ๊ฒ ์๋) ํ๋จ์ ๋นจ๊ฐ ๋ฐ์ค๋ฅผ ๋์ฐ๊ณ ์ถ๋ค๊ณ ํด๋ณด์.
div.addEventListener('mouseout', (event) => {
if (event.target.id == 'parent' && event.relatedTarget.id !== 'child') {
// parent๋ฅผ ๋ ๋ ๊ฒ์ด๋ฉด์ child๋ก ๋ค์ด๊ฐ ๊ฒฝ์ฐ๋ ์ ์ธํด์ผํ๋ค.
result.innerHTML += `<div id='red_box'></div>`;
}
});
clearbtn.addEventListener('click', (event) => {
result.innerHTML = '';
count = 0;
});
๊ฒฐ๊ณผ:
mouseover
,mouseout
๋์mouseenter
,mouseleave
์ฌ์ฉ
mouseenter
, mouseleave
์ด๋ฒคํธ๋ ์ ์ฉํ์ง๋ง ๋ฒ๋ธ๋ง๋์ง ์์์ ์ด ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ์ ์ด๋ฒคํธ ์์์ ํ์ฉํ ์๊ฐ ์๋ค.(์ด๋ฒคํธ ์์์ STEP 19 ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ )
ํ
์ด๋ธ์ ์
๋ค์ ๋ํด ๋ง์ฐ์ค enter/leave ๋์์ ํธ๋ค๋งํ๊ณ ์ถ๋ค๊ณ ํด๋ณด์. (์ฌ์ง์ด ๊ทธ ์
๋ค์ ์๋ฐฑ๊ฐ๊ฐ ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์) ๋ง์ฝ <table>
์ ํธ๋ค๋ฌ๊ฐ ์ง์ ๋์ด์์ ๋, mouseenter/leave
์ด๋ฒคํธ๋ฅผ ์ธ ๊ฒฝ์ฐ ์ด๋ ๋ฒ๋ธ๋ง๋์ง ์๋๋ค. <td>
์ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ ํธ๋ค๋ฌ๋ <table>
์ ์ฒด์ ๋ํ enter/leave๋ง ์ก์๋ธ๋ค. mouseenter/leave
๋์ mouseover/out
์ ์ฌ์ฉํ์ฌ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํด๋ณด์.
๋ค์์ ๋ฒ๋ธ๋ง์ด ๋๋ mouseover/out
์ ์ด์ฉํ์ฌ ์์์ ๋ง์ฐ์ค๋ฅผ ๋์์ ๋ ์์๊ฐ ํ์ด๋ผ์ดํธ ๋๊ฒํ ๊ฐ๋จํ ์์ ์ด๋ค.
<table id="table">
<tr>
<th colspan="3"><em>Mandal-Art</em> 2021 Plan</th>
</tr>
<tr>
<td class="nw"><strong>๊ฑด๊ฐ</strong> <br />๋ฌผ 2L ๋ง์๊ธฐ</td>
<td class="n"><strong>์๊ธฐ๊ณ๋ฐ</strong> <br />ํ ์ต ์ ์ ์ทจ๋</td>
<td class="ne"><strong>์คํธ๋ ์ค ๊ด๋ฆฌ</strong> <br />๋ช
์</td>
</tr>
<tr>
<td class="w"><strong>๊ณต๋ถ</strong> <br />์๋ฐ์คํฌ๋ฆฝํธ</td>
<td class="c"><strong>Wol-dan</strong> <br />Better me!</td>
<td class="e"><strong>์ฌํ
ํฌ</strong> <br />์ฑํ
ํฌ ํ๊ธฐ</td>
</tr>
<tr>
<td class="sw"><strong>์ต๊ด</strong> <br />7์ ๊ธฐ์</td>
<td class="s"><strong>๋คํธ์ํน</strong> <br />์ฐ๋ฝ</td>
<td class="se"><strong>์ทจ๋ฏธ</strong> <br />๋
ธ๋๋ฃ๊ธฐ</td>
</tr>
</table>
<textarea id="text"></textarea>
<input type="button" onclick="text.value=''" value="Clear" />
/* index4.html, step23_4.js ๊ด๋ จ */
#text {
display: block;
height: 100px;
width: 456px;
}
#table th {
text-align: center;
font-weight: bold;
}
#table td {
width: 150px;
white-space: nowrap;
text-align: center;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 12px;
cursor: pointer;
}
#table .nw {
background: rgb(255, 0, 0);
color: #fff;
}
#table .n {
background: rgb(255, 123, 0);
color: #fff;
}
#table .ne {
background: rgb(230, 208, 14);
color: #fff;
}
#table .w {
background: rgb(29, 231, 11);
color: #fff;
}
#table .c {
background: rgb(197, 197, 197);
color: #fff;
}
#table .e {
background: #09f;
color: #fff;
}
#table .sw {
background: rgb(17, 0, 255);
color: #fff;
}
#table .s {
background: rgb(153, 0, 255);
color: #fff;
}
#table .se {
background: rgb(255, 0, 170);
color: #fff;
}
#table .highlight {
background: rgb(58, 58, 58);
}
table.onmouseover = function (event) {
let target = event.target;
target.classList.toggle('highlight');
// target.style.background = 'pink';
text.value += `over -> ${target.tagName}\n`;
text.scrollTop = text.scrollHeight;
// console.log(text.scrollTop);
// console.log(text.scrollHeight);
};
table.onmouseout = function (event) {
let target = event.target;
target.classList.toggle('highlight');
// target.style.background = '';
text.value += `out <- ${target.tagName}\n`;
text.scrollTop = text.scrollHeight;
};
๊ฒฐ๊ณผ:
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด <td>
๋ด์ <strong>
๊ฐ์ ์์๋ ์ ๋ชฉ์ <em>
๊ณผ ๊ฐ์ ์์๋ ๋ง์ฐ์ค๋ฅผ ๋๋ฉด ํ์ด๋ผ์ดํ
๋๋ค. ์ด๋ค์ ๊ฑธ๋ฌ๋ด๊ณ ํ์ ์
๋ง ํ์ด๋ผ์ดํ
ํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์ฌ ์ด์ธ์ ๊ฒฝ์ฐ๋ค์ ์ ์ธ์์ผ์ผ ํ๋ค.
mouseover
๋ฐ์์, ์ฌ์ ํ ํ์ฌ<td>
์์ ๋ง์ฐ์ค๊ฐ ์๋ค๋ฉด ๋ฌด์mouseout
๋ฐ์์, ํ์ฌ<td>
๋ฅผ ๋ ๋๊ฒ ์๋๋ผ๋ฉด ๋ฌด์
๐ก ์๋ก ์๊ฒ๋ ์
js์ฝ๋์์ table ์ ์ ๋ ฅํ๋ฉด
<table>
์์๊ฐ, ํน์ id
๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ์์๊ฐ ์ถ๋ ฅ๋๋ค. ์์ ์ฝ๋์ js ์ฝ๋์table
,text
๋ฅผ ๋ณด๋ฉด ์ ์ ์์
Element.closest
: ์๋ฆฌ๋จผํธ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์ ๋ฐํ(์๋ค๋ฉด null๊ฐ ๋ฐํ) (์๊ธฐ์์ ๋ ํฌํจ)
Node.contains
: ์ธ์๊ฐ ์ฃผ์ด์ง ๋ ธ๋์ ์์์ธ์ง ์๋์ง Boolean๊ฐ ๋ฆฌํด
Element.scrollTop
ํ๋กํผํฐ: ์์์ ๋ด์ฉ์ด ์์ง์ ์ผ๋ก ์คํฌ๋กค๋ ํฝ์ ๊ฐ์ ์๋ฏธํ๋ฉฐ ์ฝ์ ์๋, ์ง์ ํ ์๋ ์์.์์๋ฅผ ์คํฌ๋กคํ ์ ์๋ค๋ฉด
scrollTop
์0
์ผ ๊ฒ.์ฐธ๊ณ : Element.scrollTop, MDN
Element.scrollHeight
ํ๋กํผํฐ: read-only. overflow๋ก ์ธํด ํ๋ฉด์ ํ์๋์ง ์๋ ์ฝํ ์ธ ๋ฅผ ํฌํจํ์ฌ ์์์ ์ฝํ ์ธ ๋์ด๋ฅผ ์ธก์ ํ ๊ฐ์. padding์ ํฌํจํ๋ border, margin, ์ํ ์คํฌ๋กค๋ฐ๋ ํฌํจํ์ง ์์์ฐธ๊ณ : Element.scrollHeight, MDN
โ ์ฝ๋์
scrollTop = scrollHeight
์์ผ๋ก ์์ฑ๋์ด์๋๋ฐ ์ด๊ฒ ๋ง์ฐ์ค ์ด๋ฒคํธํธ๋ค๋ฌ๊ฐ ๋ฐ์ํ ๋๋ง๋ค textarea์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉฐ ์ซ์๊ฐ๊ธฐ ์ํด์ ์์ฑํ ๊ฒ์ด๋ ๊ฑด ์๊ฒ ๋ค. ๊ทผ๋ฐ ๊ฐ์ด ์ดํด๊ฐ ์๋จ... scrollTop์ scrollHeight๋ฅผ ๋์ ํ๋๋ฐ, ๋์ ์ถ๋ ฅํด๋ณด๋ฉด ๊ทธ ๊ฐ์ด ๋ค๋ฆ. scrollTop์ ์คํฌ๋กค๋ ์ ๋(๊ทธ๋๊น ์์์ top๋ถํฐ ์คํฌ๋กค๋์ ์๋ณด์ด๋ ๋ถ๋ถ๋ ํฌํจํ๋ฉด์ ๋ณด์ด๊ธฐ ์์ํ๋ ๋ฑ ๊ทธ ๋ถ๋ถ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ)์ด๊ณ scrollHeight์ ์์์ ์ฝํ ์ธ ์ ๋์ด(์คํฌ๋กค๋ก ์๋ณด์ด๋ ๋ถ๋ถ ๋ชจ๋ ํฌํจ)์ธ ๋ฏ ํ๋ฐ ํท๊ฐ๋ฆฐ๋ค
html, css ์ฝ๋๋ ์์ ์์ ์ฝ๋์ ๊ฐ๋ค.
โ TODO ์ฝ๋ ๋ ์ดํด ํ์
let currentElem = null;
table.onmouseover = function (event) {
// ์๋ก์ด ์์์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ๋ง์ฐ์ค๋ ํญ์ ์ด์ ๊ฒ์ ๋ ๋๋ค.
// (๋ง์ฝ currentElem์ด ์ง์ ๋๋ค๋ฉด, <td>๋ฅผ ๋ ๋ ๊ฒ์ ์๋๋ค.)
// mouseover์ด ๊ฐ์? <td>์์ ์๋ ๊ฒ์ด๋ผ๋ ๊ฑฐ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ฌด์
if (currentElem) return;
// ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์๋ฆฌ๋จผํธ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์กฐ์์ธ td ๋ฐํ(์๋ค๋ฉด null๊ฐ ๋ฐํ)
let target = event.target.closest('td');
// <td> ์์ผ๋ก ์ด๋ํ๊ฒ ์๋๋ผ๋ฉด ๋ฌด์(td๋ td ๋ ๋ด๋ถ๋ก ์ด๋ํ ๊ฒ์ด ์๋๋ฉด ๋ฌด์ํ๋ ๊ฒ์)
if (!target) return;
// <td>๋ก ์ด๋ํ์ผ๋, ํ
์ด๋ธ ๋ฐ์ <td>์ธ ๊ฒฝ์ฐ(์ค์ฒฉ ํ
์ด๋ธ์์ ๊ฐ๋ฅํจ) ๋ฌด์ // td๊ฐ table์ ์์์ด ์๋๋ผ๋ ๊ฒ -> ์ค์ฒฉํ
์ด๋ธ์ผ ์ ์๋ค๋ ๊ฒ
if (!table.contains(target)) return;
// ๋๋์ด ์๋ก์ด <td>๋ก ๋ค์ด์๋ค๋๊ฒ ์ฆ๋ช
๋์!
currentElem = target;
onEnter(currentElem); // ํด๋น td ํ์ด๋ผ์ดํ
};
table.onmouseout = function (event) {
// (<td>๋ฐ์ ์๋ค๋ฉด ๋ฌด์ ex) tr->tr)
if (!currentElem) return;
// mouseout์ ๋ ๋๊ฑฐ๋๊น ํฅํ๋ ๊ณณ์ relatedTarget ํ๋กํผํฐ ์์ ์์ ๊ฒ // ๋ง์ฐ์ค ๋ ๋์ ์ด๋๋ก ํฅํ๋๊ฐ?
let relatedTarget = event.relatedTarget;
while (relatedTarget) {
// ๋ถ๋ชจ ์ฒดํฌ - ์ฌ์ ํ currentElem์ ์๋ ๊ฑฐ๋ผ๋ฉด ๋ฌด์ํ๊ธฐ ์ํด // td->๊ฐ์ td๋ฉด ๋ฌด์ํด์ผ๋๋๊น
if (relatedTarget == currentElem) return;
relatedTarget = relatedTarget.parentNode;
}
// ํ์ฌ <td>๋ฅผ ์์ ํ ๋ ๋์จ ๊ฒ์ด really ํ์ธ๋ ๊ฒ!
onLeave(currentElem);
currentElem = null;
};
function onEnter(elem) {
elem.style.background = 'gray';
// textarea์ ์ถ๋ ฅํ๋ ๋ถ๋ถ
text.value += `over -> ${elem.tagName}.${elem.className}\n`;
//text.scrollTop = text.scrollHeight;
text.scrollTop = 1e6;
}
function onLeave(elem) {
elem.style.background = '';
// textarea์ ์ถ๋ ฅํ๋ ๋ถ๋ถ
text.value += `out <- ${elem.tagName}.${elem.className}\n`;
text.scrollTop = 1e6;
}
๊ฒฐ๊ณผ:
-
[Javascript] ๋ง์ฐ์ค ์ด๋ฒคํธ(event) ์ข ๋ฅ https://hianna.tistory.com/492
-
textarea ์๋ ๋์ด๊ฐ https://velog.io/@imim/textarea-%EC%9E%90%EB%8F%99-%EB%86%92%EC%9D%B4%EA%B0%92
- @pul8219
- @eyabc ## mouseover / mouseout ~
- @khw970421
- @JeongShin