복합선택자가 중요한 이유!!

복합 선택자를 사용하면 특정 부모 요소 안에 있는 태그나, 특정 태그 이후에 나오는 요소들만 스타일링할 수 있다.

 

복합 선택자 종류

  • 하위 선택자특정 요소 안에 있는 모든 요소를 선택한다.
  • 자식 선택자부모의 바로 아래에 있는 요소만 선택한다.
  • 인접 형제 선택자특정 요소 바로 뒤의 형제 요소 하나만 선택한다.
  • 일반 형제 선택자특정 요소 뒤에 나오는 모든 형제 요소를 선택한다.

 

실습 예제 (HTML 코드)

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <h2>과일 목록</h2>
        <ul>
            <li>사과</li>
            <li>바나나</li>
        </ul>

        <p>과일은 맛있다</p>

        <ul>
            <li>오렌지</li>
            <li>포도</li>
        </ul>
    </div>
</body>
</html>

 

실습 예제 (CSS 코드)

/* (1) 하위 선택자 (div 안에 있는 모든 ul 태그 선택) */
.container {
            border: 2px solid black;
        }

/* (2) 자식 선택자 (div의 직계 자식 ul만 선택) */
.container > ul {
            border: 1px solid black;
        } 

/* (3) 인접 형제 선택자 (h2 바로 뒤에 오는 ul 하나만 선택) */
h2 + ul {
            background-color: lightcoral;
        }
/* (4) 일반 형제 선택자 (h2 뒤에 오는 모든 ul 선택) */
h2 ~ ul {
            color: red;
        }

 

선택자 예제 설명
하위선택자 (, 공백) .container ul .container 내부의 모든 <ul> 요소를 선택
자식 선택자 (>) .container > ul .container 내부의 직계 자식 <ul> 요소만 선택
인접 형제 선택자 (+) h2 + ul <h2> 바로 다음에 오는 <ul> 하나만 선택
일반 형제 선택자 (~) h2 ~ ul <h2> 이후에 나오는 모든 <ul> 선택

 

하위 선택자 / 자식 선택자

 

인접 형제 선택자 / 일반 형제 선택자

시맨틱 태그

시맨틱 태그(Semantic Tag)는 태그명 자체가 의미를 가지고 있는 HTML 태그를 뜻한다. 예를들어 <table>, <address> 같은 태그는 이름만 봐도 테이블과 주소 정보를 담는 역할을 한다는 걸 알 수 있다.

 

시맨틱 태그의 필요성

과거에는 <div> 태그를 사용해 웹페이지의 모든 레이아웃을 구성했다. 그러나 웹사이트 구조가 점점 복잡해지면서 개발자와 검색 엔진이 코드를 이해하기 어려워졌다. 이를 해결하기 위해 HTML5에서 의미를 직관적으로 알 수 있는 시맨틱 태그가 추가되었다.

 

대표적인 시맨틱 태그

  • <header>: 웹페이지의 머리글(로고, 제목 등)
  • <nav>: 내비게이션(메뉴) 영역
  • <main>: 본문 콘텐츠 영역
  • <section>: 논리적으로 연관된 콘텐츠 그룹
  • <article>: 독립적인 콘텐츠(게시글, 뉴스, 블로그 글 등)
  • <aside>: 사이드바(광고, 부가 정보 등)
  • <footer>: 웹페이지의 바닥글(저작권, 연락처 등)

 

시맨틱 태그의 장점

  • 가독성 향상: 코드만 봐도 구조를 쉽게 파악할 수 있다.
  • 검색 엔진 최적화(SEO) 효과: 검색 엔진이 콘텐츠의 의미를 정확하게 이해할 수 있다.
  • 웹 접근성 강화: 스크린 리더와 같은 보조 기술이 더 정확하게 정보를 전달할 수 있다.

 

언제 <div>를 사용할까?

시맨틱 태그가 주요 레이아웃을 담당하는 반면, 특정한 의미가 없는 단순한 그룹핑이 필요할 때는 <div>를 사용할 수 있다.

예를 들어 버튼 여러 개를 묶거나, 스타일링을 위한 단순 컨테이너 역할을 할 때 <div>를 활용하면 된다.

<map> 태그란?

