当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何避免css全局污染?

堵凯
2024-06-11

现在遇到一个项目,uniapp开发的微信小程序,之前的所有页面都没有使用scope将css样式私有化,导致css属性全局污染了,现在要开发后续的功能,如何在后续的开发中避免之前css的样式污染?
之前开发的内容不能使用scope将css私有化,因为一旦私有化可能会对某些页面造成影响,现在的情况就是之前的内容不能动,在此基础上开发。
目前想到的办法是在后续开发的功能中,所有的css类名名全部使用当前文件名+类名,这样尽可能的来避免样式重名,在这里想问一下各位有什么好的办法来实现?

共有5个答案

唐照
2024-06-11

scope可以的

鲁霄
2024-06-11

如果暂时不想要处理历史页面的话,新开发的页面严格按照 BEM 的命名规则就好了。

或者你额外使用 CSS Modules 给新开发的业务模块增加样式的hash后缀。

BEM — Block Element Modifier
CSS Modules

宋原
2024-06-11

你的想法是可以的,按照你说的,既然之前的样式不能动,那就只能写好之后的。严格控制选择器,一是通过人为控制命名,二是使用scope,建议两者结合使用。

如果没有那么麻烦,后面项目内容还有很多工作要做,也可以花点时间把之前的代码整整,这样后面写起来也舒心

谭裕
2024-06-11

人为规定各种规则来控制css变量冲突事实证明是徒劳的,只要代码还在不断的增长,就有人会写出冲突的css名称,建议尝试使用tailwindcss这样的css原子化来解决日益膨胀的css代码,但是不知道uniapp使用这样的css框架难度。

宦文柏
2024-06-11

要避免CSS全局污染,尤其是在不能修改现有代码库的情况下,你可以采取一些策略来确保新开发的样式不会影响到旧的样式,同时也不会被旧的样式所影响。以下是一些建议:

  1. 使用唯一的命名约定
    正如你提到的,为新开发的样式使用唯一的命名约定是一个好方法。可以通过结合文件名、组件名或功能模块名来创建独特的类名。例如,如果你有一个名为MyComponent的组件,在my-component.vue文件中,你可以使用类名如my-component__headermy-component__content等。
  2. 使用CSS模块
    如果项目支持,可以考虑使用CSS模块。CSS模块会自动将类名本地化,以避免全局污染。虽然你提到之前的代码不能使用scope,但新开发的组件可以考虑使用CSS模块。这样,每个组件的样式都会有一个唯一的命名空间,从而避免样式冲突。
  3. 使用CSS-in-JS库
    使用如styled-components、emotion等CSS-in-JS库也是一个选项。这些库允许你编写组件样式时直接使用JavaScript,并且会自动为每个样式创建唯一的类名,从而避免全局污染。
  4. CSS Reset
    在项目入口文件(如App.vue)的顶部使用CSS Reset来消除浏览器默认样式的影响。这有助于确保你的样式有一个更一致的起点,并减少潜在的样式冲突。
  5. CSS隔离
    如果项目支持,可以考虑使用类似shadow DOMscoped slots等特性来实现CSS隔离。这些方法可以将一个组件的样式完全封装在其内部,不会影响到其他组件。
  6. 代码审查和测试
    在开发过程中,加强代码审查和测试是非常重要的。确保每次添加新样式时都进行仔细的测试,以检查是否引入了新的全局污染。同时,定期进行代码审查也有助于发现并修复潜在的样式问题。
  7. 文档和沟通
    建立和维护一个关于项目样式约定的文档也是很有帮助的。这样,团队成员都可以清楚地了解如何编写不会造成全局污染的样式,并在必要时进行参考。

最后,请注意,虽然这些策略可以帮助你减少CSS全局污染的风险,但完全避免它可能是非常困难的。因此,建议在进行任何重大更改之前都要进行充分的测试和评估,以确保不会对现有功能造成负面影响。

 类似资料:
  • 问题内容: 我们都知道全局变量只是最佳实践。但是在有些情况下,没有它们很难编写代码。您使用什么技术来避免使用全局变量? 例如,在以下情况下,您将如何不使用全局变量? JavaScript代码: 相关标记: 此代码来自具有多个的网络表单。它一次上传一个文件,以防止大量请求。它通过POST到iframe来完成此操作,等待响应触发iframeonload,然后触发下一个提交。 您不必专门回答此示例,我只

  • react 如何使用useCallback 避免全量更新? 在子组件的事件中使用useCallback 父组件 list.map 创建了子组件, 子组件触发事件导致 父组件的 list 发生变更, 于是组件全部发生了变化 这个过程中只有其中一个子组件发生了改变,所以我使用了 memo 包裹了一下 但是 传递的事件函数会重复创建,导致子组件全量更新 我应该如何使用useCallback 来实现顶点更

  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 问题内容: 我将UNLINK与和一起使用。我知道这种方式非常危险,因为每个人都可以删除任何文件。但是我需要使用,因为删除文件时无法重新加载页面。 那么,我该如何做才能只允许拥有该文件的用户删除该文件? 如果您认为我在这里做错了什么,或者您有其他想法,并且认为这将是有用的,也请让我知道其他事情:) 我的PHP代码: 我的AJAX代码: 问题答案: 您需要以某种方式对用户进行身份验证。 您的用户需要使

  • 问题内容: 要避免很多。 有没有好的替代方法? 例如: 当不知道对象是否存在时,可以避免使用。 问题答案: 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。 换句话说,在两种情况下会出现空检查: 如果为

  • 问题内容: 我有几个较旧的应用程序,它们在E_NOTICE错误级别上运行时会抛出很多“ xyz未定义”和“未定义偏移”消息,因为没有使用和明确检查变量的存在。 我正在考虑通过它们使它们与E_NOTICE兼容,因为有关丢失变量或偏移量的通知可能会节省生命,可能会获得一些较小的性能改进,并且总体而言,这是一种更清洁的方法。 但是,我不喜欢什么造成数百 和S ^确实给我的代码。它变得肿,可读性降低,而没