๐ ๋ชจ๋ฌ ํ์
๋ด ๋์ ํ
์ด๋ธ UI ์ ๋ ฌ ๋ฌธ์ ํด๊ฒฐ
1. ๋ฌธ์ ์ํฉ (Problem)
- ๋ชจ๋ฌ ํ์
๋ด๋ถ์์ div ๊ธฐ๋ฐ ํ
์ด๋ธ UI ๊ตฌํ
- .div_th (ํค๋ ์์ญ) ๋์ด๊ฐ ์๋ก ๋ฌ๋ผ UI๊ฐ ๊นจ์ง
- .div_td ๋ด์ฉ ๊ธธ์ด์ ๋ฐ๋ผ ์ค๋ฐ๊ฟ์ด ๋น์ ์์ ์ผ๋ก ๋์
<div class="row multi">
<div class="cell_div">
<div class="div_th">์ด๋ฆ</div>
<div class="div_td"></div>
</div>
<div class="cell_div">
<div class="div_th">์ข
๋ฅ</div>
<div class="div_td"></div>
</div>
</div>
2. ์์ธ ๋ถ์ (Root Cause)
๐น 1) ๋์ด ๋ถ์ผ์น
- ๊ฐ .div_th๋ ์ฝํ
์ธ ๊ธธ์ด์ ๋ฐ๋ผ height๊ฐ ์๋ ๊ฒฐ์ ๋จ
- ๋์ผ row ๋ด์์๋ ๋์ด๊ฐ ๋ค๋ฅด๊ฒ ๋ ๋๋ง๋จ
๐น 2) ๋์ด ์ธก์ ์คํจ (0 ๋ฌธ์ )
- ํ์
์ด display: none ์ํ์์ ์คํ
- offsetHeight = 0 ๋ฐ์
๐น 3) ์ค๋ฐ๊ฟ ๋ฌธ์
- ๊ธด ํ
์คํธ ๋๋ ๊ณต๋ฐฑ ์๋ ๋ฌธ์์ด → overflow ๋ฐ์
- ๊ธฐ๋ณธ CSS๋ก๋ ๊ฐ์ ์ค๋ฐ๊ฟ์ด ์ ํ๋จ
3. ํด๊ฒฐ ๋ฐฉ๋ฒ (Solution)
โ
3-1. ํ์
๋ ๋๋ง ์ดํ ๋์ด ๋๊ธฐํ
- Ajax → ๋ฐ์ดํฐ ์ฝ์
→ ํ์
open ์ดํ ์คํ
- setTimeout์ผ๋ก ๋ ๋๋ง ํ์ด๋ฐ ํ๋ณด
var searchSuc = function(data){
if(data.result == "SUCCESS"){
detailDataInser(data.detail);
fn_open_popup('detail_popup');
setTimeout(function() {
var rows = document.querySelectorAll('.row.multi');
for (var i = 0; i < rows.length; i++) {
var ths = rows[i].querySelectorAll('.cell_div .div_th');
if (ths.length === 2) {
// ์ด๊ธฐํ
for (var j = 0; j < ths.length; j++) {
ths[j].style.height = 'auto';
}
// ๋์ด ๋น๊ต
var h1 = ths[0].offsetHeight;
var h2 = ths[1].offsetHeight;
var max = (h1 > h2) ? h1 : h2;
// ์ ์ฉ
for (var j = 0; j < ths.length; j++) {
ths[j].style.height = max + 'px';
}
}
}
}, 50);
}
};
โ
3-2. ์ธ์ ์์๋ผ๋ฆฌ๋ง ๋์ด ๋น๊ต
- ์ ์ฒด๊ฐ ์๋๋ผ ๊ฐ์ row ๋ด 2๊ฐ ์์๋ง ๋น๊ต
- UI ์์ฐ์ค๋ฌ์ ์ ์ง
โ
3-3. ํ
์คํธ ์ค๋ฐ๊ฟ ์ฒ๋ฆฌ
.div_td {
white-space: normal;
word-break: break-word;
}
4. ํต์ฌ ๊ฐ๋
์ ๋ฆฌ (Key Insights)
๐น DOM ๋ ๋๋ง ํ์ด๋ฐ
- display: none ์ํ → offsetHeight = 0
- ํด๊ฒฐ: ๋ ๋๋ง ์ดํ ์คํ (setTimeout, requestAnimationFrame)
๐น ๋์ด ๊ณ์ฐ ๋ฐฉ์
์์ฑํน์ง
| offsetHeight |
padding + border ํฌํจ (์ผ๋ฐ์ ์ฌ์ฉ) |
| clientHeight |
border ์ ์ธ |
| getBoundingClientRect() |
๊ฐ์ฅ ์ ํ (์์ ํฌํจ) |
๐น ์ค๋ฐ๊ฟ ์ ๋ต
์์ฑํน์ง
| break-word |
์ผ๋ฐ์ ์ธ ์ค๋ฐ๊ฟ (๊ถ์ฅ) |
| break-all |
๊ฐ์ ์ค๋ฐ๊ฟ (๊ฐ๋
์ฑ ๋ฎ์) |
| keep-all |
ํ๊ธ ๋จ์ด ์ ์ง (์ค๋ฐ๊ฟ ์ต์ ) |
5. ๊ฐ์ ํจ๊ณผ (Result)
- โ
UI ์ ๋ ฌ ์ผ๊ด์ฑ ํ๋ณด
- โ
๋ค์ํ ๋ฐ์ดํฐ ๊ธธ์ด ๋์ ๊ฐ๋ฅ
- โ
๋ชจ๋ฌ ๊ธฐ๋ฐ ๋์ ๋ ๋๋ง ์์ ์ฑ ํ๋ณด
- โ
์ฌ์ฉ์ ๊ฐ๋
์ฑ ๊ฐ์
6. ํ ์ค ์์ฝ (Resume Point)
๋ชจ๋ฌ ํ์
๋ด ๋์ ๋ฐ์ดํฐ ๋ ๋๋ง ์ ๋ฐ์ํ๋ UI ์ ๋ ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ ๋๋ง ํ์ด๋ฐ ์ ์ด์ DOM ๋์ด ๋๊ธฐํ ๋ก์ง์ ๊ตฌํํ์ฌ ์ผ๊ด๋ ๋ ์ด์์๊ณผ ๊ฐ๋
์ฑ์ ํ๋ณดํจ.