데브포일 홈
WordPress 자동화
Guest
STAGE 12 · Lv.57

CSS 커스터마이징 실전

CSS 선택자 고급 활용, 커스텀 속성(변수), Flexbox/Grid 레이아웃, 애니메이션, 다크 모드, 추가 CSS 활용을 배웁니다.

WordPress에서 CSS 적용하는 방법

CSS 추가 방법 4가지와 선택 기준

WordPress에서 CSS를 추가하는 방법은 여러 가지가 있으며, 상황에 따라 적절한 방법을 선택해야 합니다. 잘못된 방법을 선택하면 유지보수가 어려워지고, 테마 업데이트 시 변경사항이 사라질 수 있습니다.


1. 추가 CSS (커스터마이저) - 외모 → 커스터마이즈 → 추가 CSS에서 작성합니다. 실시간 미리보기가 가능하고, 데이터베이스에 저장되므로 테마 업데이트에 영향받지 않습니다. 소규모 수정(10~50줄)에 적합합니다. 단점은 버전 관리(Git)가 불가능하고, 많은 코드를 넣으면 관리가 어렵습니다.


2. 차일드 테마 style.css - 체계적인 CSS 관리가 가능합니다. Git으로 버전 관리할 수 있고, 파일 에디터로 편집이 편합니다. 중간~대규모 커스터마이징에 권장됩니다. 브라우저 캐시의 혜택도 받습니다.


3. wp_enqueue_style() - functions.php에서 별도 CSS 파일을 등록합니다. 조건부 로딩(특정 페이지에서만), 캐시 버스팅(버전 관리), 의존성 관리가 가능합니다. 가장 프로페셔널한 방법입니다.


4. 페이지 빌더 커스텀 CSS - Elementor, Bricks Builder 등에서 요소별, 페이지별로 CSS를 추가합니다. 해당 페이지에서만 적용되므로 전역 영향이 없습니다.

<?php
// ===== wp_enqueue_style()로 CSS 로드하는 올바른 방법 =====

add_action('wp_enqueue_scripts', 'my_custom_styles');
function my_custom_styles() {
    // 기본 커스텀 CSS
    wp_enqueue_style(
        'custom-main',                                    // 핸들 (고유 이름)
        get_stylesheet_directory_uri() . '/css/main.css', // 파일 경로
        array(),                                          // 의존성 (없으면 빈 배열)
        '1.0.3',                                          // 버전 (캐시 버스팅)
        'all'                                             // 미디어 유형
    );

    // 조건부 로딩: WooCommerce 페이지에서만
    if (class_exists('WooCommerce') && (is_shop() || is_product() || is_cart() || is_checkout())) {
        wp_enqueue_style(
            'custom-woocommerce',
            get_stylesheet_directory_uri() . '/css/woocommerce.css',
            array('custom-main'),  // main.css 이후에 로드
            '1.0.0'
        );
    }

    // 조건부 로딩: 특정 페이지에서만
    if (is_page('contact')) {
        wp_enqueue_style(
            'custom-contact',
            get_stylesheet_directory_uri() . '/css/contact.css',
            array(),
            '1.0.0'
        );
    }

    // Google Fonts 로드
    wp_enqueue_style(
        'google-fonts-pretendard',
        'https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css',
        array(),
        null  // 외부 리소스는 버전 null
    );

    // 인라인 CSS 추가 (동적 스타일에 유용)
    $primary_color = get_theme_mod('primary_color', '#3498db');
    $custom_css = "
        :root {
            --wp-primary: {$primary_color};
        }
        .site-header {
            background-color: {$primary_color};
        }
    ";
    wp_add_inline_style('custom-main', $custom_css);
}

// ===== 불필요한 CSS 제거 (성능 최적화) =====
add_action('wp_enqueue_scripts', 'remove_unnecessary_styles', 20);
function remove_unnecessary_styles() {
    // 블록 라이브러리 CSS 제거 (Gutenberg 안 쓰는 경우)
    // wp_dequeue_style('wp-block-library');

    // 글로벌 스타일 제거
    // wp_dequeue_style('global-styles');

    // 특정 플러그인 CSS 제거 (해당 페이지 외에서)
    if (!is_page('contact')) {
        wp_dequeue_style('contact-form-7');
    }
}
?>
        
🎨
추가 CSS
소규모 수정, 실시간 미리보기
📁
style.css
차일드 테마, Git 관리
enqueue
조건부 로딩, 의존성 관리
🔧
빌더 CSS
요소별 CSS, 페이지 한정

WordPress CSS 선택자 마스터

/* ===== WordPress가 자동 생성하는 body 클래스 ===== */
/* body_class() 함수가 추가하는 클래스들 */

/* 페이지 유형별 */
body.home { }              /* 홈페이지 (블로그 홈 또는 정적 홈) */
body.blog { }              /* 블로그 글 목록 페이지 */
body.single { }            /* 단일 글 */
body.single-post { }       /* 단일 글 (post 타입) */
body.single-portfolio { }  /* 단일 포트폴리오 (CPT) */
body.page { }              /* 페이지 */
body.archive { }           /* 아카이브 (카테고리, 태그, 날짜) */
body.category { }          /* 카테고리 아카이브 */
body.tag { }               /* 태그 아카이브 */
body.author { }            /* 작성자 아카이브 */
body.search { }            /* 검색 결과 */
body.search-no-results { } /* 검색 결과 없음 */
body.error404 { }          /* 404 에러 */
body.attachment { }        /* 첨부파일 */

