
DB와 연동해서 돌리려면 단순 ul li가 아니라, 폼태그 중에서 써야함(select, radio 등)
웹표준 준수 위한 폼태그 select UI 자바스크립트
화면에는 안 보이는데, 태그로는 존재하는 란


line-height는 패딩 때문임. 아래처럼 CSS 수정하기
#contact > ul > li{ padding-top: 2rem;}


<li class="col-md-2">
<div class="selectDiv bg-white border oveflow-hidden position-relative">
<p>지역선택<i class="xi-angle-down"></i></p>
<ul class="position-absolute">
<li>잠실</li>
<li>강남</li>
<li>정자</li>
<li>판교</li>
</ul>
</div>
</li>

CSS .js-selectDiv.on{ height: 150px; }
.js-selectDiv{ transition: 0.5s; }
.js-selectDiv.on{ height: 150px; }
div 클릭하면 addClass removeClass (+CSS)로 만들 예정!
<li class="col-md-2">
<div class="js-selectDiv bg-white border oveflow-hidden position-relative">
<p>지역선택<i class="xi-angle-down"></i></p>
<ul class="position-absolute">
<li>잠실</li>
<li>강남</li>
<li>정자</li>
<li>판교</li>
</ul>
</div>
</li>

div 클릭하면 addClass removeClass (+CSS)로 만들 예정!
<script>
document.querySelectorAll('form .js-selectDiv')[0]
// array로 잡힌다! [0] 잡은 애들 중에 첫번째
</script>

<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
// array로 잡힌다! [0] 잡은 애들 중에 첫번째
console.log(areaSelectEl, typeof areaSelectEl); // 콘솔창에서 확인하기
</script>

<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
areaSelectEl.addEventListener('click', function(e){
///// 클릭 시 일어날 일
})
</script>

<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
areaSelectEl.addEventListener('click', function(e){
console.log(e.target);
})
</script>

<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
areaSelectEl.addEventListener('click', function(e){
this.classList.toggle('on');
})
</script>

여기까지 코드
<style>
/* 자바스크립트 */
.js-selectDiv{ transition: 0.5s; height: 30px; }
.js-selectDiv.on{ height: 150px; }
</style>

<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
areaSelectEl.addEventListener('click', function(e){
this.classList.toggle('on');
})
// 쟤네중에 누가 될지 모르니 [0] [1] [2] 붙일 수 없다.
var areali = document.querySelectorAll('form .js-selectDiv li');
// 한마리 아니고 집합체라서 클릭 이벤트 바로 받을 수 없다! forEach 껴야 함
areali.forEach(function(el, index){
})
</script>

<script>
// 쟤네중에 누가 될지 모르니 [0] [1] [2] 붙일 수 없다.
var areali = document.querySelectorAll('form .js-selectDiv li');
// 한마리 아니고 집합체라서 클릭 이벤트 바로 받을 수 없다! forEach 껴야 함
areali.forEach(function(el, index){
el.addEventListener('click', function(){
})
})
</script>

+) this 값을 알아보기 위해 콘솔 로그 찍어보기

<script>
// 쟤네중에 누가 될지 모르니 [0] [1] [2] 붙일 수 없다.
var areali = document.querySelectorAll('form .js-selectDiv li');
// 한마리 아니고 집합체라서 클릭 이벤트 바로 받을 수 없다! forEach 껴야 함
areali.forEach(function(el, index){
el.addEventListener('click', function(){
var _thisText = this.innerHTML
document.querySelector('form .js-selectDiv p').innerHTML = _thisText;
// 지역선택란을 _thisText로 바꿔치기 할게
})
})
</script>
div 안의 내용을 읽을 때와 마찬가지로, div에 내용을 변경할 때도 innerHTML, innerText, textContent 속성을 사용할 수 있습니다.
innerHTML 속성에 HTML 문자열을 적용하면, html element가 div 태그 안에 들어가서 style이 적용된 문자열이 브라우저에 나타나는 것을 볼 수 있습니다. innerText와 textContent는 할당한 문자열을 그대로 텍스트 형태로 div안에 넣습니다.

< select >의 못생김이 싫어! hidden하고 예쁘게 내보낼거야!
HTML 3-1. < input type="hidden" >
<input type="hidden" name="area">
input의 value값이 폼태그에 전송 가능하도록 전환하기!
<script>
const areaSelectEl = document.querySelectorAll('form .js-selectDiv')[0]
const areainput = document.getElementsByName('area')[0]; // ★★★★
// console.log(areainput, typeof areainput); // 콘솔창에서 확인하기
areaSelectEl.addEventListener('click', function(e){
this.classList.toggle('on');
})
// 쟤네중에 누가 될지 모르니 [0] [1] [2] 붙일 수 없다.
var areali = document.querySelectorAll('form .js-selectDiv li');
// 한마리 아니고 집합체라서 클릭 이벤트 바로 받을 수 없다! forEach 껴야 함
areali.forEach(function(el, index){
el.addEventListener('click', function(){
var _thisText = this.innerHTML
document.querySelector('form .js-selectDiv p').innerHTML = _thisText;
// 지역선택란을 _thisText로 바꿔치기 할게
// input의 value값! 이제 폼태그에 전송하도록 컨버트 됨!
areainput.value = _thisText; // ★★★★
console.log(areainput.value); // ★★★★
})
})
</script>

아래 처럼 수정하기

① .on p i rotate 클릭 트랜스폼 180도
#contact .js-selectDiv.on p i{transform: rotate(180deg);}
② 지역선택 z-index : 1

내가 만든 것

마저 완성해보기


