CSS 模块和多个布局/主题?

2023-12-28

在我的应用程序中,我有多种主题样式(您可以将它们视为不同的、单独的 CSS 样式文件)。我想开始使用 CSS 模块,但我什至不知道如何使用import我的第一个文件。

让我们假设以下(简单)目录结构:

layouts/
    themeA/
        myComponent.css
    themeB/
        myComponent.css
    themeC/
        myComponent.css
components/
    myComponent.js

根据用户设置,我想选择不同的 CSS。这在浏览器(或服务器)中很容易做到。但是如何将 myComponent.css 包含到 myComponent.js 中?

根据 CSS 模块,我应该import我正在使用的文件。所以import styles from 'theme/myComponent.css。问题是我没有一个真正的主题,而是 3 个不同的、平行的主题。

import styles from '' // <<<< from what?

return `<div class=${styles.caption></div>`

使用 CSS 模块时是否可以使用多个布局/主题?


如果您将所有 3 个主题捆绑在一个文件中。您可以轻松地选择其中之一并用它渲染组件。您必须对所有内容具有相同的架构.css主题,例如:

.wrapper {
  // example content
}

.image {
  // example content
} 

In myComponent.js您将导入所有主题并分配给对象(选择其中之一会更容易):

import themeA from './themeA.css';
import themeB from './themeB.css';
import themeC from './themeC.css';

const themes = {
  light: themeA,
  dark: themeB,
  pink: themeC
}

你的主题看起来像这样:

{ 
    light: {
        wrapper: "themeA---wrapper---2IVWH",
        image: "themeA---image---3omJ7"
    },
    dark: {
        wrapper: "themeB---wrapper---fHfAZ",
        image: "themeB---image---17erf"
    },
    pink: {
        wrapper: "themeC---wrapper---2i9L2",
        image: "themeC---image---3OKIG"
    }
}

由于 css-modules 是带有指向新类名的指针的简单对象,因此您可以动态选择其中之一:

const render = themeName => {
  const theme = themes[themeName];
  return $(`
    <div class="${theme.wrapper}">
      <img 
          class="${theme.image}"
          src="http://exmoorpet.com/wp-content/uploads/2012/08/cat.png" 
      />

      <p>Lorem ipsum </p>
    </div>
  `);
};

我使用 jQuery 只是为了简化模型。 您可以在这里查看所有工作代码:webpackbin http://www.webpackbin.com/NyLP_bTI-


在运行时异步加载样式(编辑)

