셀렉 박스를 사용하다보면
요구사항에 따라 기본 셀렉박스를 쓰면될거같은데
디자인의 통일성을 위해서 커스텀하게 사용하기를 원한다
이럴때 예전에는 justselect 라이브러리를 사용해서 쭉 써오다가
여기에서 더욱더 커스텀하게 사용하기를 원했다
그래서 라이브러리중 많은 부분을 뜯어 고쳤다
https://www.jqueryscript.net/form/dropdown-replacement-just-select.html
Bare-bones Select Dropdown Replacement - jQuery justselect
An extremely simple jQuery select replacement plugin that converts the native select dropdown into an easy to style HTML list while preserving the native select methods.
www.jqueryscript.net
다운받아서 min.js 파일을 열어보면 이런 코드로 짜여있다.
$(document).ready(function () {
$(".justselect").each(function () {
$(this).wrap('<div class="justselect-wrapper">');
var e = document.createElement("ul");
e.className = "justselect-list";
var t = document.createElement("div");
t.className = "justselect-title"; var s = $(this).parent(),
l = $(this).find($("option"));
for (s.append(t, e), i = 0; i < l.length; i++){
var c = document.createElement("li");
e.append(c), justselectLI_option = s.find($(".justselect-list li")),
justselectLI_option.eq(i).text(l.eq(i).text()),
l.eq(i).attr("selected") && (justselectLI_option.eq(i).addClass("selected"),
s.find($(".justselect-title")).text(justselectLI_option.eq(i).text())),
justselectLI_option.click(function () {
$(this).addClass("selected").siblings().removeAttr("class");
var e = $(this).index();
s.find($(".justselect-list")).fadeOut(),
$(".justselect-body-overlay").remove(),
l.eq(e).attr("selected", !0).siblings().removeAttr("selected"),
s.find($(".justselect-title")).text($(this).text())
})
} s.find($(".justselect-title")).click(function () {
s.find($(".justselect-list")).fadeToggle();
var e = document.createElement("div");
e.className = "justselect-body-overlay",
$("body").prepend(e),
$(".justselect-body-overlay").click(function () {
s.find($(".justselect-list")).fadeToggle(),
$(".justselect-body-overlay").remove()
})
})
})
});
개인적으로 별로 안좋아하는
createElement 를 남발하면서 짜여있는데
성능 측면으로는 효율적인지 아닌지는 잘모르겠지만
가독성 측에서는 읽기가 너무 불편해서 우선 이부분부터 수정했다.
그리고 커스텀하게 쓰기 위해서는 클래스명을 내맘대로 지정할 수 있어야 한다.
그리고 기본으로 적용되어서 커스텀하게 사용하지 못하는 부분은
입맛대로 원하는 대로 min.css 를 수정하면 된다.
수정한 결과물을 공유하면 이렇게 수정했다.
makeClassName 매개변수로 셀렉박스 별로 모양을 여러개 만들어서 돌려서 사용할 수 있도록 의도했다.
여기서 조금더 커스텀 하고싶다 한다면 매개변수를 추가하고 클래스를 직접 지정하면 된다.
tagetSelectId 매개변수는 셀렉박스 고유 아이디를 작성해서 하나의 페이지에 다양한 셀렉박스를 만들수 있다
function makeJustSelect(makeClassName, tagetSelectId) {
$(`#${tagetSelectId}`).each(function () {
// 가장 큰 요소 생성
$(this).wrap(`<div class="justselect-wrapper wrapper-${makeClassName}">`);
let s = $(this).parent();
l = $(this).find($("option"));
// 셀렉박스 제목이 될 부분 지정
let t = ``;
t = `<div class="justselect-title title-${makeClassName}"></div>`
$(`.wrapper-${makeClassName}`).append(t);
// 셀렉박스 ul 태그 생성
let e = ``;
e = `<ul class="justselect-list list-${makeClassName}"></ul>`
$(`.wrapper-${makeClassName}`).append(e);
// 셀렉박스 li 태그 생성
for (i = 0; i < l.length; i++){
let c = ``;
if (l.eq(i).attr("selected")) {
c = `<li class="justselect-cell cell-${makeClassName} selected">${l[i].text}</li>`;
$(`.title-${makeClassName}`).text(l.eq(i).text()); // 제목 텍스트 지정
} else {
c = `<li class="justselect-cell cell-${makeClassName}">${l[i].text}</li>`;
}
$(`.list-${makeClassName}`).append(c);
}
// 셀렉박스 오픈시
s.find($(`.title-${makeClassName}`)).click(function () {
let touchOverlay = $("body").find($(".justselect-body-overlay")).length; // z-index 꼬임방지
if (touchOverlay === 0) {
s.find($(`.list-${makeClassName}`)).fadeToggle();
let bigBox = ``;
bigBox = `<div class="justselect-body-overlay"></div>`
$("body").prepend(bigBox);
$(this).addClass("active"); // 클릭시 구분 클래스명 추가
} else {
$(this).removeClass("active");
s.find($(".justselect-list")).fadeToggle();
$(".justselect-body-overlay").remove();
}
$(".justselect-body-overlay").click(function () {
$(`.title-${makeClassName}`).removeClass("active");
s.find($(".justselect-list")).fadeToggle();
$(".justselect-body-overlay").remove();
})
})
// 항목클릭시
s.find($(`.cell-${makeClassName}`)).click(function () {
$(`.title-${makeClassName}`).removeClass("active");
$(this).addClass("selected").siblings().removeClass("selected");
var e = $(this).index();
s.find($(`.list-${makeClassName}`)).fadeOut();
$(".justselect-body-overlay").remove();
l.eq(e).attr("selected", !0).siblings().removeAttr("selected");
s.find($(`.title-${makeClassName}`)).text($(this).text());
})
})
}
HTML
selected 는 초기 셀렉박스 제목지정을 위해서 필수로 입력해야한다.
<select class="justselect" name="폼전송이름" id= "셀렉트아이디" >
<option value="값1" selected>값~!</option>
<option value="값2">값~@</option>
<option value="값3">값~#</option>
<option value="값4">값~$</option>
</select>
<script type="text/javascript" src="앞주소/js/justselect.min.js"></script>
makeJustSelect 함수의 매개변수는 구분할 임의의 문자로 지정해서 css를 정하는데 활용하면 된다.
<script>
makeJustSelect("클래스구분명", "셀렉트아이디");
</script>
상단의 코드로는 한페이지에 하나의 셀렉박스만 적용이 되어서
셀렉박스를 여러개를 생성해서 사용하기 위해서 고유 아이디로 값찾아서 조절하게끔 조금 수정했다
범용적인 것을 원한다면 아래의 코드를 사용하자!
function makeJustSelect(makeClassName, tagetSelectId) {
let tagetObject = $(`#${tagetSelectId}`)
/* 가장 큰 요소 생성 */
tagetObject.wrap(`<div class="justselect-wrapper wrapper-${makeClassName}" id="wrapper_${tagetSelectId}">`);
let tagetObject_parent = tagetObject.parent();
let tagetObject_option = tagetObject.find($("option"));
/* 셀렉박스 제목이 될 부분 지정 */
let makeTitle = ``;
makeTitle = `<div class="justselect-title title-${makeClassName}" id="title_${tagetSelectId}"></div>`
$(`#wrapper_${tagetSelectId}`).append(makeTitle);
/* 셀렉박스 ul 태그 생성 */
let makeList = ``;
makeList = `<ul class="justselect-list list-${makeClassName}" id="list_${tagetSelectId}"></ul>`
$(`#wrapper_${tagetSelectId}`).append(makeList);
/* 셀렉박스 li 태그 생성 */
for (i = 0; i < tagetObject_option.length; i++){
let makeCell = ``;
if (tagetObject_option.eq(i).attr("selected")) {
makeCell = `<li class="justselect-cell cell-${makeClassName} cell_${tagetSelectId} selected">${tagetObject_option[i].text}</li>`;
$(`#title_${tagetSelectId}`).text(tagetObject_option.eq(i).text()); /* 제목 텍스트 지정 */
} else {
makeCell = `<li class="justselect-cell cell-${makeClassName} cell_${tagetSelectId}">${tagetObject_option[i].text}</li>`;
}
$(`#list_${tagetSelectId}`).append(makeCell);
}
/* 셀렉박스 오픈시 */
tagetObject_parent.find($(`#title_${tagetSelectId}`)).click(function () {
let touchOverlay = $("body").find($(".justselect-body-overlay")).length; /* z-index 꼬임방지 */
if (touchOverlay === 0) {
tagetObject_parent.find($(`#list_${tagetSelectId}`)).fadeToggle();
let bigBox = ``;
bigBox = `<div class="justselect-body-overlay"></div>`
$("body").prepend(bigBox);
$(this).addClass("active"); /* 클릭시 구분 클래스명 추가 */
} else {
$(this).removeClass("active");
tagetObject_parent.find($(".justselect-list")).fadeToggle();
$(".justselect-body-overlay").remove();
}
$(".justselect-body-overlay").click(function () {
$(`#title_${tagetSelectId}`).removeClass("active");
tagetObject_parent.find($(".justselect-list")).fadeToggle();
$(".justselect-body-overlay").remove();
})
})
/* 항목클릭시 */
tagetObject_parent.find($(`.cell_${tagetSelectId}`)).click(function () {
$(".justselect-body-overlay").remove();
var cellIdx = $(this).index();
tagetObject_option.eq(cellIdx).attr("selected", !0).siblings().removeAttr("selected");
$(this).addClass("selected").siblings().removeClass("selected");
$(`#title_${tagetSelectId}`).removeClass("active");
tagetObject_parent.find($(`#title_${tagetSelectId}`)).text($(this).text());
tagetObject_parent.find($(`#list_${tagetSelectId}`)).fadeOut();
})
}
makeJustSelect("스타일클래스명", "구분고유아이디");
$('body').on('click', `#list_만들때고유아이디`, function (e) {
)}
css
.justselect-body-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:2}
.justselect{display:none}
.justselect-wrapper{position:relative; width:auto}
.justselect-title{ cursor:pointer; background-repeat:no-repeat;}
.justselect-list{position:absolute; width:100%;list-style:none;padding:0;
border:1px solid #ebebeb;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;
-webkit-box-shdow:0 0 10px rgba(0,0,0,.05);-moz-box-shadow:0 0 10px rgba(0,0,0,.05);box-shadow:0 0 10px rgba(0,0,0,.05);
display:none; z-index:3; overflow:hidden; margin:0;}
.justselect-list li {line-height:40px;cursor:pointer; padding:0 16px; background:white}
/* .justselect-list li.selected {background:#ebebeb} */
.justselect-list .active {display:block}