본문으로 건너뛰기

여러 줄 글과 고르는 칸

HTML·CSS 목차폼레슨 34 / 93

목차

textarea는 여러 줄 글을 받는 칸이고, select는 목록에서 하나를 고르는 칸입니다. 한 물음에 딸린 칸들은 fieldset으로 묶고, 그 물음은 legend로 답니다.

한 줄 평처럼 길게 쓸 글은 한 줄 글자 칸이 좁고, 별점처럼 정해진 값 가운데 하나를 고르는 칸은 라디오를 다섯 개 늘어놓기보다 목록 하나가 짧습니다. '다시 만들어 볼 건가요?'처럼 라디오 여럿이 한 물음에 답하면, 그 물음이 라디오들과 함께 읽혀야 무엇을 고르는지 압니다. 이 레슨에서는 세 요소를 차례로 보고, textarea 안의 빈칸이 앞에서 배운 빈칸 규칙과 다르게 다뤄지는 것을 봅니다.

10단계 중 1단계. select는 목록에서 하나를 고르는 칸입니다. 처음에는 첫 option이 골라져 있습니다.

꼴

1textarea — 처음 글은 태그 사이에

<form>
  <label for="cmt">
    한 줄 평
  </label>
  <textarea
    id="cmt"
    name="comment"
  ></textarea>
  <button type="submit">
    보내기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?comment=good%0D%0Aagain

칸에 good을 치고 Enter를 누른 뒤 again을 쳐서 보낸 주소입니다.

  • textarea는 input과 달리 닫는 태그가 있는 요소입니다. 칸에 처음 들어 있을 글은 여는 태그와 닫는 태그 사이에 씁니다.
  • 이 칸에서 Enter는 제출이 아니라 줄바꿈입니다. 줄바꿈은 주소에서 %0D%0A가 됩니다.
  • 칸 크기는 rows(줄 수) · cols(한 줄 글자 수) 속성으로 정할 수 있습니다.

textarea 안의 빈칸 · 줄바꿈은 그릴 때 하나로 합쳐지지 않습니다. 앞에서 본 빈칸 규칙(브라우저 규칙 2)과 달리, 칸 안 글은 친 그대로 보이고 그대로 보내집니다. 그래서 처음 글을 넣을 때는 여는 태그의 > 바로 뒤에 붙여 쓰고, 닫는 태그도 글 바로 뒤에 붙입니다.

<textarea
  id="cmt"
  name="comment"
>맛있어요</textarea>
결과 화면
잰 값개발자 도구에서 본 값
  • #cmt의 값맛있어요

textarea를 <textarea />처럼 빈 요소로 닫으면, 브라우저는 그 / 기호를 버리고 여는 태그로만 읽습니다. 닫는 태그가 나올 때까지 뒤의 HTML이 모두 칸 안 글이 됩니다.

<label for="c">한 줄 평</label>
<textarea id="c" name="c" />
<p>끝</p>
결과 화면일부러 틀린 코드
검사기Error 3개
  • Error2줄Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
  • Error3줄End of file seen when expecting text or an end tag.
  • Error2줄Unclosed element “textarea”.

결과 화면의 칸 안에 <p>끝</p>가 글자로 들어 있습니다. 오류 없이 그려지지만 문단은 사라졌습니다 — 검사기 첫 줄이 까닭을 말합니다(브라우저 규칙 2).

2select — 고른 option의 value를 보낸다

<form>
  <label for="lv">밥 양</label>
  <select id="lv" name="level">
    <option value="low">
      조금
    </option>
    <option value="normal">
      보통
    </option>
  </select>
  <button type="submit">
    보내기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?level=normal

'보통'을 고르고 보낸 주소입니다.

  • select 안에 고를 것마다 option을 하나씩 둡니다. 목록에 보이는 것은 option의 글이고, 보내는 것은 고른 option의 value입니다.
  • 아무것도 고르지 않으면 첫 option이 골라져 있습니다. 처음부터 고를 option에는 값 없는 속성 selected를 적습니다.
  • option의 글은 줄을 나눠 적어도 앞뒤 빈칸을 떼고 보입니다.

3fieldset과 legend — 한 물음의 칸을 묶는다

<fieldset>
  <legend>밥 양</legend>
  <input
    type="radio"
    id="less"
    name="rice"
    value="less"
  />
  <label for="less">조금</label>
결과 화면

