์น ์๋ฒ์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์์ UI๋ฅผ
<form>
ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์์ฑํ๋ค๊ณ ํด์ Form UI๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ ํ๊ทธ๋ค ์กด์ฌ.
์ด๋ฐ ํ๊ทธ๋ค์ ํผ๊ณผ ๊ด๋ จ๋ ์์๋ค์ด๋ผ๊ณ ํด์ ํผ ์์/ํผ ํ๊ทธ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์๋ ๋์ผํ ํผ ์์๋ ๋ค์ํ ๋์์ธ์ผ๋ก ํํ๋จ
๋ฐ๋ผ์ ํต์ผ๋ ๋ชจ์ต์ผ๋ก ํํํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ํผ ์์๋ค์ css๋ฅผ ์ด์ฉํ์ฌ ์ปค์คํ
ํด์ฃผ์ด์ผ ํ๋ค.
์ฌ์ฉ ์์
ํ ์คํธ ํ๋์ ์ปค์คํ ์ CSS ์์ฑ์ ์ด์ฉํด์ ๋จ์ํ ๋ฐ์ค ๋ชจ๋ธ์ฒ๋ผ ์ฝ๊ฒ ์์ ๊ฐ๋ฅํ๋ค.
placeholder๋ฅผ ์ด๋ป๊ฒ ์์ ํ ์ ์๋์ง ์ดํด๋ณด์
input[type=text], input[type=password], textarea
::placeholder
::placeholder
๋ฅผ ํตํด ํฐํธ ์คํ์ผ์ ํธ์งํ ์ ์๋ค.<p><input type="text" placeholder="์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์."></p>
<p><input type="password" placeholder="๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์."></p>
<p><textarea name="" id="" cols="30" rows="10" placeholder="๋ฌธ๊ตฌ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์."></textarea></p>
input[type="text"],
input[type="password"] {
width: 198px;
height: 38px;
line-height: 38px;
border: 1px solid #ddd;
font-size: 15px;
text-indent: 10px;
color: #000;
}
textarea {
width: 280px;
height: 130px;
padding: 9px;
border: 1px solid #ddd;
font-size: 15px;
resize: none;
color: #000;
}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: red;
}
::-moz-placeholder { /* Firefox 19+ */
color: red;
}
:-ms-input-placeholder { /* IE 10+ */
color: red;
}
:-moz-placeholder { /* Firefox 18- */
color: red;
}
textarea::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: blue;
}
textarea::-moz-placeholder { /* Firefox 19+ */
color: blue;
}
textarea:-ms-input-placeholder { /* IE 10+ */
color: blue;
}
textarea:-moz-placeholder { /* Firefox 18- */
color: blue;
}
๋ง์ฝ ๋ธ๋ผ์ฐ์ ์์ ์ธ์ํ ์ ์๋ ์ ํ์๊ฐ ๋ผ์ด์๋ค๋ฉด ๊ทธ ์ฝ๋ ์์ฒด๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌด์ํ๊ฒ ๋จ.
๊ทธ๋ฌ๋ฏ๋ก prefix๊ฐ ๋ถ๋ placeholder ๋ด์ฉ๋ค์ ๋ฐ๋ก๋ฐ๋ก ์จ์ฃผ๋๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด๋ค.
input[type:checkbox], input[type:radio], label
UI element states pseudo-classes(:checked) Pseudo-element(:before)
<div>
<input type="checkbox" id="check_button1" name="">
<label for="check_button1">์ ํ1</label>
</div>
<div>
<input type="checkbox" id="check_button2" name="">
<label for="check_button2">์ ํ2</label>
</div>
input[type='checkbox'] { /* input ๊ฐ์ถ๊ธฐ */
position: absolute;
overflow:hidden;
width: 1px;
height: 1px;
margin: -1px;
opacity: 0;
}
input[type='checkbox'] + label { /*ํ์ ๋ฐฐ๊ฒฝ*/
display: inline-block;
overflow: hidden; /*๊ธ์จ ์ด๊ธฐํ*/
position: relative;
width: 36px;
height: 21px;
border-radius: 10px;
background: #666;
vertical-align: top;
color: transparent; /*๊ธ์จ ์ด๊ธฐํ*/
}
input[type='checkbox'] + label:after { /*๋๊ทธ๋ผ๋ฏธ ๋ชจ์*/
content: '';
position: absolute;
top: 1px;
left: 1px;
width: 19px;
height: 19px;
background: #fff;
border-radius: 50%;
}
input[type='checkbox']:checked + label { /*input์ด checked ๋์์๋*/
background-color: #62a7ee;
}
input[type='checkbox']:checked + label:after { /*๋๊ทธ๋ผ๋ฏธ ์ด๋*/
left: auto;
right: 1px;
}
<div>
<input type="checkbox" id="check_button1" name="">
<label for="check_button1">์ ํ1</label>
</div>
<div>
<input type="checkbox" id="check_button2" name="">
<label for="check_button2">์ ํ2</label>
</div>
input[type='checkbox'] { /* input ๊ฐ์ถ๊ธฐ */
position: absolute;
overflow:hidden;
width: 1px;
height: 1px;
margin: -1px;
opacity: 0;
}
input[type='checkbox'] + label {
display: inline-block;
font-size: 16px;
}
input[type='checkbox'] + label:before {
display: inline-block;
width: 20px;
height: 20px;
margin:-4px 5px 0 0;
background: url(checkbox.png) no-repeat 0 0;
background-size: 20px;
vertical-align: top;
content:'';
}
input[type='checkbox']:checked + label:before { /*์ ํํ์๋ ์ด๋ฏธ์ง ๋ณ๊ฒฝ*/
background-image: url(checkbox_on.png);
}
<div>
<input type="radio" id="radio_button1" name="radio_form">
<label for="radio_button1">๋ผ๋์ค1</label>
</div>
<div>
<input type="radio" id="radio_button2" name="radio_form">
<label for="radio_button2">๋ผ๋์ค2</label>
</div>
<div>
<input type="radio" id="radio_button3" name="radio_form">
<label for="radio_button3">๋ผ๋์ค3</label>
</div>
input[type='radio'] { /* input ๊ฐ์ถ๊ธฐ */
position: absolute;
overflow:hidden;
width: 1px;
height: 1px;
margin: -1px;
opacity: 0;
}
input[type='radio'] + label {
display: inline-block;
font-size: 16px;
}
input[type='radio'] + label:before {
display: inline-block;
width: 20px;
height: 20px;
margin:-4px 5px 0 0;
background: url(radio.png) no-repeat 0 0;
background-size: 20px;
vertical-align: top;
content:'';
}
input[type='radio']:checked + label:before {
background-image: url(radio_on.png);
}
input[type=file]
opacity
<div class="file_form">
<input type="file">
<span class="text">filename..</span>
</div>
.file_form {
position: relative; /* position ๊ธฐ์ค */
display: inline-block;
width: 198px;
height: 38px;
line-height: 38px;
border: 1px solid cornflowerblue;
font-size: 12px;
}
.file_form .text { /*๋ง์ค์*/
overflow: hidden;
text-overflow: ellipsis;
display: block;
padding: 0 50px 0 10px;
white-space: nowrap;
}
.file_form .text:after { /* ๋ฒํผํํ ๊ตฌํ */
position: absolute;
top:0;right:0;
width: 50px;
background-color: cornflowerblue;
text-align: center;
color: #fff;
content:'ํ์ผ์ฐพ๊ธฐ';
}
.file_form input[type='file'] { /*input์ ์ปค์คํ
ํ ์ฌ๊ฐํ ์๋ก ๋์์ฃผ๊ธฐ*/
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
z-index: 10; /*'ํ์ผ์ฐพ๊ธฐ'๋ณด๋ค ์ฌ๋ ค์ค*/
width: 100%;
opacity: 0;
}
<div class="file_form_img">
<span class="img"><img src="default.png" alt="ํ๋กํ ์ด๋ฏธ์ง"></span>
<label class="file"><input type="file"></label>
</div>
.file_form_img {
width: 100px; /* ํ๋กํ ๋ฑ๋ก ์ฌ์ด์ฆ ์ง์ */
}
.file_form_img .img {
overflow: hidden;
position: relative;
display: block;
width: 100px;
height: 100px;
border:1px solid rgba(0, 0, 0, 0.2);
border-radius: 50%; /* ์ ๋ชจ์*/
}
.file_form_img .img img {
width: 100%;
height: auto;
border-radius: 50%;
}
.file_form_img .file {
position: relative;
display: block;
margin: 10px auto 0; /* ๋ฒํผ ๊ฐ์ด๋ฐ ์ ๋ ฌ */
background:url(btn_file.jpg) no-repeat;
width: 82px;
height: 24px;
}
.file_form_img .file input[type=file] {
position: absolute;
z-index: 10;
top: 0; right: 0; bottom: 0; left: 0;
width: 100%;
opacity: 0;
}
opacity๋ฅผ ์ด์ฉํด์ input:file์ ๊ธฐ๋ฅ๋ง ๋จ๊ธฐ๊ณ ๊ฐ๋ฆฌ๊ธฐ
file type์ ๋ฒํผ์ ๋ชจ์๊ณผ ๊ทธ ํ์ผ๋ช
์ด ๋
ธ์ถ๋๋ ์์ญ์ ์ธ๋ถ์ ์ผ๋ก ์ปค์คํ
์ ํ ์ ์๋ค.
์ ํ๋ ๊ฐ์ ๋ค๋ฅธ ๊ณต๊ฐ์ผ๋ก ๋ณด์ฌ์ฃผ๋๋ก js๋ฅผ ์ด์ฉํ ๊ฐ๋ฐ๋์
์ ํ๋ ํ์ผ๋ช
์ด๋ ํ์ผ ์ ๋ณด๋ค์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ์์ผ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ ๊ฐ๋ฐ๋์์ด ๊ผญ ํ์ํ๋ค.
select ๋ฉ๋ด๋ฅผ ํด๋ฆญํ์๋ ๋์ค๋ ์๋์ ์ ํํ ๋ด์ฉ๋ค์ CSS๋ง์ผ๋ก ์ปค์คํ
์ ํ ์๊ฐ ์๋ค.
๊ทธ๋์ ํผ์ณ์ง ๋๋กญ๋ฐ์ค์ ๋ชจ์์ด ๊ธฐ์กด ๋ชจ์ต๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ๋ชจ๋ ๋ ์ด์ด ํํ๋ก ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ํ๋ก ํธ ์๋ ๊ฐ๋ฐ ๋์์ผ๋ก select์ ๋์์ ๊ตฌํํ ๊ฒ์ด๋ค.
select
appearance
<div class="select_form">
<select name="" id="">
<option value="">์ ํ1</option>
<option value="">์ ํ2</option>
<option value="">์ ํ3</option>
</select>
</div>
.select_form {
display: block;
position: relative;
width: 198px;
height: 38px;
line-height: 40px;
border: 1px solid #ddd;
text-align: left;
}
.select_form select {
width: 100%;
height: 100%;
padding: 0 30px 0 10px;
background-color: transparent;
border: 0 none;
font-size: 16px;
appearance: none; /*๊ธฐ๋ณธ ๋ฒํผ ๋ชจ์ ์์ ๊ธฐ*/
/*appearance ์์ฑ์ด webkit ์์ง๊ณผ Mozilla์ฌ์์ ์ฌ์ฉํ๋ Gecko ์์ง์์๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ prefix๋ฅผ ๋ถ์ฌ์ค ๋ค์ ์์ ์ค์ผ๋ง ํ๋ค. appearance๋ ๋นํ์ค ์ฝ๋*/
-moz-appearance: none;
-webkit-appearance: none;
}
.select_form:after { /*๋ฒํผ ํํ*/
position: absolute;
top: 16px;
right: 10px;
background:url(select.png) no-repeat 0 0;
width: 13px;
height: 7px;
display: block;
content:'';
}
appearance ์์ฑ์ ์ด์ฉํ์ฌ ๊ธฐ๋ณธ ๋ฒํผ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ธฐ
appearance ์์ฑ ๋ํ placeholder ์ปค์คํ
ํ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋นํ์ค ์ฝ๋๋ก, webkit๊ณผ Gecko ์์ง ๊ธฐ๋ฐ์ ๋ธ๋ผ์ฐ์ ์์๋ง ๋์ํ๋ค.
์ฆ MS์ฌ์์ ์ ๊ณตํ๋ ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ์์๋ ๋์์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ IE์์ ์ปค์คํ
๋ ์
๋ ํธ ๋ฐ์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด์๋ ๋ ์ด์ด ํํ์ ๋๋กญ๋ค์ด๋ฐฉ์์ ๋ง๋ค์ด์ ๊ฐ๋ฐ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์