html

전체 31 / 2 페이지
함수 안에 숨겨진 비밀​JavaScript에서 가장 독특한 개념 중 하나가 클로저(Closure) 입니다. 클로저란 함수가 선언될 때의 스코프를 기억하여, 외부 함수가 종료된 이후에도 그 변수에 접근할 수 있는 기능을 말합니다. 예시function counter() { let count = 0; return function() { count++; return count; };}const inc = counter();console.log(inc()); // 1console.log(inc()); // 2이 코드에서 count 변수는 counter 함수가 끝났음에도 사라지지 않고 내부 함수에서 계속 사용됩니다. 활용 사례 데이터 은닉 (private 변수처럼 사용) 상태 유지 모듈 패턴 구현클로저는 처음엔 이해하기 어렵지만, JavaScript의 동작 원리를 이해하는 핵심입니다. React 훅 같은 프레임워크도 클로저 개념 위에서 동작합니다.
719 조회
2025.09.07 등록
효율적인 데이터 처리의 핵심JavaScript 개발을 하다 보면 가장 많이 사용하는 자료형이 배열(Array) 과 객체(Object) 입니다. 데이터를 구조적으로 다루기 위해서는 이 두 가지를 능숙하게 활용할 수 있어야 합니다.배열 메서드배열에는 유용한 메서드가 많습니다.const numbers = [1, 2, 3, 4, 5];const doubled = numbers.map(n => n * 2); // [2,4,6,8,10]const even = numbers.filter(n => n % 2 === 0); // [2,4]const sum = numbers.reduce((acc, n) => acc + n, 0); // 15이렇게 하면 반복문을 직접 작성하지 않고도 데이터를 가공할 수 있습니다.객체 다루기객체는 키-값 구조로 데이터를 저장합니다.const user = { name: "홍길동", age: 30 };console.log(user.name); // 홍길동또한 구조 분해 할당을 이용하면 더 간결하게 사용할 수 있습니다.const { name, age } = user;console.log(name, age);배열과 객체를 자유자재로 다룰 수 있어야 효율적인 코드 작성이 가능합니다. 특히 map, filter, reduce는 필수적으로 익혀야 하는 메서드입니다.
581 조회
2025.09.07 등록
서버와 데이터를 주고받는 표준 방식웹 개발에서 가장 중요한 작업 중 하나는 서버와의 통신입니다. 과거에는 XMLHttpRequest(XHR)를 사용했지만, 문법이 복잡하고 직관적이지 않았습니다. 이를 대체하는 것이 fetch API입니다.기본 사용법fetch("https://jsonplaceholder.typicode.com/posts/1") .then((response) => response.json()) .then((data) => console.log(data)) .catch((error) => console.error("에러:", error));이렇게 하면 API에서 JSON 데이터를 불러와 출력할 수 있습니다. async/await와 함께 쓰기async function loadPost() { try { const res = await fetch("https://jsonplaceholder.typicode.com/posts/1"); const data = await res.json(); console.log(data); } catch (err) { console.error("에러 발생:", err); }}이 방식은 에러 처리까지 깔끔하게 할 수 있습니다. POST 요청 보내기fetch("https://jsonplaceholder.typicode.com/posts", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title: "새 글", body: "내용", userId: 1 })}).then(res => res.json()).then(data => console.log(data));fetch API는 직관적이고 강력한 표준 도구입니다. REST API, GraphQL, JSON 데이터를 다룰 때 반드시 알아야 할 기술입니다.
710 조회
2025.09.07 등록
멈추지 않는 웹의 비밀​JavaScript의 가장 중요한 특징 중 하나는 비동기 처리(Asynchronous Processing) 입니다. 일반적으로 코드는 한 줄씩 순서대로 실행되지만, 웹에서는 서버와 데이터를 주고받거나 파일을 읽는 작업처럼 시간이 오래 걸리는 일이 많습니다. 이런 작업을 동기적으로 처리하면 브라우저가 멈추는 문제가 발생합니다. 이를 해결하는 기술이 비동기 처리입니다. 콜백 함수의 한계 과거에는 비동기 처리를 위해 콜백 함수를 사용했습니다.setTimeout(() => { console.log("3초 후 실행");}, 3000);하지만 콜백이 중첩되면 코드가 복잡해져서 콜백 지옥(callback hell) 이라는 문제가 생깁니다.Promise의 등장Promise는 콜백 문제를 해결하기 위해 도입된 개념입니다.function getData() { return new Promise((resolve) => { setTimeout(() => resolve("데이터 로드 완료"), 2000); });}getData().then((result) => console.log(result));Promise는 “미래에 완료될 작업”을 표현하며, .then() 체인을 이용해 결과를 처리합니다.async/await – 가장 직관적인 방식ES8에서는 async/await 문법이 추가되어 비동기 처리를 더 깔끔하게 표현할 수 있습니다.async function fetchData() { const data = await getData(); console.log(data);}fetchData();이렇게 작성하면 비동기 코드도 동기 코드처럼 읽히기 때문에 가독성이 좋아집니다.실무 활용 예시 API 요청 및 응답 처리 대용량 파일 업로드/다운로드 애니메이션과 타이머 처리비동기 처리는 JavaScript가 브라우저 환경에서 사랑받는 이유 중 하나입니다. Promise와 async/await 문법을 자유자재로 다룰 수 있어야 현대적인 웹 개발에 참여할 수 있습니다.
665 조회
2025.09.07 등록
사용자와 소통하는 웹의 핵심 기술​웹사이트를 단순히 “보여주는 공간”이라고 생각하면 오해입니다. 진짜 웹은 사용자가 클릭하거나 입력하는 순간부터 시작됩니다. 이러한 사용자 행동을 감지하고 반응하도록 만드는 기술이 바로 이벤트 처리(Event Handling) 입니다. JavaScript에서 이벤트 처리를 익히면, 버튼을 클릭할 때 알림을 띄우거나 입력값을 실시간으로 확인하는 등 동적인 상호작용을 구현할 수 있습니다. 이벤트의 기본 개념 이벤트란 사용자의 동작(클릭, 스크롤, 입력 등)이나 시스템에서 발생하는 사건을 의미합니다. HTML 요소에 특정 이벤트가 발생했을 때 실행할 동작을 미리 정의하는 것이 이벤트 처리입니다. 예를 들어, 버튼을 클릭하면 경고창을 띄우는 간단한 코드를 보겠습니다.<button id="btn">눌러보세요</button><script> const button = document.getElementById("btn"); button.addEventListener("click", () => { alert("버튼이 클릭되었습니다!"); });</script>이렇게 addEventListener를 사용하면 특정 요소에 원하는 이벤트를 연결할 수 있습니다.주요 이벤트 종류 마우스 이벤트: click, dblclick, mouseover, mouseout 키보드 이벤트: keydown, keyup, keypress 폼 이벤트: input, change, submit 윈도우 이벤트: load, resize, scroll 예를 들어, 사용자가 입력창에 글자를 입력할 때마다 실시간으로 미리보기 텍스트를 업데이트하려면 다음과 같이 작성합니다.<input id="nameInput" placeholder="이름을 입력하세요"><p id="preview"></p><script> const input = document.getElementById("nameInput"); const preview = document.getElementById("preview"); input.addEventListener("input", () => { preview.innerText = `안녕하세요, ${input.value}!`; });</script>이벤트 위임(Event Delegation)실무에서 자주 등장하는 패턴이 바로 이벤트 위임입니다. 많은 요소 각각에 이벤트를 붙이는 대신, 부모 요소 하나에만 이벤트를 걸어 효율적으로 관리하는 방식입니다.<ul id="menu"> <li>메뉴 1</li> <li>메뉴 2</li> <li>메뉴 3</li></ul><script> const menu = document.getElementById("menu"); menu.addEventListener("click", (e) => { if (e.target.tagName === "LI") { alert(`${e.target.innerText} 선택됨`); } });</script>이렇게 하면 li가 몇 개가 되든, 하나의 이벤트 핸들러로 모두 처리할 수 있습니다.이벤트 처리는 웹 개발에서 사용자 경험(UX) 을 결정짓는 핵심입니다. 단순히 코드를 실행하는 것을 넘어, 사용자와 소통하고 인터랙션을 제공하는 기술입니다. 기본 이벤트부터 이벤트 위임까지 익혀두면 실무에서 훨씬 깔끔하고 효율적인 코드를 작성할 수 있습니다.
634 조회
2025.09.07 등록
웹페이지를 살아 움직이게 만드는 기술​JavaScript를 공부할 때 가장 먼저 마주하는 개념 중 하나가 바로 DOM(Document Object Model) 조작입니다. DOM은 간단히 말해 HTML 문서를 객체 형태로 표현한 구조입니다. HTML 태그 하나하나가 JavaScript에서 접근할 수 있는 객체로 변환되며, 이를 이용하면 웹페이지의 내용을 바꾸거나 스타일을 적용할 수 있습니다. 예를 들어, 버튼을 누르면 글자가 바뀌도록 만들고 싶다고 합시다. HTML에 <p id="text">안녕하세요</p> 라는 요소가 있다면, JavaScript에서는 이렇게 접근할 수 있습니다.document.getElementById("text").innerText = "반갑습니다!";이 한 줄의 코드로, 웹페이지의 글자가 즉시 변경됩니다. 이것이 바로 DOM 조작의 힘입니다.DOM 접근 방법 getElementById – 특정 ID를 가진 요소 선택 getElementsByClassName – 같은 클래스를 가진 요소들 선택 querySelector – CSS 선택자 방식으로 요소 선택 querySelectorAll – CSS 선택자와 일치하는 모든 요소 선택 이러한 선택자를 이용해 원하는 HTML 태그에 접근한 뒤, innerText, innerHTML, style, classList 등을 조작해 다양한 효과를 줄 수 있습니다.DOM 조작 활용 예시 버튼 클릭 시 특정 영역 보이기/숨기기 입력창에 글자를 입력하면 실시간으로 미리보기 출력 웹페이지 테마를 버튼 하나로 다크 모드/라이트 모드 전환 동적으로 새로운 요소 추가 및 삭제 과거에는 DOM 조작이 꽤 번거로웠지만, 지금은 표준화된 API 덕분에 비교적 단순하게 사용할 수 있습니다. jQuery 같은 라이브러리 없이도 충분히 다양한 기능을 구현할 수 있죠.DOM 조작은 JavaScript의 핵심 중 하나이며, “웹페이지를 동적으로 만든다”는 말은 곧 DOM을 다룬다는 의미입니다. 기본적인 선택자와 속성 변경법만 익혀도 훨씬 풍부한 사용자 경험을 제공할 수 있습니다.
704 조회
2025.09.07 등록
창의적인 디자인 기법​최근 웹 디자인에서는 단순한 네모·원 형태를 넘어 다양한 모양의 이미지와 요소가 등장합니다. 이를 가능하게 하는 것이 clip-path와 masking입니다. clip-path 기본 예시.image { clip-path: circle(50%);}위 코드는 이미지를 원형으로 잘라냅니다. 다양한 형태 polygon()을 활용해 다각형 모양 자르기 inset()으로 사각형 일부만 보이게 하기 SVG를 이용한 복잡한 마스킹 효과 활용 사례 독특한 이미지 배치 버튼, 배너의 개성 있는 형태 창의적인 애니메이션 효과clip-path와 masking은 아직 생소할 수 있지만, 한 번 익혀두면 남들과 차별화된 디자인을 만들 수 있습니다. 현대적인 웹사이트에서 점점 더 많이 활용되는 기법입니다.
853 조회
2025.09.07 등록
화면 위계의 비밀​웹사이트에는 여러 요소가 겹치는 상황이 많습니다. 모달창, 드롭다운 메뉴, 배너 등이 그 예입니다. 이때 어떤 요소가 위로 올라올지를 결정하는 속성이 바로 z-index입니다. 기본 문법.modal { position: fixed; top: 0; left: 0; z-index: 9999;}z-index 값이 큰 요소가 작은 요소보다 위에 표시됩니다. 주의할 점 z-index는 position 속성이 있어야만 적용됩니다. 부모 요소의 z-index가 자식에게 영향을 미칩니다.z-index를 올바르게 이해하지 못하면 모달창이 버튼 뒤에 숨어버리는 등의 문제가 생깁니다. 레이어 관리의 핵심은 position과 z-index의 관계를 명확히 이해하는 것입니다.
713 조회
2025.09.07 등록
HTML 수정 없이 디자인 강화:hover, :active, ::before, ::after 같은 의사 클래스와 요소는 HTML 구조를 바꾸지 않고도 다양한 효과를 줄 수 있는 도구입니다.예시 – 장식 추가h1::before { content: "★ "; color: gold;}제목 앞에 별 모양을 추가할 수 있습니다. 활용 사례 강조선, 구분선 추가 아이콘 삽입 버튼 효과 글자 강조Pseudo 클래스와 요소는 단순하지만 강력한 CSS 도구입니다. 작은 변화만으로도 사이트를 세련되게 꾸밀 수 있습니다.
711 조회
2025.09.07 등록
부드러운 인터랙션 만들기​웹사이트는 단순히 정적인 화면이 아니라, 사용자와의 상호작용을 통해 더 매력적으로 보일 수 있습니다. 이를 가능하게 해주는 것이 transition과 animation입니다. Transition 예시.button { background: #3498db; transition: background 0.3s ease;}.button:hover { background: #2ecc71;}버튼에 마우스를 올렸을 때 색이 부드럽게 변합니다. Animation 예시@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; }}.box { animation: fadeIn 1s ease-in-out;}페이지 로딩 시 박스가 자연스럽게 나타납니다.애니메이션은 과하면 산만하지만, 적절히 사용하면 사용자 경험을 크게 향상시킵니다. 버튼 hover, 페이지 전환, 로딩 애니메이션 등에 적극 활용해 보세요.
735 조회
2025.09.07 등록
자유로운 배치의 핵심​웹 요소를 원하는 위치에 배치할 때 가장 중요한 속성이 바로 position입니다. relative, absolute, fixed, sticky를 적절히 활용하면 복잡한 레이아웃도 손쉽게 구현할 수 있습니다. 주요 속성 정리 relative: 자기 자신의 원래 위치를 기준으로 이동 absolute: 부모 중 position이 설정된 요소를 기준으로 배치 fixed: 브라우저 화면을 기준으로 고정 (예: 상단 네비게이션) sticky: 스크롤 시 특정 지점에서 고정 예시 – 고정 네비게이션nav { position: sticky; top: 0; background: white;}이렇게 하면 스크롤할 때 네비게이션이 상단에 붙어서 따라다니게 됩니다.position 속성은 단순한 배치를 넘어 UX를 개선하는 데 중요한 역할을 합니다. 모달창, 툴팁, 네비게이션 등 다양한 UI 요소를 만들 때 꼭 필요한 개념입니다.
701 조회
2025.09.07 등록
유지보수를 쉽게 만드는 도구​CSS도 점점 더 복잡해지고 있습니다. 색상, 폰트 크기, 여백 값 등이 여러 군데에 반복되면 유지보수가 어려워집니다. 이때 강력한 도구가 바로 CSS 변수(Custom Properties) 입니다. CSS 변수 기본 문법:root { --main-color: #3498db; --font-size-lg: 18px;}.button { background-color: var(--main-color); font-size: var(--font-size-lg);}:root는 문서 전체에서 사용할 수 있는 전역 변수를 의미합니다. var(--변수명)으로 불러옵니다.장점 사이트 전체 색상/폰트 일괄 변경 가능 다크 모드 지원: 변수를 재정의하여 테마 전환 가능 유지보수성 향상: 한 번만 수정해도 전체 적용:root { --bg-color: white; --text-color: black;}body { background: var(--bg-color); color: var(--text-color);}.dark-theme { --bg-color: black; --text-color: white;}위 코드를 사용하면 body에 .dark-theme 클래스를 붙이는 것만으로 다크 모드가 구현됩니다.CSS 변수는 단순한 편의 기능을 넘어 디자인 시스템을 만드는 핵심 도구입니다. 유지보수를 쉽게 하고, 테마 변경을 간단하게 만들며, 현대적인 웹 개발에서 빼놓을 수 없는 기술입니다.
619 조회
2025.09.07 등록
다양한 기기에 맞추는 웹의 기본​오늘날 대부분의 사용자는 스마트폰으로 웹사이트에 접속합니다. 하지만 여전히 데스크톱과 태블릿도 무시할 수 없습니다. 따라서 웹사이트는 어떤 화면 크기에서도 잘 보여야 하는데, 이를 가능하게 해주는 기술이 바로 반응형 디자인(Responsive Design) 입니다. 미디어 쿼리 기본 반응형 디자인의 핵심은 미디어 쿼리(media query) 입니다. 화면 크기에 따라 다른 CSS를 적용할 수 있습니다.@media (max-width: 768px) { .container { flex-direction: column; }}위 코드는 화면 폭이 768px 이하일 때 .container의 레이아웃을 세로 방향으로 전환합니다.반응형 디자인 원칙 유동적 단위 사용: px 대신 %, em, rem, vw, vh 같은 단위 사용 이미지와 동영상 크기 제어: max-width: 100%로 부모 요소를 넘지 않도록 설정 브레이크포인트 설정: 일반적으로 모바일(≤768px), 태블릿(769~1024px), 데스크톱(1025px 이상)img { max-width: 100%; height: auto;}이렇게 설정하면 이미지는 화면 크기에 따라 자동으로 줄어듭니다. 반응형 그리드 예시.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px;}이 코드는 화면 크기에 따라 카드 개수를 자동으로 조정하여, 모바일에서는 1열, 데스크톱에서는 3열 이상으로 보이게 만듭니다.반응형 디자인은 이제 선택이 아니라 필수입니다. 모바일 사용자 경험을 고려하지 않는 웹사이트는 경쟁력을 잃게 됩니다. 미디어 쿼리와 유동적 단위 사용법만 익혀도 반응형 디자인의 기본을 구현할 수 있습니다.
578 조회
2025.09.07 등록
2차원 레이아웃의 완벽한 해법​웹사이트 레이아웃을 만들 때 Flexbox만으로도 충분히 많은 문제를 해결할 수 있습니다. 하지만 더 복잡한 레이아웃을 구현해야 할 때는 CSS Grid가 강력한 무기가 됩니다. Grid는 Flexbox와 달리 2차원 레이아웃(행과 열 동시 제어) 을 지원하기 때문에, 페이지 전체 구조를 설계할 때 특히 유용합니다. Grid의 기본 개념 Grid는 부모 요소에 display: grid;를 선언하면서 시작합니다. 부모는 grid 컨테이너가 되고, 자식은 grid 아이템이 됩니다. 그 후 grid-template-columns, grid-template-rows 속성을 이용하여 레이아웃을 정의할 수 있습니다..container { display: grid; grid-template-columns: 200px 1fr 200px; grid-template-rows: 100px auto 50px; gap: 20px;}위 코드는 좌측 사이드바(200px), 본문(자동 확장), 우측 사이드바(200px), 상단 헤더(100px), 본문(자동), 하단 푸터(50px)를 손쉽게 구성합니다. 과거에는 이런 구조를 만들기 위해 float나 복잡한 div 중첩을 사용해야 했지만, Grid는 몇 줄의 코드로 해결합니다.Flexbox와의 차이점 Flexbox: 한 방향(가로 또는 세로)으로 정렬하는 1차원 레이아웃 Grid: 행과 열을 동시에 다루는 2차원 레이아웃 즉, Flexbox는 콘텐츠 중심, Grid는 레이아웃 중심이라고 볼 수 있습니다. 실무에서는 두 가지를 함께 쓰는 경우가 많습니다.반응형에 강력한 GridGrid는 repeat(), minmax(), auto-fit 같은 기능을 통해 반응형 디자인을 구현하기 쉽습니다..container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;}위 코드는 화면 크기에 따라 아이템 개수를 자동으로 조정합니다. 작은 화면에서는 1~2열, 큰 화면에서는 여러 열로 자연스럽게 배치됩니다.장점 복잡한 레이아웃을 단순하게 정의 반응형 웹에 최적화된 속성 제공 유지보수가 쉽고 직관적인 코드Flexbox가 웹 개발자에게 자유를 줬다면, CSS Grid는 웹 레이아웃 설계의 새로운 차원을 열어주었습니다. 대시보드, 잡지형 웹사이트, 쇼핑몰 상품 배치 같은 복잡한 페이지는 Grid 없이는 구현이 어렵습니다. 웹 개발을 한다면 Flexbox와 Grid를 모두 익혀 상황에 맞게 활용하는 것이 최선의 선택입니다.
616 조회
2025.09.07 등록
웹 레이아웃의 혁명​웹 개발을 하다 보면 가장 자주 부딪히는 문제 중 하나가 바로 레이아웃 정렬입니다. 특히 화면 중앙 정렬, 아이템 간격 맞추기, 세로·가로 정렬 등은 초보 개발자뿐만 아니라 숙련자에게도 번거로운 작업이었습니다. 예전에는 float, inline-block, table 같은 속성을 조합하여 억지로 맞추곤 했습니다. 하지만 이 방식은 코드가 복잡하고 유지보수가 어렵다는 단점이 있었습니다. 이 문제를 근본적으로 해결해 준 것이 바로 Flexbox(Flexible Box Layout) 입니다. Flexbox는 CSS3에서 등장한 레이아웃 모듈로, 단순하면서도 강력한 정렬 방식을 제공합니다. 지금은 거의 모든 프로젝트에서 기본적으로 활용될 정도로 널리 사용되고 있으며, "웹 레이아웃의 혁명"이라고 불러도 과언이 아닙니다.Flexbox의 기본 개념Flexbox는 부모 요소와 자식 요소의 관계를 바탕으로 작동합니다. 부모 요소에 display: flex;를 선언하면 해당 부모는 flex 컨테이너(flex container) 가 되고, 그 안의 모든 자식 요소는 flex 아이템(flex item) 이 됩니다. 이후 다양한 속성을 이용해 컨테이너 안에서 아이템의 정렬, 배치, 간격 등을 손쉽게 제어할 수 있습니다.주요 속성 살펴보기flex-direction 아이템을 배치할 방향을 결정합니다. row (기본값): 가로 방향 (왼쪽 → 오른쪽) row-reverse: 가로 방향 (오른쪽 → 왼쪽) column: 세로 방향 (위 → 아래) column-reverse: 세로 방향 (아래 → 위).container { display: flex; flex-direction: row; /* 가로 배치 */}justify-content 주축(가로 또는 세로) 방향으로 아이템을 어떻게 정렬할지 설정합니다. flex-start: 시작점 정렬 flex-end: 끝점 정렬 center: 중앙 정렬 space-between: 양 끝에 붙이고 중간은 균등 간격 space-around: 모든 아이템에 균등 여백 부여.container { display: flex; justify-content: space-between;}align-items 교차축(가로·세로 반대 방향)에서 아이템을 정렬합니다. flex-start: 위쪽 정렬 flex-end: 아래쪽 정렬 center: 중앙 정렬 stretch: 기본값, 아이템을 컨테이너 높이에 맞게 늘림.container { display: flex; align-items: center;}flex-wrap 아이템이 컨테이너를 벗어날 경우 줄바꿈 여부를 결정합니다. nowrap (기본값): 줄바꿈 없음 wrap: 자동 줄바꿈 허용 wrap-reverse: 줄바꿈 시 반대 방향으로 배치 .container { display: flex; flex-wrap: wrap;}중앙 정렬의 간단한 해결책 웹 개발자들이 가장 자주 검색하는 내용 중 하나가 바로 "가운데 정렬"입니다. 기존에는 absolute + transform 등을 조합해야 했지만, Flexbox라면 단 두 줄로 해결됩니다..container { display: flex; justify-content: center; /* 가로 중앙 */ align-items: center; /* 세로 중앙 */}반응형 디자인과 FlexboxFlexbox는 반응형 웹 디자인과도 궁합이 뛰어납니다. flex-wrap과 flex-basis를 적절히 활용하면 화면 크기에 따라 자동으로 줄바꿈이 되거나 아이템 크기가 조정됩니다. 예를 들어 카드 형태의 갤러리 레이아웃을 만들 때 Flexbox는 훨씬 직관적이고 간단한 코드를 제공합니다..card-container { display: flex; flex-wrap: wrap; gap: 20px;}.card { flex: 1 1 calc(33.333% - 20px); /* 3열 레이아웃 */}@media (max-width: 768px) { .card { flex: 1 1 100%; /* 모바일에서는 1열 */ }}Flexbox의 장점 코드 단순화: 불필요한 해킹 기법이나 복잡한 마크업 없이도 정렬이 가능하다. 높은 가독성: 속성 이름만 봐도 역할이 직관적이다. 강력한 호환성: IE10 이상 대부분의 브라우저에서 지원된다. 반응형에 최적화: 화면 크기에 따라 유연하게 대응할 수 있다.
650 조회
2025.09.07 등록
홈으로 전체메뉴
전체 검색
회원가입