整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

css怎么引入html

ss怎么引入html

在HTML中引入CSS的方法主要有四种:

1. 内联方式:直接在HTML标签中的style属性中添加CSS,即采用行内样式。例如:<p style="color:red;">这是红色文字</p>。这种方式的优点是可以直接在HTML文件中看到效果,但缺点是不够模块化,不便于复用和维护。

2. 内嵌样式:使用<style>标签在HTML文档头部(<head><head>之间)定义CSS样式。例如:

<head>

<style>

p {

color: red;

}

</style>

</head>

<body>

<p>这是红色文字</p>

</body>

这种方式的优点是可以将CSS样式与HTML内容分离,提高代码可读性,但同样存在复用和维护的问题。

3. 链接式:使用<link>标签引入外部CSS样式表文件。具体操作步骤如下:新建一个HTML文件和一个CSS文件,将新建的CSS文件保存在一个文件夹中,回到HTML文件中,在<title><title>下方添加<link>标签并设置其属性为CSS文件的路径,保存后便实现了引入外部CSS文件。这种方式的优点是可以实现代码的复用和维护,但需要提前准备好CSS文件。

4. 导入式:使用@import命令导入外部CSS样式表。例如:<style type="text/css"> @import"mystyle.css"; </style>。需要注意的是,这里的路径需要是正确的。这种方式可以在同一个HTML文件中引入多个CSS文件,但浏览器对@import的支持程度不同,可能会出现兼容性问题。

2024年选择适合项目的CSS框架至关重要。这将为构建新的用户界面(UI)组件所需的总体努力定下基调。目前,最重要的是更快地发布新功能,以保持客户的满意度。因此,你需要一个易于使用的CSS框架,它能够提供现成的UI元素。

下面,我们来看看2024年值得尝试的最佳CSS框架。

1、Bootstrap

在今天的数字时代,网页设计和开发已经成为创造令人印象深刻在线体验的关键。为了满足这一需求,Bootstrap 应运而生,它是一款以移动为先的 CSS 框架,不仅能帮助你构建外观优雅的响应式网页界面,还大大简化了开发过程。

Bootstrap 的核心在于其强大的栅格系统,这一系统使得开发者可以为各种屏幕尺寸创建灵活的布局。更重要的是,Bootstrap 提供了大量现成的组件,比如导航栏、卡片和模态框,这些都让开发变得更加迅速和高效。

Bootstrap 的独特之处

  • 响应式栅格系统:这是 Bootstrap 的核心特性之一,允许网页内容根据不同的屏幕尺寸自动调整布局,从而在手机、平板和桌面上都能提供良好的用户体验。
  • 丰富的预制组件:Bootstrap 提供了大量的预制组件,如导航栏、卡片、模态框等,使得开发者可以轻松实现复杂的UI设计。
  • 快速样式调整的实用类:通过实用类,Bootstrap 使得页面的样式调整变得快速简单,无需编写大量的自定义CSS。
  • 增强功能的JavaScript插件:Bootstrap 还提供了一系列JavaScript插件,进一步扩展了网页的交互性和动态效果。
  • 活跃的社区和丰富的文档:Bootstrap 拥有一个活跃的开发者社区和详尽的文档,为使用者提供了强大的支持。

如何将 Bootstrap 与现代框架结合使用

如果你在使用 React 开发项目,可以轻松地将 React Bootstrap 库安装到你的项目中,通过这种方式,你可以在保持 React 的组件化开发模式的同时,享受 Bootstrap 提供的样式和组件优势。

import ButtonGroup from 'react-bootstrap/ButtonGroup';
import Dropdown from 'react-bootstrap/Dropdown';
import DropdownButton from 'react-bootstrap/DropdownButton';
import './bootstrap.css';

