jQuery UI์์ ์ ๊ณตํ๋ datepicker ์์ ฏ์ input์ ํด๋ฆญํ๋ฉด ๋ฌ๋ ฅ์ด ์ด๋ฆฌ๊ณ , ๋ ์ง ์ ํ or ๋ฌ๋ ฅ ๋ฐ๊นฅ ์์ญ์ ํด๋ฆญํ๋ฉด ๋ฌ๋ ฅ์ด ๋ซํ๋ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก html์์๋ฅผ ์ถ๊ฐํด์ ๋ฌ๋ ฅ์ด ์ด๋ ธ์ ๋ ์๋์ ๋ถํฌ๋ช
๋ฐฐ๊ฒฝ(dim)์ ๊น์์ ๋ชจ๋ฌ์ฐฝ์ฒ๋ผ ๋ณด์ด๋ ํจ๊ณผ๋ฅผ ๋ง๋ค์ด ๋ณผ๊ฒ์.
datepicker ์ฌ์ฉ๋ฒ์ ๋งค์ฐ ์ฌํํ๋ฏ๋ก ์ค์น์ ์ฌ์ฉ๋ฒ์ ๊ฑด๋๋ฐ๊ณ ๋์์ธ ์ปค์คํ
๋ง ํฌ์คํ
ํด ๋ณด๊ฒ ์ต๋๋ค.
์~์! ๐ค
<body>
<div id="wrap">input ์์ญ</div>
<div id="ui-datepicker-div">๋ฌ๋ ฅ ์์ญ</div>
</body>
datepicker ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ๋ฉด div#ui-datepicker-div
๊ฐ ์๋์ผ๋ก body ๊ฐ์ฅ ํ๋จ์ ์์ฑ๋ฉ๋๋ค.
๋ฌ๋ ฅ์ ๋ชจ๋ฌ์ฐฝ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ฐฐ๊ฒฝ์ ์ถ๊ฐํ๋ ค๋ฉด div#ui-datepicker-div
์์ ํ์ ํ๊ทธ๋ก div๋ฅผ ์ถ๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค์.
// datapicker ๊ธฐ๋ณธ ์ธํ
datepickerInput.datepicker({
...
}
});
// datepicker ์ปค์คํ
์์
const calendar = document.querySelector('#ui-datepicker-div');
// ๋ฐฐ๊ฒฝ ์์ญ ํ๊ทธ ์์ฑ ๋ฐ ๋ฌ๋ ฅ์ ์ด์ ํ์ ์์น๋ก ์ถ๊ฐ
const dim = document.createElement('div');
dim.classList.add('datepicker-layer');
calendar.before(dim);
<body>
<div id="wrap">input ์์ญ</div>
<div class="datepicker-layer">๐ ์ถ๊ฐ๋ ๋ฐฐ๊ฒฝ ๋ ์ด์ด ์์ญ ๐</div>
<div id="ui-datepicker-div">๋ฌ๋ ฅ ์์ญ</div>
</body>
.datepicker-layer
๊ฐ ํ๋ฉด ์ ์ฒด๋ฅผ ์ฐจ์งํ๋๋ก ์คํ์ผ๋งํ๊ณ display: none
์ฒ๋ฆฌํฉ๋๋ค. ๋ ์ง ์ ํ ์ ์๋ ๋ณด์ด์ง ์๋ ๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด๋๊น์!
.datepicker-layer {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 100;
display: none;
}
์ด์ ์ธํ๋ฐ์ค๋ฅผ ํด๋ฆญํด์ ๋ฌ๋ ฅ์ด ์ด๋ฆด ๋ ๋ฐฐ๊ฒฝ ๋ ์ด์ด๊ฐ ๋ณด์ด๊ฒ ์ค์ ํด๋ณผ๊ฒ์. ๋ฐฐ๊ฒฝ ๋ ์ด์ด์ display๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฒ ์ต๋๋ค.
// ๋ฐฐ๊ฒฝ ๋ ์ด์ด display ์ ์ด ํจ์
const layer = document.querySelector('.datepicker-layer');
function dimDisplay(display) {
layer.style.display = display;
}
//๋ฐฐ๊ฒฝ์์ญ show
datepickerInput.addEventListener('click', () => {
dimDisplay('block');
})
input์ ํด๋ฆญํ๋ฉด ๋ฐฐ๊ฒฝ ๋ ์ด์ด์ display: block
์ด ๋๋ ๊ฐ๋จํ ์ด๋ฒคํธ๋ฅผ ๋ฃ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฌด๋ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค ๐คฏ ์ฝ์์ ์ฐ์ด๋ด๋ ์๋ฌด ์ด๋ฒคํธ๊ฐ ๊ฐ์ง๋์ง ์์์..... ๋งํฌ์
๊ตฌ์กฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํด์ ์ด๋ฆฌ์ ๋ฆฌ ์์ ํด๋ด๋ ์ฌ์ ํ ๋ฐ์ ์๋ ๋.... ๐ญ
๊ทธ๋์ ์๊ฐํด ๋ธ ๋ฐฉ๋ฒ!
inputํ๊ทธ ์ด๋๊น ํด๋ฆญํ๋ฉด focus๊ฐ ๋์์์? click ์ด๋ฒคํธ ๋์ focus์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํด๋ด
๋๋ค.
datepickerInput.addEventListener('focus', () => {
dimDisplay('block');
})
์ง์ ๋ฐฐ๊ฒฝ์ด ์ ๋์ต๋๋ค! ๐ฅณ
์ด์์ผ๋ ์ด์ ๋ค์ ๋ซ์๋ด ์๋ค. ๋ชจ๋ฌ์ฐฝ(๋ฌ๋ ฅ)์ด ๋ซํ ๋ ๋ฐฐ๊ฒฝ ํ๋ฉด์ ์จ๊ธฐ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์ ๋๋ค.
datepicker์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์ต์
์ค onSelect๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ง๋ฅผ ์ ํํ์ ๋ ๋ฐฐ๊ฒฝ ๋ ์ด์ด๋ฅผ display: none
์ฒ๋ฆฌ ํ๊ฒ ์ต๋๋ค.
datepickerInput.datepicker({
...
onSelect: function () {
dimDisplay('none');
}
}
});
<body>
<div id="wrap">input ์์ญ</div>
<div class="datepicker-layer">๋ฐฐ๊ฒฝ ๋ ์ด์ด ์์ญ</div>
<div id="ui-datepicker-div">๋ฌ๋ ฅ ์์ญ</div>
</body>
ํ์ฌ ๋งํฌ์
์ด ์์ ๊ฐ์ด ๋งค์ฐ ๊ฐ๋จํ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋จ์ํ ๋ฐฐ๊ฒฝ ๋ ์ด์ด ์์ญ์ ํด๋ฆญํด์ ๋ชจ๋ฌ์ฐฝ(๋ฌ๋ ฅ)์ ๋ซ์ ๋ ๋ฐฐ๊ฒฝ ๋ ์ด์ด์ display: none
์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
const layer = document.querySelector('.datepicker-layer');
layer.addEventListener('click', function (e) {
dimDisplay('none');
});
์กฐ๊ธ ๋ ๋ณต์กํ ๋งํฌ์
์ผ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ๋ฌ๋ ฅ ์ด์ธ์ ๋ชจ๋ ์์ญ์ ํด๋ฆญ ์ ๋ฐฐ๊ฒฝ display: none
์ฒ๋ฆฌ ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ด
์๋ค.
window.addEventListener('click', function (e) {
if (e.target === layer) {
dimDisplay('none');
}
});
if (e.target === layer)
์กฐ๊ฑด์ ๋ฃ์ด ํด๋ฆญํ ์์ญ์ด layer์ผ๋๋ง ๋ฐฐ๊ฒฝ ๋ ์ด์ด์ display: none
์ฒ๋ฆฌํฉ๋๋ค. ์ด ์กฐ๊ฑด์ด ์๋ค๋ฉด ๋ ์ง๋ฅผ ์ ํํ๋ ์ธํ๋ window ์์ญ์ผ๋ก ์กํ๊ธฐ ๋๋ฌธ์, ์ธํ์ ํด๋ฆญํ ๋ ๋ฐฐ๊ฒฝ์ display๊ฐ none์ด ๋์ด ๋ฐฐ๊ฒฝ์ด ๋ณด์ด์ง ์์ต๋๋ค.