024.08.22 (Day 17) - HTML/CSS [Forms(Form, Input, Textarea, Button) I ]

반응형
transform, transition, animation을 복합적으로 활용한 예제폼 요소의 기능적인 측면 이해
폼 요소의 기본 스타일 특성 이해하기
폼 요소를 적절히 초기화하고 최초 스타일 재구축
폼 요소, 최소한의 접근성 확보하기
체크박스와 라디오버튼 커스텀
버튼 커스텀

 (day17/music)

transform, transition, animation 예제

 

 

 

▼ 아이콘 추가하여 하나로 합친 후 가운데 정렬

또는 left 50% right 50%

 

▼ transform을 사용하여 중앙 정렬 할 수 있다.

 

▼ 네거티브 마진을 사용하여 중앙 정렬 할 수 있다

 

▼ nth-child와 transform translate rotate를 적절히 사용하여 각 아이콘들의 위치를 조정해준다

 

▼ rotate로 인해 이미지가 틀어졌기 때문에 음수값으로 원래 rotate로 되돌려준다

 

 

 

▼ 애니메이션을 적용 해주기 위해 y축의 전역변수 설정해주고 transtion을 사용해준다.

 

 

▼ whell-item도 hover되는 현상을 막기위해  point event none을 사용해준다.

 

▼keyframe사용하여 애니메이션에 좀 더 유연하게 적용

 

▼ 아이콘도 같이 돌아가는걸 막기위해 item 하위에 이미지를 돌려준다.

 

▼ 기능이 잘 작동하는 것을 확인한다

페드로페드로~

 

 

▼ hover 되었을때 딜레이를 적용 할 수있다.

 


 (day17/meeting_room)

■ Form 폼

 

폼(Form)은 사용자가 웹 페이지에서 데이터를 입력하고 서버로 전송할 수 있도록 하는 인터페이스를 제공한다. 

폼은 로그인, 회원가입, 검색 등의 작업을 수행할 때 사용되며, 다양한 입력 요소들을 포함할 수 있다.

 

▼ <form>
form 요소는 폼을 정의하는 데 사용한다. 

이 요소는 사용자가 입력한 데이터를 서버로 전송하기 위한 컨테이너 역할을 한다.

주요 속성 (attribute)

◎ action: 폼 데이터를 제출할 때 데이터를 처리할 서버의 URL을 지정한다.

◎ method: 폼 데이터를 서버에 전송하는 방법을 지정한다. 보통 GET 또는 POST를 사용한다
    1. GET: URL에 데이터를 붙여 서버에 전송한다 데이터를 URL에 표시하기 때문에 보안이 낮고,

소량의 데이터를 전송할 때 주로 사용한다.
    2. POST: 데이터를 HTTP 메시지 본문에 담아 서버에 전송한다. 보안이 높고, 대용량 데이터를 전송할 때 사용한다.

<form action="/submit" method="get">
  <!-- 입력 요소들 -->
</form>

 

▼ <fieldset>
fieldset요소는 폼 요소들을 그룹화하는 데 사용된다.

그룹화된 폼 요소들은 시각적으로 구분되며, 관련된 폼 요소들을 논리적으로 묶을 수 있다.

<form action="/submit" method="post">
  <fieldset>
    <legend>기본 회원정보</legend>
    
    <label for="name">이름:</label>
    <input type="text" id="name" name="name" required>
    
    <label for="email">이메일주소:</label>
    <input type="email" id="email" name="email" required>
  </fieldset>

  <fieldset>
    <legend>계정정보</legend>
    
    <label for="username">회원 아이디:</label>
    <input type="text" id="username" name="username" required>
    
    <label for="password">비밀번호:</label>
    <input type="password" id="password" name="password" required>
  </fieldset>

  <button type="submit">회원가입</button>
</form>

 

▼ <legend>
legend요소는 fieldset의 첫 번째 자식으로, 폼 요소 그룹의 제목을 정의한다.

이 제목은 폼 요소 그룹의 의미를 명확하게 설명하는 데 유용하다.

 

▼ <input>
input요소는 사용자가 데이터를 입력할 수 있는 다양한 종류의 필드를 제공한다.

▷주요 속성 (attribute)
◎ type: 입력 필드의 종류를 지정한다.
    1. text: 한 줄의 텍스트 입력 필드.
    2. password: 비밀번호 입력 필드. 입력한 내용이 보이지 않음.
    3. email: 이메일 주소 입력 필드.
    4. number: 숫자 입력 필드.
    5. checkbox: 체크박스.
    6. radio: 라디오 버튼.
    7. file: 파일 업로드 필드.


◎ name: 폼 데이터를 제출할 때 각 입력 요소의 이름을 지정
◎ value: 입력 필드의 기본 값을 설정
◎ placeholder: 입력 필드에 힌트를 표시
◎ required: 필수 입력 필드로 지정
◎ disabled: 해당 필드를 비활성화 
◎ id: label요소의 for값과 연동 / label요소 클릭 시, 해당 input에 포커스가 잡힌다
◎ submit: 폼의 제출 버튼 / 최근에는 button요소가 주로 사용한다