하나의 이미지에서 특정 영역을 클릭 가능하도록 설정하는 기능이다. 사용자는 이미지의 특정 위치를 클릭하면 해당 영역에 연결된 링크로 이동할 수 있다.

예를 들어, 이케아, 오늘의 집 같은 온라인 쇼핑몰에서는 제품이 배치된 이미지에 <map> 태그를 활용해서 각 상품을 클릭하면 해당 상품의 상세 페이지로 이동할 수 있도록 만들 수 있다.

<img src="./img/ikea.png" usemap="#image-map">

    <map name="image-map">
        <area target="_blank" alt="" title="" href="https://www.ikea.com/kr/ko/p/mulig-clothes-bar-white-10179436/" coords="429,213,24" shape="circle">
        <area target="_blank" alt="" title="" href="https://www.ikea.com/kr/ko/p/malm-bed-frame-high-w-2-storage-boxes-white-s39199212/" coords="398,582,25" shape="circle">
        <area target="_blank" alt="" title="" href="https://www.ikea.com/kr/ko/p/malm-chest-of-6-drawers-white-70354644/" coords="597,696,23" shape="circle">
        <area target="_blank" alt="" title="" href="https://www.ikea.com/kr/ko/p/malm-chest-of-6-drawers-white-40354645/" coords="757,595,24" shape="circle">
    </map>

 

<map> 태그 사용 방법

1. 이미지와 맵 연결하기

<img> 태그에 usemap 속성을 추가하고, # 기호와 함께 <map>name 속성값을 지정해야 한다.

2. 맵과 클릭할 영역 설정하기

<map> 태그를 생성하고, name 속성을 usemap과 동일하게 설정하면 된다.

<area> 태그를 이용해서 클릭 가능한 영역을 지정하고, coords 속성을 사용해 좌표를 입력한다.

shape 속성을 이용해 영역의 형태를 정할 수 있다. (rect, circle, poly).

href 속성으로 클릭하면 이동할 링크를 설정하면 된다.

 