export function Bootstrap() {
  return (
    <div className="button">
      {['Primary', 'success', 'danger'].map((variant) => (
        <DropdownButton
          as={ButtonGroup}
          key={variant}
          id={dropdown-variants-${variant}}
          variant={variant.toLowerCase()}
          title={variant}
          <Dropdown.Item eventKey="1">Action</Dropdown.Item>
          <Dropdown.Item eventKey="2">Another action</Dropdown.Item>
          <Dropdown.Item eventKey="3" active>
            Active Item
          </Dropdown.Item>
          <Dropdown.Divider />
          <Dropdown.Item eventKey="4">Separated link</Dropdown.Item>
        </DropdownButton>
      ))}
      <br />
      <Dropdown>
        <Dropdown.Toggle variant="success" id="dropdown-basic">
          Dropdown Button
        </Dropdown.Toggle>
        <Dropdown.Menu>
          <Dropdown.Item href="#/action-1">Action</Dropdown.Item>
          <Dropdown.Item href="#/action-2">Another action</Dropdown.Item>
          <Dropdown.Item href="#/action-3">Something else</Dropdown.Item>
        </Dropdown.Menu>
      </Dropdown>
    </div>
  );
}

2、Tailwind CSS

Tailwind CSS 以其独树一帜的“工具优先”设计理念,在前端开发社区中引起了广泛关注。它与传统的 CSS 框架不同,不提供预设样式的组件,而是通过提供大量的低级实用类(utility classes),让开发者能够构建出完全定制的设计。这种方法提供了前所未有的灵活性和可扩展性,使得开发者可以精准控制网页的每一个细节。

Tailwind CSS 的独特特点

  • 工具优先的设计方式:Tailwind 的核心思想是通过实用类直接在 HTML 中应用样式,极大地提高了开发效率和灵活性。
  • 高度可定制:通过配置文件,开发者可以自定义 Tailwind 的主题、颜色、间距等,以适应项目的具体需求。
  • 没有预构建的组件:与其它框架不同,Tailwind 不提供预构建的组件。这意味着所有的样式都是由开发者从头开始构建的,确保了设计的独特性。
  • 响应式设计:Tailwind 提供了响应式设计的支持,通过断点(breakpoints)可以轻松实现不同屏幕尺寸下的样式适配。
  • 与 PurgeCSS 的集成:通过集成 PurgeCSS,Tailwind 能够在生产环境下自动移除未使用的 CSS,优化项目的加载速度。
  • JIT(即时编译)模式:Tailwind 的 JIT 模式使得开发过程中的样式更改能够即时反映,进一步提升开发效率。

如何集成 Tailwind CSS

集成 Tailwind CSS 到项目中并非一蹴而就,首先需要设置 Tailwind 编译器。通过在项目的配置文件中指定要处理的内容和自定义主题,然后通过插件来扩展功能,你可以开始使用 Tailwind 提供的实用类来编写 CSS。

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js}"],
  theme: {
    extend: {},
  },
  plugins: [],
}

以下是相关的使用示例

export function Tailwind() {
  const ContactTextArea = ({
    row,
    placeholder,
    name,
    defaultValue,
  }: {
    row: number;
    placeholder: string;
    name: string;
    defaultValue: string;
  }) => {
    return (
      <>
        <div className="mb-6">
          <textarea
            rows={row}
            placeholder={placeholder}
            name={name}
            className="w-full resize-none rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
            defaultValue={defaultValue}
          />
        </div>
      </>
    );
  };

const ContactInputBox = ({
    type,
    placeholder,
    name,
  }: {
    type: string;
    placeholder: string;
    name: string;
  }) => {
    return (
      <>
        <div className="mb-6">
          <input
            type={type}
            placeholder={placeholder}
            name={name}
            className="w-full rounded border border-stroke px-[14px] py-3 text-base text-body-color outline-none focus:border-primary dark:border-dark-3 dark:bg-dark dark:text-dark-6"
          />
        </div>
      </>
    );
  };
  return (
    <section className="relative z-10 overflow-hidden bg-white py-20 dark:bg-dark lg:py-[120px]">
      <div className="w-full px-4 lg:w-1/2 xl:w-5/12">
        <div className="relative rounded-lg bg-white p-8 shadow-lg dark:bg-dark-2 sm:p-12">
          <form>
            <ContactInputBox type="text" name="name" placeholder="Your Name" />
            <ContactInputBox
              type="text"
              name="email"
              placeholder="Your Email"
            />
            <ContactInputBox
              type="text"
              name="phone"
              placeholder="Your Phone"
            />
            <ContactTextArea
              row={6}
              placeholder="Your Message"
              name="details"
              defaultValue=""
            />
            <div>
              <button
                type="submit"
                className="w-full rounded border border-primary bg-primary p-3 text-white transition hover:bg-opacity-90"
                Send Message
              </button>
            </div>
          </form>
          <div />
        </div>
      </div>
    </section>
  );
}