둘째 라디오를 넣고 fieldset을 닫습니다.

  <input
    type="radio"
    id="normal"
    name="rice"
    value="normal"
  />
  <label for="normal">
    보통
  </label>
</fieldset>
결과 화면
잰 값개발자 도구에서 본 값
  • fieldset의 역할group
  • fieldset의 읽는 이름밥 양

fieldset은 칸 여럿을 한 묶음으로 둘러싸고, 그 안 맨 처음의 legend가 묶음의 물음이 됩니다. 크롬은 묶음 둘레에 선을 긋고 선 위에 물음 글을 얹어 그립니다. 잰 값의 역할 group은 이 요소가 '묶음'이라는 뜻이고, 읽는 이름은 legend 글 '밥 양'입니다. 화면 읽기 프로그램은 라디오 '조금'에 들어갈 때 이 묶음의 이름을 함께 알려 줄 수 있습니다. 역할은 7단원 화면 읽기 프로그램이 읽는 페이지에서 자세히 봅니다.

예제

후기 폼의 별점과 한 줄 평입니다. 별점은 '5점'에 selected를 적어 처음부터 골라 두었습니다.

<form>
  <label for="star">별점</label>
  <select
    id="star"
    name="rating"
  >
    <option value="5" selected>
      5점
    </option>
    <option value="4">
      4점
    </option>
  </select>
결과 화면

한 줄 평 칸과 단추를 잇습니다.

  <label for="cmt">
    한 줄 평
  </label>
  <textarea
    id="cmt"
    name="comment"
  ></textarea>
  <button type="submit">
    후기 남기기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?rating=5&comment=good

별점은 고르지 않았지만 selected인 '5점'의 value 5가 갔고, 한 줄 평에 친 good이 이어졌습니다.

자주 틀리는 곳

틀린 생각: textarea의 처음 글도 input처럼 value 속성에 적는다.

<label for="cmt">한 줄 평</label>
<textarea
  id="cmt"
  name="comment"
  value="맛있어요"
></textarea>
결과 화면
잰 값개발자 도구에서 본 값
  • #cmt의 값(없음)

칸이 비어 있습니다. textarea는 value 속성을 쓰지 않습니다.

맞는 규칙: textarea의 처음 글은 여는 태그와 닫는 태그 사이에 씁니다(>맛있어요</textarea>).

틀린 생각: textarea 안에서도 빈칸과 줄바꿈은 하나로 합쳐진다.

앞에서 HTML의 빈칸은 그릴 때 하나로 합쳐진다고 배웠으니, 칸 안 글도 그럴 것 같습니다.

<form>
  <textarea
    id="cmt"
    name="comment"
  >
    good
  </textarea>
  <button type="submit">
    보내기
  </button>
</form>
결과 화면일부러 틀린 코드
잰 값개발자 도구에서 본 값
  • form의 주소?comment=++++good%0D%0A++

결과 화면의 칸 안에서 good 앞에 빈칸이, 뒤에 빈 줄이 보입니다. 주소에도 앞 빈칸 넷(++++)과 줄바꿈(%0D%0A), 닫는 태그 앞 빈칸 둘(++)이 그대로 갔습니다. > 바로 뒤 줄바꿈 하나만 브라우저가 버렸습니다.

맞는 규칙: textarea 안의 빈칸 · 줄바꿈은 합쳐지지 않고 그대로 보이고 보내집니다. 처음 글은 줄을 나누지 않고 > 바로 뒤에 붙여 씁니다.

틀린 생각: option에 value를 적지 않으면 아무것도 보내지 않는다.

<form>
  <label for="lv">밥 양</label>
  <select id="lv" name="level">
    <option>조금</option>
    <option>보통</option>
  </select>
  <button type="submit">
    보내기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?level=%EB%B3%B4%ED%86%B5

'보통'을 고르자 화면 글 '보통'이 % 꼴로 갔습니다. value가 없는 option은 제 글을 값으로 보냅니다.

맞는 규칙: option의 value가 없으면 화면 글이 갑니다. 받는 쪽이 기다리는 값(normal)이 따로 있으면 value에 적습니다 — 화면 글을 고쳐도 보내는 값은 그대로 둘 수 있습니다.

틀린 생각: legend는 fieldset 앞에 두어도 된다.

<legend>밥 양</legend>
<fieldset>
  <input
    type="radio"
    id="less"
    name="rice"
    value="less"
  />
  <label for="less">조금</label>