Tip! 이미지 맵 쉽게 만들기 (https://www.image-map.net/)

손으로 좌표를 입력하는 건 번거로울 수 있으므로 https://www.image-map.net/ 같은 사이트를 이용하면 편리하다.

1. 원하는 이미지를 업로드하고, 클릭할 위치를 마우스로 지정한다.

2. 사이트에서 자동으로 <area> 태그 코드가 생성된다.

3. 해당 코드를 복사해서 HTML 파일에 붙여넣으면 바로 적용 가능하다.

map 코드 활용 예시

  • 온라인 쇼핑몰: 제품이 포함된 이미지를 클릭하면 해당 상품 페이지로 이동하도록 설정 가능.
  • 관광 지도: 지도에서 특정 지역을 클릭하면 장소에 대한 정보를 제공할 수 있음.
  • 인터랙티브 인포그래픽: 특정 영역을 클릭하면 추가 정보를 보여주는 방식으로 활용 가능.

 

<map> 태그는 이미지에서 특정 영역을 클릭할 수 있도록 설정하는 기능

쇼핑몰, 지도, 인포그래픽 등 다양한 분야에서 활용된다!!

<video> 태그 속성

1. 기본적인 속성

  • controls: 비디오 재생, 멈춤, 음소거 등의 UI 버튼 제공
  • autoplay: 페이지가 로드될 때 자동으로 재생
  • muted: 음소거 상태로 시작
  • loop: 영상이 끝나면 다시 처음부터 반복 재생
  • poster: 영상이 실행되기 전에 보이는 썸네일 이미지

 

2. preload 속성 (비디오를 미리 로드하는 방식)

  • auto: 사용자가 볼지 말지 관계없이 영상을 미리 다운로드, 중요한 영상일 경우 사용
  • metadata: 영상 데이터를 다운로드하지 않고, 길이 등의 메타 정보만 가져옴
  • none: 영상 데이터를 미리 다운로드하지 않음 (트래픽 절약)
<video src="video.mp4" controls autoplay loop muted poster="thumbnail.jpg" preload="auto"></video>

 

<track> 태그 (비디오 자막 추가)

1. 자막 관련 속성

  • srclang: 자막의 언어 (ex. ko → 한국어, en → 영어)
  • label: 사용자가 자막을 선택할 때 보이는 이름

2. 예제 코드

<video controls>
    <source src="video.mp4" type="video/mp4">
    <track src="subtitle_ko.vtt" kind="subtitles" srclang="ko" label="한국어 자막" default>
    <track src="subtitle_en.vtt" kind="subtitles" srclang="en" label="English">
</video>

 

<audio> 태그 속성 정리

1. 기본적인 속성

  • controls: 오디오 재생, 멈춤 등의 UI 버튼 제공
  • autoplay: 페이지가 로드될 때 자동 재생
  •  loop: 끝까지 재생되면 다시 처음부터 반복
  •  muted: 음소거 상태로 시작
  • preload: 비디오와 동일하게 작동

2. 예제 코드

<audio src="audio.mp3" controls autoplay loop muted preload="metadata"></audio>

 

 

웹 개발에서 iframe을 사용하면 하나의 페이지 내에서 다른 HTML 페이지를 불러올 수 있다. 이 기술은 특히 중복되는 코드를 방지하고, 컨텐츠를 동적으로 변경할 때 유용하다. 하지만 최근에는 iframe을 사용하지 않는 경우가 많다.

 

1. iframe이란?

iframeInline Frame의 줄임말로, HTML 문서 내에 다른 HTML 문서를 삽입할 때 사용하는 태그이다. 쉽게 말하자면 iframe 태그는 “프레임”이라고 생각하면 쉽다. 그 “프레임” 안에 다른 HTML 페이지를 띄워놓는 것이다.

 

2. 왜 iframe을 사용할까?

웹 페이지를 만들 때, 여러 페이지에서 동일한 메뉴를 사용해야 하는 경우가 있다. 예를 들어, 상단에 있는 메뉴가 5개이고, 각 메뉴를 클릭할 때마다 다른 페이지를 보여줘야 한다고 가정해 보자. 이때 각 페이지마다 동일한 메뉴 코드를 넣는다면, 메뉴가 늘어날 수록 코드가 길어지고 복잡해진다. 메뉴를 수정하려면 모든 HTML 파일을 수정해야 하는데, 매우 비효율적이다.

이럴 때 iframe을 사용하면, 메뉴는 한 번만 작성하고, 페이지 내에서 다른 내용을 동적으로 바꿀 수 있어서 코드가 훨씬 간단해진다.

 

3. iframe을 어떻게 사용하나?

- iframe 기본 구조 -

<iframe src="불러올_페이지_경로" frameborder="0"></iframe>

src 속성에는 불러오고 싶은 다른 HTML 페이지의 경로를 넣어주면 된다.

예를 들어,

<iframe src="./content.html" frameborder="0"></iframe>

이렇게 하면, 페이지가 로드될 때 ./content.html 파일이 iframe 안에 표시된다.

 

4. iframe을 활용한 메뉴와 콘텐츠 바꾸기

웹 페이지에 메뉴를 추가하고, 메뉴를 클릭할 때마다 iframe 안에 다른 콘텐츠를 보여주고 싶다면 아래의 코드처럼 상단에 메뉴를 만들고 각 메뉴를 클릭하면 그에 맞는 콘텐츠를 iframe 안에 표시되게 할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Menu Example</title>
</head>
<body>
    <div>
        <a href="javascript:changeContent('./content1.html')">menu1</a>
        <a href="javascript:changeContent('./content2.html')">menu2</a>
        <a href="javascript:changeContent('./content3.html')">menu3</a>
    </div>
    <iframe src="./content1.html" id="iframeContent" frameborder="0"></iframe>

    <script>
        function changeContent(path) {
            document.getElementById("iframeContent").src = path;
        }
    </script>
</body>
</html>

 

< 어떻게 작동이 되나? >

1. 메뉴 만들기: 상단에 메뉴를 만들고 각 메뉴를 클릭하면 iframe 안에 다른 HTML 페이지를 불러오는 방식이다.

2. iframe에 콘텐츠 불러오기: 메뉴를 클릭하면, changeContent() 함수가 실행되는데 이 함수는 클릭한 메뉴에 해당하는 HTML 페이지의 경로를 iframesrc 속성에 넣어서 iframe 안에 새로운 콘텐츠가 보이도록 한다.

3. 처음 로드된 페이지: 페이지가 처음 로드될 때는 iframe 안에 ./content1.html 파일이 표시된다.

 

위의 방식으로 메뉴를 클릭할 때마다 상단 메뉴는 그대로 유지되면서, 하단의 iframe 안에만 콘텐츠가 변경된다.

 

5. iframe의 단점

 그러나 iframe은 최근에는 많이 사용되지 않는 기술이다.

  • 보안 문제: iframe 안에서 다른 웹사이트를 불러올 때 보안상의 이유로 제약이 있을 수 있다.
  • 모바일 반응형 디자인: iframe을 사용하면 화면 크기에 맞춰 콘텐츠가 잘 보이지 않는 경우가 많다. 특히 모바일에서는 문제가 될 수 있다.
  • 최근 개발 추세: React, Angular, Vue와 같은 현대적인 웹 프레임워크에서는 iframe 대신 컴포넌트 기반의 동적 렌더링 방식을 사용하고 있다.

  < 목차 >

action 속성 폼 데이터를 전송할 서버 주소 설정
method 속성 데이터를 전송하는 방식 (getpost)
get 방식 URL에 데이터가 포함되어 전송되며, 보안에 취약하고 데이터 크기 제한이 있음
post 방식 데이터가 URL에 포함되지 않고 본문(body)에 담겨 전송되며, 보안성이 높고 데이터 크기 제한이 없음
target 속성 데이터를 전송할 창 지정 (_self, _blank, _parent, _top)
formnovalidate 속성 입력 값의 정합성(유효성) 검사를 생략하는 속성
novalidate 속성 form 태그에 추가하면 폼 전체의 유효성 검사를 하지 않음

 

 <form> 태그와 action 속성

  • <form> 태그는 사용자가 입력한 데이터를 서버로 전송하는 역할을 함
  • action : 데이터를 전송할 서버 주소를 지정
  • <button type="submit"> : 버튼을 클릭하면, 해당 <form> 태그 내의 입력값이 지정된 action 주소로 전송
<form action="전송할 서버 주소" method="get">
    ...
</form>

 

method 속성 (데이터 전송 방식) - get, post

    < get >

  • get : 전송하는 데이터가 URL에 노출
  • 보안에 취약하지만, 페이지 주소를 공유할 때 유용
  • URL에 데이터를 포함해 전송하기 때문에 전송 가능한 데이터 크기에 제한이 있음
  • 데이터가 url에 붙어서 복잡하게 생김.
https://example.com?name=홍길동&email=test@example.com

 

    < post >

  • 전송하는 데이터가 URL에 노출되지 않음
  • 보안적으로 더 안전함
  • 전송할 수 있는 데이터 크기에 제한이 없음
  • 하지만 개발자 도구에서는 확인할 수 있음
  • 따라서, 중요한 정보(비밀번호, 개인 정보)는 반드시 post 방식을 사용하고, 암호화하여 전송하는 것이 좋음
https://example.com/login

 

target 속성 (데이터 전송할 창 지정)

  • _self (기본값): 현재 창에서 전송
  • _blank: 새 창(새 탭)에서 전송
  • _parent: 부모 프레임에서 전송
  • _top: 최상위 프레임에서 전송
<form action="서버주소" method="get" target="_blank">

 

novalidate 속성 (입력값 검증 비활성화)

  • 기본적으로 <input> 필드는 HTML5에서 유효성 검사를 수행함
  • formnovalidate를 버튼에 추가하면 해당 버튼을 클릭해도 유효성 검사를 하지 않음
  • <form> 태그 자체에 novalidate 속성을 추가하면 모든 입력값 검사를 비활성화할 수 있음
<form action="서버주소" method="post" novalidate>
    <button type="submit">검사 수행</button>
    <button type="submit" formnovalidate>검사 안 함</button>
</form>

 

보안 관련 추가 정보

  • HTTPS (https://): HTTP에 Secure(S) 기능이 추가된 것. 데이터를 자동으로 암호화하여 전송함
  • 개발자 도구 (DevTools): 브라우저에서 F12를 누르면 확인 가능
  • 전송되는 데이터, 네트워크 요청 등을 확인할 수 있음
  • post 방식이라도 개발자 도구에서는 확인할 수 있으므로 민감한 데이터는 반드시 암호화해야 함

+ Recent posts