如果你使用require.ensure(很好的解释here https://blog.madewithlove.be/post/webpack-your-bags/#code-splitting)您可以在运行时下载样式。 改变myComponent.js异步要求:

import $ from 'jquery';

const render = (wrapper, theme) => {
  const template = $(`
    <div class="${theme.wrapper}">
      <img 
          class="${theme.image}"
          src="http://exmoorpet.com/wp-content/uploads/2012/08/cat.png" 
      />

      <p>Lorem ipsum </p> 
    </div>
  `);
  wrapper.html(template);
};

export default (wrapper, themeName) => {
  switch(themeName) { // this will produce 3 chunks with styles
    case 'light':
      require.ensure([], () => {
        render(wrapper, require('./themeA.css'));
      });
      break;
    case 'dark':
      require.ensure([], () => {
        render(wrapper, require('./themeB.css'));
      });
      break;
    case 'pink':
      require.ensure([], () => {
        render(wrapper, require('./themeC.css'));
      });
      break;
  }
};

Webpack 将生成以下块(1 个主要块和 3 个带有样式的块):

chunk    {0} main.js (main) 267 kB [rendered]
    [0] ./src/main.js 827 bytes {0} [built]
    [1] ./~/jquery/dist/jquery.js 264 kB {0} [built]
    [2] ./src/select.js 440 bytes {0} [built]
    [3] ./src/myComponent.js 1.82 kB {0} [built]
chunk    {1} 1.1.js 10.2 kB {0} [rendered]
    [4] ./src/themeA.css 1.08 kB {1} [built]
    [5] ./~/css-loader?modules&localIdentName=[name]---[local]---[hash:base64:5]!./src/themeA.css 428 bytes {1} [built]
    [6] ./~/css-loader/lib/css-base.js 1.51 kB {1} {2} {3} [built]
    [7] ./~/style-loader/addStyles.js 7.21 kB {1} {2} {3} [built]
chunk    {2} 2.2.js 10.2 kB {0} [rendered]
    [6] ./~/css-loader/lib/css-base.js 1.51 kB {1} {2} {3} [built]
    [7] ./~/style-loader/addStyles.js 7.21 kB {1} {2} {3} [built]
    [8] ./src/themeB.css 1.08 kB {2} [built]
    [9] ./~/css-loader?modules&localIdentName=[name]---[local]---[hash:base64:5]!./src/themeB.css 429 bytes {2} [built]
chunk    {3} 3.3.js 10.2 kB {0} [rendered]
    [6] ./~/css-loader/lib/css-base.js 1.51 kB {1} {2} {3} [built]
    [7] ./~/style-loader/addStyles.js 7.21 kB {1} {2} {3} [built]
   [10] ./src/themeC.css 1.08 kB {3} [built]
   [11] ./~/css-loader?modules&localIdentName=[name]---[local]---[hash:base64:5]!./src/themeC.css 432 bytes {3} [built]

我将证明 3 个带有样式的块包含您的主题样式。 例如chunk 1里面包含这段代码(我只显示了其中的重要部分):

/***/ },
/* 5 */
/***/ function(module, exports, __webpack_require__) {

    exports = module.exports = __webpack_require__(6)();
    // imports


    // module
    exports.push([module.id, ".themeA---wrapper---shnYu {\n  background-color: #eee;\n  color: #333;\n  padding: 20px;\n}\n\n.themeA---image---18Mgb {\n  float: left;\n  height: 100px;\n  margin: 20px;\n}\n", ""]);

    // exports
    exports.locals = {
        "wrapper": "themeA---wrapper---shnYu",
        "image": "themeA---image---18Mgb"
    };

运行时的样子

在这里您可以检查新代码 http://www.webpackbin.com/Vyclm0lwW它甚至会显示 ajax 下载块 - 你可以在控制台中尝试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 模块和多个布局/主题? 的相关文章

  • Flexbox 的行之间可以有一条线吗?

    我有一个水平导航 它有点长 需要重新排列以适应狭窄的显示 我使用 flexbox 使其重排成多行 但行数较多时 导航项之间的划分就不那么明显了 我尝试在顶部给它们一个边框 它有点有效 但当然 边框仅在各个导航选项上可见 而不是在所有 Fle
  • 我正在尝试向我的 vue.js 项目添加背景图像

    我想添加覆盖整个页面的背景图像 然而现在看起来是这样的 我希望它跨越整个网页 在 vue js 中这将如何完成 我还想要一个动画工具栏 以便当页面不滚动时工具栏是透明的并呈现背景图像的外观 当它滚动时 工具栏将具有当前的蓝色 这是我的小提琴
  • css-loader 不导入 .css 文件返回空对象

    从 css 文件导入样式 返回空对象 看来 css loader 无法正常工作 谁可以帮我这个事 请找到下面的参考文件 index js import React from react import style from header cs
  • grid-auto-columns 在 Firefox 中不能完全工作

    我不明白为什么 DIV 3 的大小与 DIV 1 DIV 2 的大小不同 https codepen io anon pen vaVqPW https codepen io anon pen vaVqPW grid display grid
  • 如何防止 CFDocument 中的内容中间发生分页?

    我使用 cfdocument 标签从 html css 动态生成 PDF 文件 有些内容块我不想跨越多个页面 经过一番搜索后 我发现根据文档支持 page break inside 样式 然而 在我的测试中 声明 page break in
  • 样式标签中的源映射是否有效?

    我在标签和源映射中遇到 CSS 问题 为了缩短项目的加载时间 我改变了将 CSS 放入 HTML 的方式 将其改为 h1 Source maps working wonderfully h1 进入这个
  • IE 中的 HR 标签 - 删除边框

    在除 IE7 及更低版本之外的其他浏览器中 hr 在 hr 标签周围显示边框 但我不希望它出现 我已经尝试过这个解决方案 但它周围似乎仍然有边框 它看起来像这样 我该如何摆脱它 See http webdesign about com od
  • 扩展位置绝对div超出溢出隐藏div

    我已经好几个月没有做过CSS了 所以我可能会错过一些简单的东西 但无论解决方案是什么 我都无法弄清楚 所以问题就在这里 这是我的代码的简化版本 div style height 100 width 200px div style margi
  • 当百分比填充定义元素高度时忽略 max-height

    The max height当内部填充大于最大高度值时 属性值似乎被忽略 例如 在元素上设置此类会导致最大高度被忽略 max height ignored height 0 or auto makes no difference max h
  • 将 CSS 生成的三角形拆分为 2 个水平不同的相同颜色

    正如您应该能够通过此代码看到的那样fiddle http jsfiddle net Xh36r 1 以及下面 我希望能够分割显示在第二个 div 顶部的 CSS 生成的三角形水平均等在 之间orange and green使用的颜色 现在它
  • 如何强制外部 div 扩展到内部 div 的高度?

    我有 ajax 到的数据 div class content 我希望外部 div 扩展到内部 div 的高度 我不知道该怎么做 HTML div class outer div class inner div class content S
  • 我可以根据同一容器中另一个元素的大小强制内联文本换行吗?

    考虑这个 jsbin http jsbin com ElIKOKe 3 edit html css output 我有这个html div class container span The lime outlined container h
  • CSS: *html #id_name

    我有这个代码 html alertBox height 100px modalContainer gt alertBox position fixed 这是由CSS支持的吗 我在其他网站上找到了这段代码 我忘记了链接 html alertB
  • 样式 ::-webkit-scrollbar-track 不起作用

    我正在尝试设置滚动条轨道的样式 每当我设计曲目时 div webkit scrollbar track background color blue 没有什么变化 每当我设置滚动条样式时 div webkit scrollbar backgr
  • CSS 无法从带有 php“includes”的相对路径工作

    文件夹结构 index php includes header html css style css 我的主项目文件夹中有 2 个子文件夹 一个是名为 includes 的文件夹 另一个名为 css 我有我的 index php主文件夹中的
  • 为什么此 TTF 字体在我的浏览器中无法使用?

    我下载了一种名为 Clunk 的 TTF 字体 并尝试将其应用于某些文本 这是我正在使用的代码 h1 Test h1 这似乎不起作用 Chrome 给了我两个错误 Failed to decode downloaded font path
  • CSS 显示无不工作

    media screen and min width 900px and max width 1215px menu display none 这不起作用 div 仍然可见 但是 如果我将 div 更改为 div class menu 代替
  • 适用于移动设备的响应式订单确认电子邮件?

    我从未见过令人惊叹的订单确认 发票电子邮件 即使是最好的 html5 网站也会发送糟糕的订单确认电子邮件 有时是纯文本 我相信这是因为发票通常需要使用表格来显示购买的物品 这在移动设备上实现起来非常困难 我发现了一些让手机上的表格更易于管理
  • 如何删除标题中的粗体?

    我有一个标题 h1 THIS IS A HEADLINE h1 如何使短语 THIS IS 不加粗 其余部分不做任何更改 我在文本装饰中找不到任何相关标签 标题看起来很粗体 因为它大尺寸 如果您已应用粗体或想要更改行为 您可以执行以下操作
  • 如何在 webpack 中渲染嵌套的 SASS?

    采取以下CSS MyComponent color blue Button color red 以及以下 React 组件 import React from react import classes from MyComponent sc

随机推荐

  • 需要动态转换派生类:寻找替代方法

    我以这种简单的形式提出我的问题 class animal public animal name animal virtual void makenoise cout lt lt name lt
  • 替换 Javascript 构造函数的 .prototype 而不是添加它是否存在问题?

    我遇到过另一个开发人员的代码 它执行类似的操作来定义 Javascript 类型 function Ninja Ninja prototype swingSword function return true 当更传统的方式是这样的 func
  • 解析 allocator::rebind 调用

    我刚刚学习 C 分配器 我试图理解的目的struct rebind在每个分配器中 例如 在这个程序 https msdn microsoft com en us library 5fk3e8ek aspx include
  • Android 上 AVRCP 的最佳实践(将元数据发送到蓝牙设备)

    我想通过 Android 4 3 设备将元数据发送到蓝牙设备 我遇到的有效解决方案是向 google android music 谷歌音乐应用程序 发送意图 通知它有关元数据的信息 如下所示 通过A2DP AVRCP发送曲目信息 https
  • 为什么不建议在生产中启动单独的 MongoDB 实例作为副本集?

    根据评论中的讨论这个答案 https stackoverflow com a 51239633 330867 kevinadi 建议我提出一个与他的评论相关的新问题 您可以出于开发目的使用一个节点启动一个副本集 请注意 这不是生产环境的推荐
  • 如何使用 Plots.jl 根据 z 中的值对 (x,y) 散点图着色?

    使用 Julia 中的 Plots jl 包 我可以使用各种后端来制作基于两个向量的散点图x and y k 100 x rand k y rand k scatter x y 我无法找到有关如何根据某些长度给它们着色的信息k vector
  • 相当于 Ruby 中的“pass”

    在Python中有一个pass用于定义空函数 条件 循环等的关键字 Ruby 有类似的东西吗 Python 示例 def some function do nothing pass 不 Ruby 中没有这样的东西 如果你想要一个空块 方法
  • 升级到 JSF 2.4

    我正在尝试在 Netbeans 11 0 中从 JSF 2 2 升级到 2 4 I 下载了二进制文件 https mvnrepository com artifact org glassfish javax faces 2 4 0并将其添加
  • 使用 Jquery 设置 ViewBag 中的值

    我只是想问 有没有办法使用jquery动态设置viewbag值 我在我的脚本中尝试这段代码 btn on click function ViewBag Id this attr id 我不知道它是否正确 但是当我尝试运行我的 MVC 3 项
  • 反应路由器重定向与history.push

    我正在读书反应路由器 Redux 示例 https github com ReactTraining react router tree master packages react router redux examples我很困惑 之间有
  • 如何查看 DOM 元素绑定了哪些具体事件?

    我觉得我想经常这样做 但不能 因为我无法了解实际事件 例如 这只是我的一个例子can只需查看 API 即可 我试图了解 stackoverflow 的图像上传器是如何工作的 但是当我调用 0 data events or form acti
  • 函数声明中的尾随 const 或 && [重复]

    这个问题在这里已经有答案了 我正在查看 APIstd optional
  • 保留在 akka 流中是什么意思?

    我正在学习akka流并在代码中遇到Keep left和Keep right implicit val system ActorSystem KafkaProducer implicit val materializer ActorMater
  • React Native - “您当前正在使用 NODE_ENV ===“生产”之外的精简代码”

    我在 React Native 上遇到了这个错误 而不是 ReactJS 所以所有使用 webpack 或 browserify 的解决方案 解决方法都没有帮助 完整错误 您当前正在使用 NODE ENV 生产 之外的精简代码 这意味着您正
  • 将指向自动变量的指针传递给函数是否安全?

    假设我有一个函数声明并初始化两个局部变量 默认情况下它们具有存储持续时间auto 然后 该函数调用第二个函数 并将这两个局部变量的地址传递给该函数 第二个函数可以安全地使用这些指针吗 一个简单的程序示例 用于补充该描述 include
  • .NET Remoting,将对象传递到方法中

    我正在编写一个 NET 远程处理应用程序 我的 dll 服务器和客户端都工作正常 但是 当我尝试更改方法调用以采用对象参数而不是 int 等简单类型时 它会抱怨此错误 类型 System Runtime Remoting ObjRef 及其
  • 在后台执行子进程

    我有一个 python 脚本 它接受输入 将其格式化为调用服务器上另一个脚本的命令 然后使用子进程执行 import sys subprocess thingy sys argv 1 command usr local bin others
  • 从 Android 调用 JavaScript

    我在从 Android 内部调用基本 JavaScript 函数时遇到问题 当我从以下位置克隆存储库时本教程 https www tanelikorri com tutorial android communication between
  • 将请求的响应保存到文件

    我在用着Requests http docs python requests org en latest api 将 PDF 上传到 API 它被存储为下面的 响应 我正在尝试将其写到 Excel 中 import requests fil
  • CSS 模块和多个布局/主题?

    在我的应用程序中 我有多种主题样式 您可以将它们视为不同的 单独的 CSS 样式文件 我想开始使用 CSS 模块 但我什至不知道如何使用import我的第一个文件 让我们假设以下 简单 目录结构 layouts themeA myCompo