<form action="/submit" method="post">
  <label for="username">아이디:</label>
  <input type="text" id="username" name="username" placeholder="Enter your username" required>
  <label for="password">비밀번호:</label>
  <input type="password" id="password" name="password" required>
  <input type="submit" value="Submit">
</form>

 

 

▼ <select>, <option>
select요소는 드롭다운 메뉴를 생성하는 데 사용하며 option요소는 드롭다운 메뉴의 선택지를 정의한다.

  <label for="country">국가:</label>
  <select id="country" name="country">
    <option value="kr">대한민국</option>
    <option value="us">미국</option>
    <option value="jp">일본</option>
  </select>

 

 

▼ <label>
label요소는 입력 요소에 대한 설명(레이블)을 제공한다. 레이블을 클릭하면 관련된 입력 요소에 포커스가 이동하고

label요소의 for 속성은 관련된 입력 요소의 id와 연결되어야 하는데

<label> 태그 내부에 <input> 요소를 포함하는 방법도 있다.

이 방법은 특히 사용자 경험(UX) 측면에서 유용하며 레이블이 클릭될 때, 포함된 <input> 요소도 함께 활성화되기 때문에 

라디오 버튼이나 체크박스와 같은 요소에서 매우 편리하다.

 

▼<input type="checkbox"> <input type="radio">
checkbox: 여러 개의 선택지를 중복 선택할 수 있는 입력 요소
radio: 동일한 그룹 내에서 하나의 선택지만 선택가능. name 속성이 동일한 라디오 버튼 그룹에서 하나의 값만 선택

 

<form action="/submit" method="post">
  <label for="subscribe">밥 먹었니?</label>
  <input type="checkbox" id="subscribe" name="subscribe"> 먹었습니다.

  <label>직업은?</label>
  <input type="radio" id="developer" name="job" value="developer">
  <label for="developer">개발자</label>

  <input type="radio" id="designer" name="job" value="designer">
  <label for="designer">디자이너</label>
  
  <button type="submit">전송</button>
</form>

 

▼ <button>
<button> 태그는 클릭 가능한 버튼을 정의한다. type 속성에 따라 버튼의 동작을 지정할 수 있다.

▷주요 type
submit: 폼 데이터를 제출 / 기본값이며 type값 생략시 사용한다.
reset: 폼의 입력 값을 초기화
button: 자바스크립트 등에서 사용하기 위해 버튼을 정의함 / 별도의 기본 동작이 없다.

 

 

▼ 폼의 시멘틱 마크업
폼을 설계할 때는 모든 사용자가 쉽게 이용할 수 있도록 접근성을 고려해야 한다.

이를 위해 <fieldset>, <legend>, <label>과 같은 시멘틱 요소를 적극적으로 활용하는 것이 중요하며

또한 관련 가상 클래스를 잘 활용해야 한다.

 

   ◎ 그룹화: 관련된 필드들을 <fieldset>으로 그룹화하여 폼의 논리적인 구조를 명확히 한다.
   ◎  명확한 레이블: 모든 입력 요소에 대한 명확한 레이블을 제공하여 사용자가 각 필드의 목적을 이해할 수 있도록 한다.
   ◎  포커스의 명확성: 사용자가 현재 어느 필드를 입력중인지, 입력 가능한 상태인지 명확하게 전달한다.
   ◎  입력 도움말: placeholder, title 등의 속성을 사용하여 추가적인 설명을 제공한다.
   ◎  입력 내용 검증: 입력된 내용을 한차례 검증하여 사용자가 올바른 데이터를 입력 할 수 있도록 추가적인 설명을 제공한다.

 

▼ 폼의 스타일링
폼은 사용자의 입력을 받기 위해 기본 HTML단에서 제공하는 기능이 매우 많이 있다. 

그러한 이유로 브라우저가 기본으로 제공하는 스타일이 상대적으로 많은 편이며니

이에 폼 요소 초기화가 선행 되어야 안정적인 스타일링 작업이 될 수 있다.

 

▼ div요소의 사용

<form action="/submit" method="post">
  <div class="form-group">
    <label for="email">이메일:</label>
    <input type="email" id="email" name="email" required>
  </div>
  
  <div class="form-group">
    <label for="password">비밀번호:</label>
    <input type="password" id="password" name="password" required>
  </div>

  <button type="submit">전송</button>
</form>

 

<div> 태그는 범용적인 블록 요소로, 폼에서 특정 입력 요소들을 그룹화하거나 스타일링할 때 사용한다.

대부분의 폼 요소가 인라인 레벨 요소임으로 폼 요소의 레이아웃 관리에 어려움을 많이 겪는다.

fieldset요소와 달리 시멘틱한 의미를 가지지 않지만, 

시각적인 레이아웃을 관리할 때 필수적으로 사용된다. (시각적인 목적으로만 사용)

 


 

 

 