3、Foundation

Foundation 是一款开源的、响应式的前端框架,它极大地简化了创建在任何设备上都能完美运行的响应式网站、应用程序和电子邮件的过程。由于其出色的灵活性和易用性,Foundation 已被包括 Facebook、eBay、Mozilla、Adobe 乃至 Disney 在内的许多公司采用于他们的项目中。

Foundation 提供了一个强大而灵活的响应式栅格系统,并且包括了许多方便的选项、模态框(modals)、排版(typography)、导航组件以及表单元素,设计师可以快速将这些元素集成到他们的产品中。此外,Foundation 的模块化架构意味着你可以根据需要,使用它的部分或全部功能。

Foundation 的独特特性

  • 灵活的响应式栅格系统:Foundation 的栅格系统提供了丰富的布局选项,使得创建响应式设计变得简单高效。
  • 模块化架构:这允许开发者自定义所需的功能,确保了框架的灵活性和扩展性。
  • Sass 预处理器:Foundation 使用 Sass 预处理器进行样式的编写,进一步增强了样式定义的灵活性和可维护性。
  • 内建组件和响应式导航:框架提供了一系列预建的组件和响应式导航,加速了开发流程并提高了用户体验。
  • Flexbox 和块级网格支持:这些现代布局技术的支持使得创建复杂的布局结构变得更为简单。
  • 可访问性特性:Foundation 在设计时考虑了可访问性,帮助开发者创建符合 WCAG 标准的网站。

如何在项目中集成 Foundation

通过如下示例代码,可以看到如何在 React 项目中使用 Foundation:

import { Menu, MenuItem } from 'react-foundation';

export function Foundation() {
  return (
   <Menu style={{ marginLeft: '34px' }}>
     <MenuItem>
       <a href="/">Home</a>
     </MenuItem>
     <MenuItem>
       <a href="/">Blog</a>
     </MenuItem>
     <MenuItem>
       <a href="/">About</a>
     </MenuItem>
     <MenuItem>
      <a href="/">Contact</a>
     </MenuItem>
   </Menu>
  );
}

这个例子展示了如何使用 Foundation 的 Menu 和 MenuItem 组件来创建一个简单的导航菜单。这种集成方式使得在保持 React 组件化开发模式的同时,还能享受 Foundation 提供的样式和组件优势。

4. Bulma

Bulma 是一个轻量级的 CSS 框架,以其简单性、响应性和定制选项著称。它与其他 UI 框架的不同之处在于,Bulma 是基于 Flexbox 构建的,Flexbox 是一种 CSS 布局模型,能够根据容器的宽度调整页面元素的宽度,这使得创建网格等任务变得非常简单,并且是框架轻量化的原因之一。

Bulma 的主要特点

  • 基于 Flexbox 的现代 CSS 框架:利用 Flexbox,Bulma 为开发者提供了一种更灵活、简洁的方式来创建布局,无需复杂的布局计算。
  • 易用且直观的语法:Bulma 的类名清晰直观,使得即使是 CSS 新手也能快速上手。
  • 无 JavaScript 依赖:Bulma 完全由 CSS 构成,这意味着你可以在不添加任何 JavaScript 的情况下使用它,减少了前端项目的复杂度。
  • 内建的响应式设计修饰符:Bulma 提供了一系列修饰符用于创建响应式设计,使得适应不同屏幕尺寸的布局变得简单。
  • 组件化:如导航栏、模态框、标签页等,Bulma 提供了丰富的组件库,方便开发者快速实现常见的 UI 功能。
  • 通过 Sass 可扩展:Bulma 允许通过 Sass 进行定制,开发者可以根据项目需求调整颜色、间距等参数。

如何在项目中集成 Bulma

将 Bulma 集成到项目中相当简单,只需导入 Bulma 的 CSS 文件即可开始使用它提供的各种样式和组件。以下是一个使用 Bulma 创建分页导航的示例:

import 'bulma/css/bulma.min.css';