/* 특정 페이지/글 타겟 */
body.page-id-42 { }              /* ID 42번 페이지만 */
body.postid-100 { }              /* ID 100번 글만 */
body.page-template-custom { }    /* 커스텀 템플릿 사용 페이지 */
body.page-template-template-fullwidth-php { } /* 특정 템플릿 */
body.category-news { }           /* "news" 카테고리 아카이브 */
body.tag-wordpress { }           /* "wordpress" 태그 아카이브 */
body.page-about { }              /* "about" 슬러그 페이지 */

/* 사용자 상태별 */
body.logged-in { }         /* 로그인한 사용자 */
body.admin-bar { }         /* 관리자 도구바 표시 중 */
body.no-customize-support { } /* 커스터마이저 미지원 */

/* WooCommerce 페이지 */
body.woocommerce { }              /* 모든 WooCommerce 페이지 */
body.woocommerce-page { }         /* WooCommerce 페이지 */
body.woocommerce-cart { }         /* 장바구니 */
body.woocommerce-checkout { }     /* 결제 */
body.woocommerce-account { }      /* 내 계정 */
body.single-product { }           /* 단일 상품 */

/* ===== post_class() 활용 ===== */
article.post { }                   /* 모든 글 */
article.type-post { }              /* post 타입 */
article.type-page { }              /* page 타입 */
article.type-portfolio { }         /* portfolio CPT */
article.status-publish { }         /* 공개된 글 */
article.category-tutorial { }      /* tutorial 카테고리 */
article.tag-wordpress { }          /* wordpress 태그 */
article.has-post-thumbnail { }     /* 대표 이미지 있는 글 */
article.sticky { }                 /* 고정 글 (홈페이지 상단 고정) */
article.format-video { }           /* 비디오 형식 */

/* ===== 고급 CSS 선택자 ===== */

/* 속성 선택자 */
a[href^="https://external.com"] {  /* 특정 외부 링크 */
    color: #e74c3c;
}
a[href^="mailto:"] {               /* 이메일 링크 */
    color: #3498db;
}
a[href^="tel:"] {                  /* 전화번호 링크 */
    color: #27ae60;
}
a[href$=".pdf"]::after {           /* PDF 링크 뒤에 아이콘 */
    content: " [PDF]";
    font-size: 0.8em;
    color: #e74c3c;
}
a[href$=".zip"]::after {           /* ZIP 다운로드 표시 */
    content: " [ZIP]";
}
a[target="_blank"]::after {        /* 외부 링크 표시 */
    content: " ↗";
    font-size: 0.7em;
    vertical-align: super;
}

/* 의사 클래스(Pseudo-classes) */
.post-list article:nth-child(odd) { background: #f8f9fa; }
.post-list article:first-child { border-top: none; }
.post-list article:last-child { border-bottom: none; }
.post-list article:nth-child(3n+1) { } /* 3개마다 첫 번째 */
.menu-item:hover > .sub-menu { display: block; }
input:focus { outline: 2px solid var(--color-primary); }
input:invalid { border-color: #e74c3c; }
input:valid { border-color: #27ae60; }
input::placeholder { color: #adb5bd; }

/* :is() - 선택자 그룹화 (코드 간결화) */
:is(h1, h2, h3, h4, h5, h6) {
    font-family: 'Pretendard', sans-serif;
    line-height: 1.3;
    font-weight: 700;
}

/* :where() - is()와 같지만 특정성(specificity)이 0 */
:where(.widget, .sidebar) a {
    color: inherit;  /* 쉽게 오버라이드 가능 */
}

/* :has() - 부모 선택자 (CSS4, 2023+) */
article:has(.post-thumbnail) {
    display: grid;
    grid-template-columns: 200px 1fr;
}
article:has(.post-thumbnail) .entry-content {
    margin-top: 0;
}
.form-group:has(input:invalid) {
    border-color: #e74c3c;
}
.card:has(img) .card-content {
    padding-top: 0;
}

/* :not() - 제외 선택자 */
.widget:not(:last-child) {
    margin-bottom: 2rem;
}
a:not([href^="#"]):not([href^="javascript"]) {
    /* 진짜 링크만 스타일링 */
}
.nav-menu li:not(.menu-item-has-children) > a {
    /* 서브메뉴 없는 메뉴 항목만 */
}

/* :focus-visible - 키보드 포커스만 (마우스 클릭 제외) */
a:focus-visible,
button:focus-visible {
    outline: 3px solid #3498db;
    outline-offset: 2px;
}

/* ::selection - 텍스트 선택 시 */
::selection {
    background: #3498db;
    color: #ffffff;
}

/* ::marker - 목록 마커 */
ul li::marker {
    color: var(--color-primary);
    font-size: 1.2em;
}

/* ::first-letter - 첫 글자 (드롭캡) */
.entry-content > p:first-of-type::first-letter {
    font-size: 3em;
    font-weight: 700;
    float: left;
    line-height: 1;
    margin-right: 0.1em;
    color: var(--color-primary);
}
        
🔒
여기까지는 미리보기입니다
CSS 커스터마이징 실전
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)