<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 폰트 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css">
<!-- 플러그인 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-2.2.4.js" integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI=" crossorigin="anonymous"></script>
<style>
*{margin: 0; padding: 0;}
ul, li{list-style: none;}
a{text-decoration: none; color: rgb(128, 128, 128);}
#agree:checked + label:before{ color: red; }
#contact [type="text"]{border: 0; outline: 0; width: 100%;}
#contact .text-sm{width: 25%; background-color: lightgray;}
.line{border: 2px solid orange; border-radius: 5px; overflow: hidden;}
.formIndent{ padding-left: 1rem; padding-right: 1rem;}
#contact > ul > li{ padding-top: 2rem;}
#contact .line p {transform: translateY(-20%);}
.js_selectDiv{ transition: 0.5s; height: 30px; }
.js_selectDiv.on{ height: 150px;}
.js_selectDiv.on p i{ transform: rotate(180deg);}
.location{
height: 100px;
}
li.location div.js_selectDiv{
z-index: 1000;
background-color: white;
overflow: hidden;
}
</style>
</head>
<body>
<input type="hidden" name="area">
<div class="form container">
<form action="http://~~~~.cafe24.com/pwa/" method="POST" name="contact" id="contact">
<ul class="row">
<!-- 회사명 -->
<li class="col-md-10">
<div class="line blueLine d-flex flex-column">
<p class="formIndent">
<label class="bg-white px-2" for="">회사명</label>
<input type="text" name="company" placeholder="회사명을 입력해주세요">
</p>
</div>
</li>
<!-- 회사위치 -->
<li class="location col-md-2">
<div class="line js_selectDiv position-relative overflow-hidden bg-white">
<p class="formindent">
<label class="bg-white px-2" for="">회사위치<i class="bi bi-chevron-down"></i></label>
</p>
<ul class="position-absolute">
<li>잠실</li>
<li>강남</li>
<li>정자</li>
<li>판교</li>
</ul>
</div>
<script>
const areaSelectEl = document.querySelectorAll('form .js_selectDiv')[0];
const areainput = document.getElementsByName('area')[0];
areaSelectEl.addEventListener('click', function(e){
this.classList.toggle('on');
})
var areali = document.querySelectorAll('form .js_selectDiv li');
areali.forEach(function( el, index ){
el.addEventListener('click', function(){
var _thisText = this.innerHTML;
document.querySelector('form .js_selectDiv p').innerHTML = _thisText;
areainput.value = _thisText;
})
})
</script>
</li>
<!-- 채용 직무 -->
<li class="col-md-6">
<div class="line d-flex flex-column formIndent">
<p class="d-block">
<label class="bg-white px-2">채용직무<span>중복선택가능</span></label>
<p class="m-0">
<input type="checkbox" name="position[0]" id="position0" value="frontend">
<lable for="position0">프론트엔드</lable>
<input type="checkbox" name="position[1]" id="position1" value="publisher">
<lable for="position1">퍼블리셔</lable>
<input type="checkbox" name="position[2]" id="position2" value="planner">
<lable for="position2">기획자</lable>
<input type="checkbox" name="position[3]" id="position3" value="designer">
<lable for="position3">디자이너</lable>
<input type="text" name="position[4]" id="position4" value="">
<lable for="position4">기타<input type="text" class="text-sm"></lable>
</p>
</p>
</div>
</li>
<!-- 주력 언어 -->
<li class="col-md-6">
<div class="line otherLine d-flex flex-column formIndent">
<p class="d-block">
<label class="bg-white px-2">주력언어<span>중복선택가능</span></label>
<p class="m-0">
<input type="checkbox" name="ability[0]" id="ability0" value="react">
<lable for="ability0">리액트</lable>
<input type="checkbox" name="ability[1]" id="ability1" value="node">
<lable for="ability1">노드</lable>
<input type="checkbox" name="ability[2]" id="ability2" value="scss">
<lable for="ability2">php</lable>
<input type="checkbox" name="ability[3]" id="ability3" value="php">
<lable for="ability3">SCSS</lable>
<input type="checkbox" name="ability[4]" id="ability4" value="javascript">
<lable for="ability4">제이쿼리</lable>
<input type="text" name="ability[5]" id="ability5" value="">
<lable for="ability5">기타<input type="text" class="text-sm"></lable>
</p>
</p>
</div>
</li>
<!-- 담당자명 -->
<li class="col-md-2">
<div class="line d-flex flex-column">
<p class="formIndent m-0">
<label class="bg-white px-2" for="">담당자명</label>
<input type="text" name="people" class="d-block">
</p>
</div>
</li>
<!-- 연락처 -->
<li class="col-md-10">
<div class="line d-flex flex-column">
<p class="formIndent m-0">
<label class="bg-white px-2" for="">연락처</label>
<input type="text" name="contact" placeholder="카톡, 메일, 전화번호 등" class="d-block">
</p>
</div>
</li>
<!-- 남기고 싶은 말 -->
<li class="col-md-12">
<div class="line blueLine d-flex flex-column">
<p class="formIndent">
<label for="message">남기고 싶은 말</label>
<input type="text" name="message" id="message" placeholder="자유롭게 작성 부탁드립니다.">
</p>
</div>
</li>
</ul>
<!-- 개인정보수집이용동의 -->
<p> <!-- 체크박스에 name 필요없음! 데이터를 서버에 보낼 게 아니라, 동의 안하면 못 넘어가니까 -->
<input type="checkbox" id="agree" class="d-none">
<label for="agree" class="bi bi-app">개인정보수집이용동의</label><a href="#popagree">약관</a>
</p>
<p>
<input type="image" src="./contact.svg" style="height:20px" value="제출">
</p>
</form>
</div>
<div id="popagree" class="d-none position-absolute">
<!--여기에 width값이 들어가야하는데 그건 디자이너 영역이라 물어보고 하드코딩한다-->
<div class="popcontent">
약관 가져오기
</div>
</div>
</body>
</html>