목차
1. 그룹화된 모듈화
1.1 모범 사례
CSS는 프로그래밍 언어가 아니기 때문에 변수, 함수 선언, 판단, 루프 및 계산을 할 수 없으며 중첩될 수 없기 때문에 글쓰기 스타일이 비효율적이고 지루합니다.
CSS를 진정한 의미에서 모듈화 기능을 가지게 하려면, 당분간 언어 수준에서는 고려할 수 없으므로 관점에서만 실현 가능합니다. 도구의.
프론트엔드 컴포넌트화의 발전과 함께 React, Vue 등 컴포넌트화 프레임워크의 업데이트가 서서히 발전하여 전체 컴포넌트의 리소스를 캡슐화하고 객체를 외부 세계에 노출하면 호출자는 구성 요소의 내부 구현과 리소스에 대해 신경 쓸 필요가 없습니다. 객체를 직접 호출하는 것만으로도 충분합니다.
3.1 styled-jsx
3.1.1 安装工具(babel 转码所需)
3.1.2 配置 babel plugins(如 .babelrc
3.1.3 添加源文件代码
3.1.4 转码
3.1.5 运行
웹 프론트엔드 CSS 튜토리얼 CSS 모듈성이란 무엇입니까? CSS 모듈성을 구현하는 방법

CSS 모듈성이란 무엇입니까? CSS 모듈성을 구현하는 방법

Sep 17, 2018 pm 02:18 PM
css javascript 프런트 엔드

이 기사의 내용은 CSS 모듈성이란 무엇입니까? CSS 모듈화 구현 방법에는 특정 참고 가치가 있습니다. 도움이 필요한 친구가 참고할 수 있기를 바랍니다.

CSS Modularity

CSS(Cascading Style Sheets)는 처음부터 프로그래밍이 불가능하다고 규정되어 있으며, HTML 요소를 수정하기 위한 간단한 CSS 스타일 시트로만 사용할 수 있습니다. .

그러나 프론트엔드 개발과 함께 프론트엔드 프로젝트는 점점 더 크고 복잡해졌고, 커뮤니티에서는 프론트엔드 코드(js/css/html)와 리소스(이미지, 글꼴, . ..).

이 과정에서 커뮤니티는 js(amd, commonjs, es6)의 모듈성을 탐구했습니다. 이제 js를 사용하여 대규모 프로젝트를 개발하는 것은 쉽지만 CSS의 모듈성은 아직 특별히 인기가 없었습니다.

1. 그룹화된 모듈화

이것은 CSS 모듈화의 가장 초기 구현이자 가장 중요한 방법이기도 합니다. 현재 많은 구성 요소와 개발자가 이러한 방식으로 개발됩니다.

그룹화된 모듈화는 모듈화의 목적을 달성하기 위해 스타일 그룹화 및 파일 청크를 달성하기 위해 다양한 의미를 나타내는 다양한 접두사와 함께 이름 지정을 사용하는 것입니다.

예:

# 目录结构
|-- one/page/css/ 某个页面的 css 目录
    |-- common.css 通用的 css
    |-- page1/ 单页面1
        |-- section1.css 区域1 css
        |-- section2.css 区域2 css
    |-- page2/ 单页面2
    |-- ...
    
# common.css 文件
.c-el-1 {
    ...
}
.c-el-2 {
    ...
}    
...    
    
# page1/section1.css 文件
.page1-section1 {
    ...
}
.page1-section1 .el-1 {
    ...
}    
.page1-section1 .el-2 {
    ...
}    
...

# page1/section2.css 文件
.page1-section2 {
    ...
}
.page1-section2 .el-1 {
    ...
}    
.page1-section2 .el-2 {
    ...
}    
...
로그인 후 복사

이 방법은 전역 충돌을 피할 수 없기 때문에 진정한 의미에서 모듈화되지 않지만 기본 CSS는 저는 프로그래밍 능력이 없어서 이런 문제는 피할 수 없습니다. 그룹화는 진정한 의미에서 모듈식은 아니지만 CSS에서 벗어나지는 않습니다. 이는 기본 메커니즘이므로 CSS 파일을 내보낼 때 많은 타사 구성 요소가 이 방법을 사용합니다.

예를 들어 ant- 접두사는 ant-design이 내보낸 CSS에 사용되고, mui- 접두사는 mui가 내보낸 CSS에 사용됩니다.

1.1 모범 사례

Css 명명 그룹화는 CSS가 탄생할 때부터 오랫동안 실천되어 왔기 때문에 NetEase의 CSS 사양 프레임워크 NEC 및 H-ui와 같이 커뮤니티가 매우 성숙해졌습니다.

보충 사항:

CSS 파일은 너무 커서는 안 됩니다. @import를 사용하여 파일을 블록으로 나눌 수 있습니다.

스타일 렌더링에 #id [attr]를 사용하지 말고 .class를 사용해 보세요. js 라이브러리를 사용하여 dom을 운영할 경우 .class를 사용하지 말고 $('#main'), $('[data-tab="1"]')과 같은 #id 데이터 세트를 사용해보세요.

<ul>
    <li data-tab="1">tab1</li>
    <li data-tab="2">tab2</li>
</ul>
<p data-tab-container="1"></p>
<p data-tab-container="2"></p>
로그인 후 복사

1.2 CSS 언어 확장

CSS는 프로그래밍 언어가 아니기 때문에 변수, 함수 선언, 판단, 루프 및 계산을 할 수 없으며 중첩될 수 없기 때문에 글쓰기 스타일이 비효율적이고 지루합니다.

이 문제를 해결하기 위해 커뮤니티에서는 주로 탐색 중에 less와 sass라는 두 가지 확장 언어를 파생했습니다. 이들은 CSS와 호환되며 주로 다음 기능을 가져옵니다.

선언할 수 있습니다. 변수 및 함수를 사용하여 간단한 계산, 판단 및 루프를 수행할 수 있습니다.

선택기를 중첩하여 작성 내용을 저장하고 가독성을 높일 수 있습니다.

.page1-section1 {
    ...
    
    .el-1 {
        ...
        
        .el-1-1 {
            ...
        }
    }
        
    .el-2 {
        ...
    }   
}
로그인 후 복사

@import는 반복되는 가져오기 문제를 방지하므로 안심하고 다른 제품을 가져올 수 있습니다. 그리고 대담한 문서.

모듈 관점에서 less와 sass는 CSS의 기능만 확장할 뿐, 전역 명명 충돌 문제가 여전히 존재하기 때문에 언어 수준에서 모듈화를 구현하지 않습니다.

2. 모듈화(js 객체로 내보내기)

CSS를 진정한 의미에서 모듈화 기능을 가지게 하려면, 당분간 언어 수준에서는 고려할 수 없으므로 관점에서만 실현 가능합니다. 도구의.

현재 더 좋은 방법은 js를 사용하여 CSS 파일을 로드하고, CSS 콘텐츠를 객체로 내보내고, js를 사용하여 전체 DOM 트리를 렌더링하고 해당 스타일을 해당 요소에 일치시키는 것입니다. 모듈화를 달성하기 위해 CSS에서 추가 처리를 수행할 수 있는 기회입니다.

예:

소스 파일

# style.css 文件
.className {
  color: green;
}

# js 文件
import styles from "./style.css";

element.innerHTML = '<p class="&#39; + styles.className + &#39;">Hello!</p>';
로그인 후 복사

actual effect

# style.css 文件
._23_aKvs-b8bW2Vg3fwHozO {
  color: green;
}

# DOM
<p class="_23_aKvs-b8bW2Vg3fwHozO">Hello!</p>
로그인 후 복사
이 변환 프로세스에서는 파일의 위치와 콘텐츠를 기반으로 전역적으로 고유한 base64 문자열이 생성되어 원본을 대체합니다. 이름은 전역 명명 충돌 문제를 방지하여 모듈화 목적을 달성합니다. 따라서 개발 과정에서 글로벌 스타일 충돌 문제가 발생하지 않습니다.

# common.css 文件
.container {
    ...
}
.el1 {
    ...
}
.el2 {
    ...
}    
...    
    
# page1/section1.css 文件
.container {
    ...
}
.title {
    ...
}    
.content {
    ...
}    
...

# page2/section1.css 文件
.container {
    ...
}
.title {
    ...
}    
.content {
    ...
}
...
로그인 후 복사

CSS 모듈성에 대한 정의는 css-modules를 참조하세요. CSS 작성을 위한 주요 요구 사항은 다음과 같습니다.

1 #id [attr] 대신 .class를 사용해야 합니다(.class만 속성으로 내보낼 수 있기 때문). ;

2.class-name 대신 .className으로 작성하는 것이 좋습니다(전자는 styles.className을 통해 액세스할 수 있고 후자는 styles['class-name']를 통해 액세스해야 함). ).