export function Bulma() {
  return (
    <div>
      <nav className="pagination" role="navigation" aria-label="pagination">
        <a href="/" className="pagination-previous">
          Previous
        </a>
        <a href="/" className="pagination-next">
          Next Page
        </a>
        <ul className="pagination-list">
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 1">
              1
            </a>
          </li>
          <li>
            <span className="pagination-ellipsis">…</span>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 45">
              45
            </a>
          </li>
          <li>
            <a
              href="/"
              className="pagination-link is-current"
              aria-label="Page 46"
              aria-current="page"
              46
            </a>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 47">
              47
            </a>
          </li>
          <li>
            <span className="pagination-ellipsis">…</span>
          </li>
          <li>
            <a href="/" className="pagination-link" aria-label="Goto page 86">
              86
            </a>
          </li>
        </ul>
      </nav>
    </div>
  );
}

这个例子展示了如何利用 Bulma 的分页组件来创建一个简洁美观的分页导航。通过使用 Bulma,开发者可以节省大量的时间来设计和编写 CSS,专注于实现更好的用户体验和界面设计。

5. UIKit

UIKit 是一个开源的框架,专门用于构建 Web 应用程序的用户界面。它与其他 UI 框架在结构和设计哲学上有所不同。不同于其他遵循传统 BEM 方法论的框架,UIKit 采用了基于组件的结构。这种方式为组件的灵活性和可重用性提供了更大的空间,可以显著减少构建复杂用户界面所需的代码量。

UIKit 的主要特性

  • 模块化和轻量级框架:UIKit 的设计注重于提供一个轻量级的解决方案,便于快速开发和部署。
  • 响应式栅格系统:UIKit 提供了一个灵活的栅格系统,使得在不同设备上的布局变得简单和一致。
  • 预设计的组件:UIKit 包含了大量预设计的组件,如导航栏、滑块、模态框等,简化了开发流程。
  • 基于 Flexbox 的布局:UIKit 利用 Flexbox 布局,提供了一种更灵活的方式来创建复杂的布局结构。
  • 动画和过渡效果:UIKit 包含了丰富的动画和过渡效果,可以轻松地为界面添加视觉吸引力。
  • 可定制和可主题化:UIKit 提供了广泛的定制选项,使得开发者可以根据自己的需求调整样式和功能。

如何在项目中集成 UIKit

将 UIKit 集成到项目中非常直接,仅需导入 UIKit 的 CSS 文件即可开始使用其提供的样式和组件。以下是一个使用 UIKit 创建按钮的示例:

import 'uikit/dist/css/uikit.min.css';

export function Uikit() {
  return (
    <div className="uk-flex uk-flex-center uk-margin-top">
      <button
        type="button"
        className="uk-button uk-button-default uk-margin-left"
        onClick={() => alert('Cancel clicked!')}
      >
        Cancel
      </button>
    </div>
  );
}

这个例子演示了如何利用 UIKit 的按钮(Button)组件来创建一个简单的按钮,并使用 Flexbox 实现居中布局。通过 UIKit,开发者可以享受到高度灵活和易用的界面构建体验,同时也能保持代码的整洁和模块化。

总结

选择合适的 CSS 框架对于项目的成功至关重要。每个框架都有其独特的特点、优势和可能的限制,因此了解如何根据项目的具体需求挑选合适的框架是一项重要的技能。除了我们讨论的 Bootstrap、Tailwind CSS、Foundation、Bulma 和 UIKit 外,市面上还有许多其他的 CSS 框架,每个都有可能成为你项目的理想选择。

创建概念验证

创建概念验证(Proof-of-Concept,PoC)是评估 CSS 框架是否适合你项目的一个极好方法。通过这种方式,你可以实际操作并体验每个框架的学习曲线、灵活性、易用性以及它们如何适应你的项目需求。以下是一些建议,帮助你通过创建概念验证来选择正确的 CSS 框架:

  • 明确项目需求:在开始之前,清晰地定义你的项目需求,包括预期的功能、设计美学、响应式设计的要求等。
  • 研究框架的特性:深入了解每个框架的核心特性、设计理念和社区支持情况。
  • 评估学习曲线:尝试了解开始使用框架并达到一定熟练度所需的时间和努力,确保团队能够快速上手。
  • 考虑扩展性和维护性:选择那些提供良好文档、定期更新和社区支持的框架,以确保项目的长期可维护性。
  • 实践中测试:为每个框架创建小型的概念验证项目,实际操作它们来构建一些简单的布局或组件。这将帮助你直观地感受到使用框架的便利性和可能的挑战。
  • 性能考量:测试每个框架生成的 CSS 的大小和加载时间,确保它们不会对最终用户的体验产生负面影响。
  • 社区和资源:考虑框架的社区活跃度和可用资源。一个活跃的社区和丰富的学习资源可以在你遇到问题时提供帮助。