▼ 폼 구성하기

 

 

▼ name라벨에 벨류값을 미리 지정할 수있다.

 

 

▼ checked, disabled, readonly

checked - 체크박스는 다중선택 가능

disabled - 해당 필드를 아예 비활성화 시킴

 

readonly - 값으로서 의미가 있지만, 사용자가 수정을 직접적으로 못하게 막는것

 

 

▼ fieldset을 사용하여 그룹화

 

 

■ 폼 요소 초기화

input, button과 같은 폼 요소는 사용자와의 상호작용을 처리해야 하므로,

별도의 레이아웃 기법과 렌더링 개념이 적용된다.

사용자 에이전트 스타일시트는 이러한 폼 요소들이 기본적인 스타일과 동작을

일관되게 가지도록 정의하기 위해 상대적으로 더 많은 양의 기본 스타일 규칙이 적용되어 있다.
사용자 에이전트 스타일시트에 작성된 내용은 unset을 이용하여 비교적 간편하게 초기화를 진행할 수 있다.

input[type="text"] {
  all: unset; /* input text요소의 모든 속성을 선택하여 unset 시도 */
}

 

all 속성은 모든 CSS 속성을 한 번에 다루는 기법이다.

즉, input[type="text"] 요소에 지정된 모든 속성을 unset으로 초기화한 것이다.

이는 input[type="text"]요소에 적용된 모든 스타일을 초기값 (initial) 또는 상속(inherit)으로 되돌린다.

input[type="text"] 요소에는 사용자 상호작용을 위한 

다양한 사용자 에이전트 스타일시트가 기본적으로 적용되어 있다.

all: unset을 사용하면 이러한 스타일을 모두 초기화하게 되므로, 일부 필수 기능까지 제거될 수 있다,

따라서 all: unset을 적용한 후에는 input[type="text"] 요소의 기본 기능과 사용성을 유지하기 위해

필수적인 스타일을 반드시 추가 정의해야 한다.

이렇게 함으로써 불필요한 스타일은 제거하면서도 입력 필드의 핵심 기능과 사용자 경험을 보장할 수 있다.

input[type="text"] {
  all: unset; /* input text요소의 모든 속성을 선택하여 unset 시도 */
  display: block; 
  width: 100%;
  box-sizing: border-box;
  padding: 0 20px;
  line-height: 1;
  height: 32px;
  border: 1px solid #999;
}

 

이 접근 방식은 단순한 CSS 초기화를 넘어서 구체적인 디자인 요소를 포함하고 있다.

일견 CSS 초기화의 본래 취지와 거리가 있어 보일 수 있으나, 

input 요소가 웹사이트 전반에 걸쳐 일관된 형태로 사용된다는 점을 고려하면, 

이러한 스타일 정의는 실용적인 관점에서 CSS 초기화의 확장된 형태로 볼 수 있다.

이는 기본적인 초기화와 함께 사용성과 디자인의 일관성을 동시에 확보하는 방법이 된다.

위 코드는 input요소가 가져야 할 최소한의 스타일 추가 정의일 뿐이며 

실무적으로는 접근성을 위해 반드시 추가되어야 하는 요소들이 많이 있다.

 

 

▼ 각 마크업들을 구분하고 스타일링하기위해 div로 묶어놓고 초기화 작업 진행

당장 fieldset만 봐도 기본값이 많기때문에 초기화가힘들다

fieldset{
  all: unset;
}

▲  all:unset을 적용해주면 전체 초기화 가능하다.

(초기화 unset은부모로부터 상속할 값이 존재하면 상속값을, 그렇지 않다면 초깃값을 사용한다.)

 

▼ 하지만 모든 속성을 전체 초기화다보니 필요한 속성들이 있음에도, 초기화 할 필요없는 것도 다 없애버린다.

즉 사용자 에이전트에 관심을 가져야한다.

display 기본값은 inline이기 때문에 다시 block 속성으로 바꿔줘야 한다.

fieldset{
  all: unset;
  display: block;
}

 

▼ 버튼도 all: unset을 통해 초기화한다

기본으로 제공하는 웹 접근성관련 주요 기능들의 시각적 특성이 사라져있는 것을 볼 수있다.

하지만 html 요소 고유의 기능 submit 또는 focus 기능 자체는 유지 되어있다.

button{
  all: unset;
  display: block;
}

아직 초기화해야할 것들이 남아있다.

 

▼ select와 input도 초기화한다

둘은 공공UI이다. 반복해서 쓰이는게 기본값이다.

그래서 초기화부터 진행하고 바로 뒤이어 디자인 평준화를 진행한다.

참고로 width auto는 컨테이닝 블록 기준으로 가득차지 않기에 억지로 100% 적용해줘야한다

▼ 주요 속성에 소개 되어있는 것처럼 여러 속성들을 이러한 방법으로 추가하여 스타일을 지정 할 수있다.

 

 

 

반응형