더 많은 기능을 보려면 CSS 모듈을 확인하세요.

물론 이 기능을 사용하려면 빌드 도구의 지원이 필요합니다. webpack을 사용하여 프로젝트를 빌드하는 경우 css-loader를 사용하고 options.modules를 true로 설정하여 모듈식 기능을 사용할 수 있습니다.

3. 모듈화(내장 js, 바인딩 컴포넌트)

프론트엔드 컴포넌트화의 발전과 함께 React, Vue 등 컴포넌트화 프레임워크의 업데이트가 서서히 발전하여 전체 컴포넌트의 리소스를 캡슐화하고 객체를 외부 세계에 노출하면 호출자는 구성 요소의 내부 구현과 리소스에 대해 신경 쓸 필요가 없습니다. 객체를 직접 호출하는 것만으로도 충분합니다.

比如(以 react 为例),一个 Welcome 组件,包括一个 js 文件、一个 css 文件、图片:

# Welcome 组件
|-- welcome.js
|-- welcome.css
|-- images/
로그인 후 복사

welcome.js 中便可如下加载(使用“导出为 js 对象”的 css 模块化):

import styles from './welcome.css';
import image1 from './images/1.jpg';
로그인 후 복사

其实,还有另外一种思路,就是将 css 内置 js 中,成为 js 的一部分。