通过这种综合评估方法,你可以更全面地理解每个框架如何适应你的项目需求,从而做出明智的选择。记住,最适合项目的框架不一定是最流行或最新的,而是最能满足你项目特定需求的那一个。分享你的概念验证经验和框架选择理由,不仅能帮助团队成员理解决策过程,也能为面临相似选择的其他开发者提供参考。

React以其声明式编程范式和组件化架构,成为了构建用户界面的首选技术之一。然而,随着项目规模的扩大和设计需求的多样化,如何高效地管理 CSS 样式成为了每个React开发者都需要面对的挑战。

本文将从一下三个方面进行介绍,探讨如何在 React 中应用和管理样式,包括内联样式、CSS 类、CSS Modules 和 CSS-in-JS 技术,提升界面美观和开发效率。

常见的样式方案

在 React 中,组件样式指的是如何为每个独立的组件定义和管理视觉表现。组件样式的设计和应用是 React 开发中的关键部分,它决定了应用的外观和用户体验。

内联样式 (Inline Styles)

在 React 中,内联样式是一种直接在元素上定义 CSS 样式的方式,类似于在 HTML 中使用 style 属性。不同的是,在 React 中,内联样式是通过一个 JavaScript 对象来定义的,而不是传统的 CSS 字符串。这使得内联样式在 React 中具有更强的动态性和灵活性。

基本语法

在 React 中,内联样式通过元素的 style 属性来设置,该属性接受一个 JavaScript 对象。对象的键是 CSS 属性名(使用驼峰命名法),值是对应的样式值;如下:

import React from 'react';

function InlineStyles() {
    const divStyle = {
        color: 'blue',
        backgroundColor: 'lightgray',
        padding: '10px',
    };

    return <div style={divStyle}>Hello, World!</div>;
}

export default InlineStyles;

在这个例子中,divStyle 是一个包含样式属性的 JavaScript 对象,并通过 style 属性应用到 div 元素上。

效果如下:

样式属性的命名

在 React 的内联样式中,CSS 属性名使用驼峰命名法(camelCase),而不是传统的 CSS 短横命名法(kebab-case)。例如:

  • background-color 在 React 中写成 backgroundColor
  • font-size 写成 fontSize
  • margin-top 写成 marginTop

动态样式

内联样式可以非常方便地实现动态样式。你可以根据组件的状态或属性来动态地改变样式。

import React, { useState } from 'react';

function DynamicStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    const divStyle = {
        color: isActive ? 'red' : 'blue',
        backgroundColor: 'lightgray',
        padding: '10px',
        cursor: 'pointer',
        userSelect: 'none',
    };

    return (
        <div style={divStyle} onClick={handleClick}>
            Click me to change color!
        </div>
    );
}

export default DynamicStyles;

在这个例子中,当点击 div 元素时会切换其文本颜色。效果图如下:

样式合并

React允许将多个样式对象合并为一个,这在需要应用多个条件样式时非常有用:

const baseStyle = { padding: '10px', margin: '5px' };
const activeStyle = { backgroundColor: 'green' };

// 合并样式
const finalStyle = { ...baseStyle, ...activeStyle };

// ...
<div style={finalStyle} />

内联样式的优缺点:

优点:

  • 局部作用域:内联样式只作用于当前的元素,不会影响其他元素,避免了样式冲突。
  • 动态性:可以很方便地根据组件的状态或属性来动态设置样式。
  • 简洁:对于简单的样式,可以减少代码量和文件数量。