</fieldset>
결과 화면
잰 값개발자 도구에서 본 값
  • fieldset의 읽는 이름(없음)
검사기Error 1개
  • Error1줄Element “legend” not allowed as child of element “body” in this context. (Suppressing further errors from this subtree.)

묶음의 읽는 이름이 없어졌고, 검사기는 legend가 그 자리에 올 수 없다고 말합니다.

맞는 규칙: legend는 fieldset 안 맨 처음에 둡니다. 그래야 묶음의 물음이 됩니다.

확인 문제

1. 3절 묶음에서 '보통'을 고르고 이 묶음을 폼에 넣어 보내면, 주소 끝에 무엇이 붙을까요? ?부터 끝까지 쓰세요.

<form>
  <fieldset>
    <legend>밥 양</legend>
    <input
      type="radio"
      id="less"
      name="rice"
      value="less"
    />
    <label for="less">
      조금
    </label>
    <input
      type="radio"
      id="normal"
      name="rice"
      value="normal"
    />
    <label for="normal">
      보통
    </label>
  </fieldset>
  <button type="submit">
    보내기
  </button>
</form>
힌트

주소에 이름을 붙이는 속성이 어느 요소에 있는지 봅니다.

힌트 둘

fieldset · legend에도 그 속성이 있나요?

정답

받는 답: ?rice=normal

결과 화면
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?rice=normal

보내는 것은 고른 라디오의 name과 value뿐입니다. fieldset과 legend는 칸을 묶고 물음을 달 뿐, 주소에는 붙지 않습니다.

  • ?밥 양=normal처럼 썼다면 물음 글이 이름으로 간다고 본 것입니다. 이름은 라디오의 name="rice"입니다.
  • ?rice=보통이라고 썼다면 라벨 글이 간다고 본 것입니다.

2. '보통'을 고르면 주소에 level=mid가 붙게 하려고 합니다. ____ 자리에 들어갈 것을 쓰세요.

<select id="lv" name="level">
  <option ____>보통</option>
</select>
힌트

주소의 = 뒤에 오는 값을 정하는 속성을 2절에서 찾아봅니다.

정답

value="mid"입니다. 고른 option의 value가 = 뒤에 붙습니다. 화면 글 '보통'은 그대로 목록에 보입니다.

3. 카페 메뉴판 페이지의 주문 폼입니다. 받는 쪽은 잔 크기를 cup=small · cup=large로 받으려 합니다. 그런데 '큰 잔'을 골라 보냈더니 cup=%ED%81%B0+%EC%9E%94⁠가 갔습니다. 어떻게 고칠까요?

<form>
  <label for="cup">크기</label>
  <select id="cup" name="cup">
    <option>작은 잔</option>
    <option>큰 잔</option>
  </select>
  <button type="submit">
    주문
  </button>
</form>
힌트

4 · 5번 줄 option에 무엇이 없는지 2절 코드와 견줘 봅니다.

정답

4번 줄 option에 value="small", 5번 줄에 value="large"를 적습니다.

value가 없는 option은 화면 글을 값으로 보냅니다. 그래서 '큰 잔'이 % 꼴(띄어쓰기는 +)로 갔습니다. 아래는 고치기 전 잰 값입니다.

결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?cup=%ED%81%B0+%EC%9E%94

고친 코드는 줄이 길어져 option을 나눠 적고 두 덩어리로 이었습니다.

<form>
  <label for="cup">
    크기
  </label>
  <select
    id="cup"
    name="cup"
  >
    <option value="small">
      작은 잔
    </option>
결과 화면
    <option value="large">
      큰 잔
    </option>
  </select>
  <button type="submit">
    주문
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?cup=large

흔한 오답은 화면 글을 large로 바꾸는 답입니다. 그러면 주소는 맞지만 목록에 영어가 보입니다. value를 따로 적으면 화면 글과 보내는 값을 따로 고를 수 있습니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. 1절의 textarea를 html-css-study 폴더에 comment.html로 저장하되, 처음 글 '맛있어요'를 다음 줄에 두 칸 들여 적어 봅니다. 열기 전에 칸 안 글이 어디서 시작할지 먼저 적고, 열어서 커서를 칸 맨 앞에 두고 맞춰 봅니다. 그다음 > 바로 뒤에 붙여 고쳐 다시 엽니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

HTML·CSS 목차로