这样做的目的,一是 css 的模块化,二是直接绑定到组件上。

比如,material-ui、styled-jsx、jss、vue style scoped 便是使用的这种方式。

这种方式的实现有很多种,这里主要介绍一下 styled-jsx。

3.1 styled-jsx

styled-jsx 的原理是根据当前文件的位置、内容生成一个全局唯一的标识,然后把这个标识追加到组件每一个元素上,每一个样式选择器上,达到模块化的目的。

可以参考官方文档,查看详细的用法,我在这里给个例子:

3.1.1 安装工具(babel 转码所需)

npm install --save styled-jsx
로그인 후 복사

3.1.2 配置 babel plugins(如 .babelrc

{
  "plugins": [
    "styled-jsx/babel"
  ]
}
로그인 후 복사

3.1.3 添加源文件代码

hello.js

export default () => (
    <div className={&#39;container&#39;}>
        <p className={&#39;hello&#39;}>Hello! Hello!</p>
        <div id={&#39;hi&#39;}>Hi!</div>
        <style jsx>{`
          .container {
            color: blue;
          }
          p:first-child {
            color: red;
          }
          .hello {
            color: yellow;
          }
          #hi {
            color: green;
          }
        `}</style>
    </div>
)
로그인 후 복사

3.1.4 转码

babel path/to/hello.js -d target/dir
로그인 후 복사

转码后的文件

import _JSXStyle from 'styled-jsx/style';
export default () => (
    <div className={&#39;jsx-234963469&#39; + &#39; &#39; + &#39;container&#39;}>
        <p className={&#39;jsx-234963469&#39; + &#39; &#39; + &#39;hello&#39;}>Hello! Hello!</p>
        <div id={&#39;hi&#39;} className={"jsx-234963469"}>Hi!</div>
        <_JSXStyle styleId={"234963469"} css={".container.jsx-234963469{color:blue;}p.jsx-234963469:first-child{color:red;}.hello.jsx-234963469{color:yellow;}#hi.jsx-234963469{color:green;}"} />
    </div>
);
로그인 후 복사

3.1.5 运行

实际渲染效果

<style type="text/css" data-styled-jsx="">
.container.jsx-234963469{
  color:blue;
}
p.jsx-234963469:first-child{
  color:red;
}
.hello.jsx-234963469{
  color:yellow;
}
#hi.jsx-234963469{
  color:green;
}
</style>
<div class="jsx-234963469 container">
  <p class="jsx-234963469 hello">Hello! Hello!</p>
  <div id="hi" class="jsx-234963469">Hi!</div>
</div>
로그인 후 복사

以上就是本篇文章的全部内容了,更多css相关内容请关注php中文网的css教程栏目。

위 내용은 CSS 모듈성이란 무엇입니까? CSS 모듈성을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

vue에서 자리 표시자는 무엇을 의미합니까? vue에서 자리 표시자는 무엇을 의미합니까? May 07, 2024 am 09:57 AM

Vue.js에서 placeholder 속성은 사용자가 콘텐츠를 입력하지 않을 때 표시되는 입력 요소의 자리 표시자 텍스트를 지정하고 입력 팁이나 예제를 제공하며 양식 접근성을 향상시킵니다. 사용법은 입력 요소에 자리 표시자 속성을 설정하고 CSS를 사용하여 모양을 사용자 정의하는 것입니다. 모범 사례에는 입력과 관련성, 짧고 명확함, 기본 텍스트 방지, 접근성 고려 등이 포함됩니다.

js에서 스팬은 무엇을 의미하나요? js에서 스팬은 무엇을 의미하나요? May 06, 2024 am 11:42 AM

스팬 태그는 텍스트에 스타일, 속성 또는 동작을 추가할 수 있습니다. 색상 및 글꼴 크기와 같은 스타일을 추가하는 데 사용됩니다. ID, 클래스 등의 속성을 설정합니다. 클릭, 호버 등과 같은 관련 동작 추가 처리 또는 인용을 위해 텍스트를 표시합니다.

js에서 rem은 무엇을 의미합니까? js에서 rem은 무엇을 의미합니까? May 06, 2024 am 11:30 AM

CSS의 REM은 루트 요소(html)의 글꼴 크기에 상대적인 단위입니다. 여기에는 다음과 같은 특징이 있습니다. 루트 요소의 글꼴 크기를 기준으로 하며 상위 요소의 영향을 받지 않습니다. 루트 요소의 글꼴 크기가 변경되면 REM을 사용하는 요소가 그에 따라 조정됩니다. 모든 CSS 속성과 함께 사용할 수 있습니다. REM 사용의 장점은 다음과 같습니다. 반응성: 다양한 장치 및 화면 크기에서 텍스트를 읽을 수 있도록 유지합니다. 일관성: 웹사이트 전체에서 글꼴 크기가 일관되게 유지되어야 합니다. 확장성: 루트 요소 글꼴 크기를 조정하여 전역 글꼴 크기를 쉽게 변경할 수 있습니다.

Vue에 이미지를 삽입하는 방법 Vue에 이미지를 삽입하는 방법 May 02, 2024 pm 10:48 PM

Vue에 이미지를 도입하는 방법에는 URL, 필수 함수, 정적 파일, v-bind 지시어 및 CSS 배경 이미지 등 5가지 방법이 있습니다. 동적 이미지는 Vue의 계산된 속성이나 리스너에서 처리할 수 있으며, 번들 도구를 사용하여 이미지 로딩을 최적화할 수 있습니다. 경로가 올바른지 확인하세요. 그렇지 않으면 로딩 오류가 나타납니다.

js의 노드 란 무엇입니까? js의 노드 란 무엇입니까? May 07, 2024 pm 09:06 PM

노드는 HTML 요소를 나타내는 JavaScript DOM의 엔터티입니다. 이는 페이지의 특정 요소를 나타내며 해당 요소에 액세스하고 조작하는 데 사용될 수 있습니다. 일반적인 노드 유형에는 요소 노드, 텍스트 노드, 주석 노드 및 문서 노드가 포함됩니다. getElementById()와 같은 DOM 메서드를 통해 노드에 액세스하고 속성 수정, 하위 노드 추가/제거, 노드 삽입/교체, 노드 복제 등의 작업을 수행할 수 있습니다. 노드 순회는 DOM 구조 내에서 탐색하는 데 도움이 됩니다. 노드는 페이지 콘텐츠, 이벤트 처리, 애니메이션 및 데이터 바인딩을 동적으로 생성하는 데 유용합니다.

브라우저 플러그인은 어떤 언어로 작성되어 있나요? 브라우저 플러그인은 어떤 언어로 작성되어 있나요? May 08, 2024 pm 09:36 PM

브라우저 플러그인은 일반적으로 다음 언어로 작성됩니다. 프런트엔드 언어: JavaScript, HTML, CSS 백엔드 언어: C++, Rust, WebAssembly 기타 언어: Python, Java

알 수 없는 속성을 설정하기 위해 vscode vscode 메소드에서 알 수 없는 속성을 설정하는 방법 알 수 없는 속성을 설정하기 위해 vscode vscode 메소드에서 알 수 없는 속성을 설정하는 방법 May 09, 2024 pm 02:43 PM

1. 먼저 왼쪽 하단에 있는 설정 아이콘을 열고 설정 옵션을 클릭합니다. 2. 그런 다음 점프된 창에서 CSS 열을 찾습니다. 3. 마지막으로 알 수 없는 속성 메뉴의 드롭다운 옵션을 오류 버튼으로 변경합니다. .

vue의 파일 수가 적어지면 데이터가 유입될 수 있나요? vue의 파일 수가 적어지면 데이터가 유입될 수 있나요? May 07, 2024 pm 12:06 PM

예, Vue의 Less 파일은 CSS 변수 및 Less 믹스인을 통해 데이터를 도입할 수 있습니다. 데이터가 포함된 JSON 파일을 생성하세요. @import 규칙을 사용하여 JSON 파일을 가져옵니다. CSS 변수 또는 Less 믹스인을 사용하여 JSON 데이터에 액세스합니다.

See all articles