缺点:

  • 可维护性:当样式变得复杂时,内联样式会使得组件代码变得难以维护。
  • 复用性差:内联样式无法复用,相同的样式需要在多个地方重复定义。
  • 缺少伪类和伪元素支持:内联样式无法直接使用 CSS 伪类和伪元素(如 :hover, ::after)。
  • 性能差:联样式对象包含大量的属性或者嵌套的对象,这可能会使得样式对象的创建和合并更加耗时。

CSS 类 (CSS Classes)

与内联样式相比,使用 CSS 类样式可以使代码更清晰、可维护性更高。

使用 CSS 类样式的基本方法

  • 创建 CSS 文件
  • 首先,你需要创建一个 CSS 文件,并在其中定义你的 CSS 类。例如,创建一个 common.css 文件:
/* common.css */
.container {
    color: blue;
    background-color: lightgray;
    padding: 10px;
}

.active {
    color: red;
}

在 React 组件中引入 CSS 文件 在你的 React 组件中,使用 import 语句引入刚刚创建的 CSS 文件:

import { useState } from 'react';
import '../assets/styles/common.css';

function ClassStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    return (
        <div
            className={`container ${isActive ? 'active' : ''}`}
            onClick={handleClick}>
            Click me to change color!
        </div>
    );
}

export default ClassStyles;
  • 在这个示例中,我们使用模板字符串(template literals)来动态添加或移除 CSS 类。效果如下:

动态添加或移除 CSS 类

可以使用条件渲染的方法动态添加或移除 CSS 类。例如,使用三元运算符或条件运算符:

<div
    className={`container ${isActive ? 'active' : ''}`}
    onClick={handleClick}>
    Click me to change color!
</div>

或者,使用 classnames、clsx 库来处理复杂的类名逻辑,下面用 classnames 做个演示:

import { useState } from 'react';
import classNames from 'classnames';

function ClassnamesStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    return (
        <div
            className={classNames('container', { active: isActive })}
            onClick={handleClick}>
            Click me to change color!
        </div>
    );
}

export default ClassnamesStyles;

然后在 App.jsx 中引入 ClassnamesStyles 组件;在这个示例中,classnames 库使得根据条件判断类名的处理更加简洁和易读。效果如下:

CSS Modules

为了避免全局样式冲突,React 推荐使用 CSS 模块(CSS Modules),它允许你将 CSS 类名限定在本地作用域内。

  • 创建 CSS 模块文件 首先,创建一个 CSS 模块文件,例如 page.module.css:
/* page.module.css */
.container {
    color: blue;
    background-color: lightgray;
    padding: 10px;
}

.active {
    color: red;
}

在 React 组件中引入和使用 CSS 模块

import { useState } from 'react';
import styles from '../assets/styles/page.module.css';

function CssModuleStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    return (
        <div
            className={`${styles.container} ${isActive ? styles.active : ''}`}
            onClick={handleClick}>
            Click me to change color!
        </div>
    );
}

export default CssModuleStyles;
  • 在这个示例中,CSS 类名是通过 styles 对象来引用的,这样可以确保类名在本地作用域内不发生冲突。

优缺点对比

优点:

  • 可维护性高:样式定义集中在一个地方,使得代码更清晰易读。
  • 复用性好:相同的样式可以在多个组件中复用。
  • 避免冲突:使用 CSS 模块可以避免全局命名冲突。

缺点:

  • 动态性较差:相比于内联样式,动态设置样式略显不便。
  • 额外的构建步骤:需要引入和配置 CSS 文件,增加了项目的构建复杂度。

Styled Components 和 CSS-in-JS

在 React 中,Styled Components 和 CSS-in-JS 是用于管理和应用样式的现代解决方案。它们旨在使样式更加模块化、可复用和动态化。

Styled Components

Styled Components 是一个流行的 CSS-in-JS 库,它使用 ES6 的模板字符串语法来定义组件级别的样式。通过使用 Styled Components,你可以将组件的样式与其逻辑紧密结合,使得样式更加模块化和可维护。

  • 安装 styled-components 库
$ npm install styled-components
  • 使用示例

以下是如何在 React 中使用 Styled Components:

import { useState } from 'react';
import styled from 'styled-components';

