1. Select CSS Customizing
Select ํ๊ทธ์ ์ธํ์ ์ฃผ๋ก ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ ์ ํฉ๋๋ค.
๋ณด๋ค ์ํผ ํฌ๋กฌ(์ผ์ชฝ), IE(์ค๋ฅธ์ชฝ) ์ด ๋๊ฐ์ด ๋ณด์ด๋ฉด์๋ ๋ฏธ์ธ ํ๊ฒ ๋ค๋ฆ๋๋ค.
๊ณตํต์ ์ผ๋ก ๋ ๋ค ๊ทธ๋ฆฌ ์์๊ฒ ์๊ธฐ์ง ์์์ต๋๋ค.
๊ฐ ํ๋ก์ ํธ ๋ณ๋ก ์คํ์ผ์ ๋ง๊ฒ css๋ฅผ ํตํด ์ธํ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
์ฌ์ด์ฆ๋ ํฐํธ ์ปฌ๋ฌ ๋ฑ์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ์ง๋ง, ์ผ๋ถ ์ ํ์ ์ผ๋ก ํต์ ๋๊ธฐ ๋๋ฌธ์ (ํ์ดํ ์ด๋ฏธ์ง ๋ฑ)
์ฝ๊ฐ์ ํธ๋ฒ(?)์ ํตํ์ฌ ์ธํ์ ๋ณ๊ฒฝ ํ ์ ์์ต๋๋ค.
1-1. Select ๊ธฐ๋ณธ ํ์ดํ ์์ ๊ธฐ
<select name="fruits" class="select">
<option disabled selected>fruits ๐</option>
<option value="apple">apple</option>
<option value="orange">orange</option>
<option value="grape">grape</option>
<option value="melon">melon</option>
</select>
/* IE */
select::-ms-expand {
display: none;
}
.select {
-o-appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
appearance none์ ํตํด ํ์ดํ๋ฅผ ์์จ ์ ์์ต๋๋ค.
๋จ, IE๋ select::expand ๋ฅผ ์์ ์ผ ์ฌ๋ผ์ง๋๋ค.
1-2. select์ background ์ด๋ฏธ์ง ๋ฃ๊ธฐ
์ดํ select ์์ฒด์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด์ค๋๋ค.
/* IE */
{ ... }
.select {
{ ... }
width: 150px;
height: 35px;
background: url('https://freepikpsd.com/media/2019/10/down-arrow-icon-png-7-Transparent-Images.png') calc(100% - 5px) center no-repeat;
background-size: 20px;
padding: 5px 30px 5px 10px;
border-radius: 4px;
outline: 0 none;
}
.select option {
background: black;
color: #fff;
padding: 3px 0;
}
์์ ์์ค๋ฅผ ๋ณด๋ฉด option ์๋ background์ color๋ ์ปค์คํ ์ด ๊ฐ๋ฅํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ
1-3. select ์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฆฌํ๊ธฐ
๋จ์ํ ์ธํ๋ง ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ์์ ๋ฐฉ๋ฒ์ด ๋งํฌ์ ์ด ์ ์ผ ๊ฐ๋จํฉ๋๋ค.
ํ์ง๋ง ์ข ๋ ์ปค์คํฐ๋ง์ด์ง์ ๋ฒ์๋ฅผ ๋ํ๊ณ ์ถ๋ค๋ฉด ์์ด์ฝ๋ง ๋ฐ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, select์ focus์ ์์ด์ฝ์ ํ์ ์ํฌ ์ ์์ต๋๋ค.
๋ฌผ๋ก select๋ฅผ ํ๋ฒ ๊ฐ์ธ๊ณ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
<div class="selectBox">
<select name="fruits" class="select">
<option disabled selected>fruits ๐</option>
<option value="apple">apple</option>
<option value="orange">orange</option>
<option value="grape">grape</option>
<option value="melon">melon</option>
</select>
<span class="icoArrow"><img src="https://freepikpsd.com/media/2019/10/down-arrow-icon-png-7-Transparent-Images.png" alt=""></span>
</div>
.selectBox {
position: relative;
width: 150px;
height: 35px;
border-radius: 4px;
border: 2px solid lightcoral;
}
.selectBox .select {
width: inherit;
height: inherit;
background: transparent;
border: 0 none;
outline: 0 none;
padding: 0 5px;
position: relative;
z-index: 3; // select๊ฐ ์๋ก ์ฌ๋ผ์์ผ ํจ
}
.selectBox .select option {
background: lightcoral;
color: #fff;
padding: 3px 0;
font-size: 16px;
}
.selectBox .icoArrow {
position: absolute;
top: 0;
right: 0;
z-index: 1;
width: 35px;
height: inherit;
border-left: 2px solid lightcoral;
display: flex;
justify-content: center;
align-items: center;
}
.selectBox .icoArrow img {
width: 50%;
transition: .3s; // ๋ถ๋๋ฝ๊ฒ ํ์
}
.selectBox .select:focus + .icoArrow img {
transform: rotate(180deg);
}
๊ฒฐ๊ณผ
์ด ์ธ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๋ ๋ง์ ์กฐ์๊ณผ ์ ํ์ด ์๋ option์ ์ปค์คํฐ๋ง์ด์ง์ ๋ ์์ ๋กญ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด,
select ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ๋ง๋๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
css๋ถํฐ script ๊น์ง ์ง์ ๋ง๋ค์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์๋ ์์ต๋๋ค.
2. Select ์ง์ ๊ตฌ์ถ
<div class="selectBox2 ">
<button class="label">fruits ๐</button>
<ul class="optionList">
<li class="optionItem">apple</li>
<li class="optionItem">orange</li>
<li class="optionItem">grape</li>
<li class="optionItem">melon</li>
</ul>
</div>
.selectBox2 * { box-sizing: border-box; }
.selectBox2 {
position: relative;
width: 150px;
height: 35px;
border-radius: 4px;
border: 2px solid lightcoral;
background: url('https://freepikpsd.com/media/2019/10/down-arrow-icon-png-7-Transparent-Images.png') calc(100% - 7px) center no-repeat;
background-size: 20px;
cursor: pointer;
}
.selectBox2:after {
content: '';
display: block;
width: 2px;
height: 100%;
position: absolute;
top: 0;
right: 35px;
background: lightcoral;
}
.selectBox2 .label {
display: flex;
align-items: center;
width: inherit;
height: inherit;
border: 0 none;
outline: 0 none;
padding-left: 15px;
background: transparent;
cursor: pointer;
}
.selectBox2 .optionList {
position: absolute;
top: 28px;
left: 0;
width: 100%;
background: lightcoral;
color: #fff;
list-style-type: none;
padding: 0;
border-radius: 6px;
overflow: hidden;
max-height: 0;
transition: .3s ease-in;
}
.selectBox2.active .optionList {
max-height: 500px;
}
.selectBox2 .optionItem {
border-bottom: 1px dashed rgb(170, 72, 72);
padding: 5px 15px 5px;
transition: .1s;
}
.selectBox2 .optionItem:hover {
background: rgb(175, 93, 93);
}
.selectBox2 .optionItem:last-child {
border-bottom: 0 none;
}
// ์คํฌ๋กค ์ปค์คํ
.selectBox2 .optionList::-webkit-scrollbar {width: 6px;}
.selectBox2 .optionList::-webkit-scrollbar-track {background: transparent; }
.selectBox2 .optionList::-webkit-scrollbar-thumb {background: #303030; border-radius: 45px;}
.selectBox2 .optionList::-webkit-scrollbar-thumb:hover {background: #303030;}
์ด๋ ๊ฒ ํ๋ฉด ์์ ์ปค์คํ ํ select ํ๊ทธ์ ์ธํ์ด ๊ฑฐ์ ๊ฐ์์ง๋๋ค.
๊ทธ๋ฆฌ๊ณ select ์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ผ๋ง ๋จ์์ต๋๋ค.
* ๊ธฐ๋ฅ
1. ํด๋ฆญ์ ์ต์ ๋ชฉ๋ก์ด ์ด๋ฆผ
2. ํ๋ฒ ๋ ํด๋ฆญ์ ์ต์ ๋ชฉ๋ก์ด ๋ซํ
3. ์ต์ ํด๋ฆญ์ ์ต์ ์ ํ ์คํธ๊ฐ select ์์ผ๋ก ๋ค์ด๊ฐ๋ฉด์ ์ต์ ๋ชฉ๋ก์ด ๋ซํ
/* ํ์ดํ ํจ์ */
const label = document.querySelector('.label');
const options = document.querySelectorAll('.optionItem');
// ํด๋ฆญํ ์ต์
์ ํ
์คํธ๋ฅผ ๋ผ๋ฒจ ์์ ๋ฃ์
const handleSelect = (item) => {
label.parentNode.classList.remove('active');
label.innerHTML = item.textContent;
}
// ์ต์
ํด๋ฆญ์ ํด๋ฆญํ ์ต์
์ ๋๊น
options.forEach(option => {
option.addEventListener('click', () => handleSelect(option))
})
// ๋ผ๋ฒจ์ ํด๋ฆญ์ ์ต์
๋ชฉ๋ก์ด ์ด๋ฆผ/๋ซํ
label.addEventListener('click', () => {
if(label.parentNode.classList.contains('active')) {
label.parentNode.classList.remove('active');
} else {
label.parentNode.classList.add('active');
}
})
/* ์ผ๋ฐํจ์ */
const label = document.querySelector('.label');
const options = document.querySelectorAll('.optionItem');
// ํด๋ฆญํ ์ต์
์ ํ
์คํธ๋ฅผ ๋ผ๋ฒจ ์์ ๋ฃ์
const handleSelect = function(item) {
label.innerHTML = item.textContent;
label.parentNode.classList.remove('active');
}
// ์ต์
ํด๋ฆญ์ ํด๋ฆญํ ์ต์
์ ๋๊น
options.forEach(function(option){
option.addEventListener('click', function(){handleSelect(option)})
})
// ๋ผ๋ฒจ์ ํด๋ฆญ์ ์ต์
๋ชฉ๋ก์ด ์ด๋ฆผ/๋ซํ
label.addEventListener('click', function(){
if(label.parentNode.classList.contains('active')) {
label.parentNode.classList.remove('active');
} else {
label.parentNode.classList.add('active');
}
});
๊ฒฐ๊ณผ
์ปค์คํ ๋ ์ ๋ ํธ ๋ฐ์ค๊ฐ ๊ฐ์๋ฅผ ์ ์ ์๋ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ for๋ฌธ์ผ๋ก ๊ฐ๊ฐ ํ์์ ๊ฐ์ ์ฐพ์์ ๋ฐ๋ก ๊ธฐ๋ฅ์
๋ถ์ฌ์ค์ผํฉ๋๋ค! ์๋์ ์ฐธ๊ณ ์์ค๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
* ๋จ์ผ์ธ ๊ฒฝ์ฐ
* ๋ฉํฐ์ธ ๊ฒฝ์ฐ
'๊ฐ๋ฐ ๐พ > HTML,CSS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Node ๊ธฐ๋ฐ SASS ์ ๋ฌธํ๊ธฐ (0) | 2021.07.01 |
---|---|
CSS์์ ๋ณ์ ์ฌ์ฉํ๊ธฐ (0) | 2021.06.30 |
input search x ๋ฒํผ ์ญ์ ๋ฐ ํด๋ฆฌ์ด ๋ฒํผ ์ง์ ๋ง๋ค์ด ๋ฃ๊ธฐ (0) | 2021.06.15 |
๊ฐ์ด๋ฐ์ ์ข์ฐ๋ก ํผ์ณ์ง๊ฒ ํ๊ธฐ (0) | 2021.06.13 |
์ฒดํฌ๋ฐ์ค CSS ์ปค์คํ (0) | 2021.06.06 |