// 定义一个带有样式的容器组件
const Container = styled.div`
    /* 根据 props.isActive 设置颜色 */
    color: ${props => (props.isActive ? 'red' : 'blue')};
    background-color: lightgray;
    padding: 10px;
    cursor: pointer;
    transition: color 0.3s;
`;

const Button = styled.button`
    /* 根据 props.primary 设置按钮样式 */
    background: ${props => (props.$primary ? '#BF4F74' : 'white')};
    color: ${props => (props.$primary ? 'white' : '#BF4F74')};
    font-size: 1em;
    margin: 1em;
    padding: 0.25em 1em;
    border: 2px solid #bf4f74;
    border-radius: 3px;
`;

function StyledComponentsStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    return (
        <main>
            <Container isActive={isActive}>Click me to change color!</Container>
            <Button onClick={handleClick} $primary={isActive}>
                Primary
            </Button>
        </main>
    );
}

export default StyledComponentsStyles;

效果如下:

CSS-in-JS

CSS-in-JS 是一种将 CSS 样式直接写在 JavaScript 文件中的技术。Styled Components 是 CSS-in-JS 的实现之一,但还有其他库和方法可以实现 CSS-in-JS,例如 emotion、styled-jsx 等。

优点

  • 模块化:每个组件的样式都与组件本身紧密结合,避免了样式冲突。
  • 动态样式:可以方便地根据组件的状态或属性来动态调整样式。
  • 可维护性:将组件的样式和逻辑放在一起,使得代码更加内聚和可维护。
  • 自动前缀:自动添加浏览器前缀,使得样式兼容更多浏览器。

缺点

  • 性能:在某些情况下,CSS-in-JS 可能会对性能产生影响,因为样式是在运行时生成的。
  • 学习曲线:需要学习新的库和语法,可能增加项目的复杂性。

其他 CSS-in-JS 库

  • Emotion Emotion 是另一个流行的 CSS-in-JS 库,具有强大的动态样式和高性能的特点。
  1. 安装 Emotion
$ npm install @emotion/react
  1. 使用示例

在使用 emotion 方案的 jsx 文件开头加入一行 /** @jsxImportSource @emotion/react **/ 的 JSX Pragma(编译指示),告诉 JS 编译器使用 @emotion/react 包来替代 React 原生的jsx 运行时。

/* @jsxImportSource @emotion/react */
import React from 'react';
import { css } from '@emotion/react';

const color = 'white';

function EmotionStyles() {
    return (
        <div
            css={css`
                padding: 32px;
                font-size: 16px;
                background-color: hotpink;
                font-size: 24px;
                border-radius: 4px;
                &:hover {
                    color: ${color};
                }
            `}>
            Hover to change color.
        </div>
    );
}

export default EmotionStyles;

效果如下:

emotion 也支持了 style-components 的方案,不过要安装一下依赖:npm i @emotion/styled,使用示例如下:

/* @jsxImportSource @emotion/react */
import { useState } from 'react';
import styled from '@emotion/styled';

const Container = styled.div`
    color: ${props => (props.isActive ? 'red' : 'blue')};
    background-color: lightgray;
    padding: 10px;
    cursor: pointer;
    transition: color 0.3s;
`;

function EmotionStyledStyles() {
    const [isActive, setIsActive] = useState(false);

    const handleClick = () => {
        setIsActive(!isActive);
    };

    return (
        <Container isActive={isActive} onClick={handleClick}>
            Click me to change color!
        </Container>
    );
}

export default EmotionStyledStyles;

效果如下:

Styled Components 和 CSS-in-JS 是现代 React 开发中非常流行的样式解决方案。它们提供了模块化、动态化和高可维护性的样式管理方式。根据项目需求选择合适的方案,可以显著提高开发效率和代码质量。

总结

在 React 项目中,有许多不同的样式管理工具和库可供选择。以下是一些常见的选择:

  • CSS-in-JS:Styled Components, Emotion
  • Utility-First CSS 框架:Tailwind CSS、unocss
  • 组件库:Bootstrap (react-bootstrap), Ant Design, Material-UI等
  • CSS 预处理器:Sass、less
  • CSS 模块:CSS Modules

选择合适的样式管理工具取决于你的项目需求、团队的熟悉度以及具体的使用场景。




原文转自:https://juejin.cn/post/7384992844191154214