浅析CSS中的5种设计模式,聊聊vue项目中CSS目录代码的作用

本篇文章带大家聊聊css中的5种设计模式,并介绍一下vue3项目中个css style目录中的代码作用,希望对大家有所帮助!

浅析CSS中的5种设计模式,聊聊vue项目中CSS目录代码的作用

工作了几年,发现在项目中经常存在如下问题:

1.模块拆分不合理2.变量和函数命名不知所云3.缺少注释或者是写了一堆描述不清的内容4.重复的代码遍布各个角落等

因为这些不良的编程习惯,导致了项目越来越难以维护,程序性能越来越低,大大降低了日常的工作效率以及提高了公司的开发成本。

下面就以CSS在Vue3项目中的架构为切入点,通过减少CSS代码的冗余度和增强CSS代码的维护性、扩展性来提高我们的编程能力和项目架构能力。

立即学习“前端免费学习笔记(深入)”;

技术储备:

Sass(https://www.sass.hk/docs/)Vue3(https://v3.cn.vuejs.org/)

CSS的设计模式

在学习CSS架构之前,我们先简单看一下常见的5种CSS设计模式,这些设计模式都为我们的CSS架构提供了一定的开发思路。

1.OOCSS模式

OOCSS(Object-Oriented CSS)字面意思是面向对象的CSS,在开发中它有如下的规范约定

减少对 HTML 结构的依赖

# bad# 1.匹配效率低,影响css性能# 2.和html耦合度高,维护性和扩展性低.container-list ul li a {}
# good.container-list .list-item {}

增加样式的复用性

.label {  # 公共代码}.label-danger {  # 特定代码}.label-info {  # 特定代码}

2.BEM模式

BEM 是进阶版的OOCSS,是一个分层系统,它把我们的网站分为三层,这三层正好对应着 BEM 三个英文单词的简写 block, element, modifier,分为为 块层、元素层、修饰符层。

把 BEM 体现到代码上,我们需要遵循三个原则:

使用__两个下划线将块名称与元素名称分开使用–两个破折号分隔元素名称及其修饰符一切样式都是一个类,不能嵌套。

但是,由于两个下划线__和两个破折号–在实际开发中不是那么的顺手,影响开发效率,不过要严格控制CSS命名规范的话,这无疑是一个好的选择。并且在写CSS的时候我们可以通过Sass的混合指令封装一个BEM.scss文件来减少类名的输入以及增强CSS结构

3.SMACSS模式

BEM 简单的三层分法,在应对小中型网站没有问题,但是去应对复杂网站的样式可能就比较困难了,我们需要寻求一个更好的办法。

SMACSS(Scalable and Modular Architecture for CSS)是要编写模块化、结构化和可扩展的 CSS。它对项目中的CSS分为五大类

Base: 默认属性样式重置,知名库为normalize.cssLayout:布局样式Modules:可复用模块的样式,比如一些列表展示State:状态样式,比如按钮的置灰或高亮的展示Theme:皮肤样式,比如有些网站具有换肤的功能

4.ITCSS模式

ITCSS(Inverted Triangle Cascading Style Sheets)可以翻译为"倒三角CSS",它基于分层的概念把我们项目中的样式分为七层

Settings: 项目样式变量,如主题色、字体等Tools:工具类样式,比如定义一个函数,表示字数过多出现省略号等Generic:重置和/或标准化样式、框大小定义等,对应的是normalize.cssBase:重置浏览器元素属性默认值Objects:维护OOCSS的样式Components:公共组件样式Trumps:让样式权重变得最高,实用程序和辅助类,能够覆盖三角形中前面的任何内容,唯一 important! 的地方

5.ACSS模式

ACSS(Atomic CSS)翻译为"原子化CSS",是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。是一个不强调逻辑,而更侧重表现的一门所见即所得的语言,它出现的背景是——前端组件化时代的到来,各个组件的CSS可以做到互相独立,互不影响。因此就有这样的代码出现

目前市场上比较成熟的ACSS库有:Tailwind CSS和Windi CSS

ACSS的优点

CSS文件停止增长:使用传统方法,每次添加新功能时,您的 CSS 文件都会变大。使用实用程序,一切都是可重用的,因此您很少需要编写新的 CSS,一套样式全局通用。不再浪费精力命名,不再添加愚蠢的类名:例如 sidebar-inner-wrapper 只是为了能够设置样式,也不再为真正只是一个 flex 容器的东西的完美抽象名称而苦恼。灵活,易读:CSS 是全球性的,当你做出改变时,你永远不知道你破坏了什么。HTML 中的类是本地的,因此可以 插拔式改变样式 而不必担心其他问题,CSS 样式很多缩写更加符合大脑的记忆。永远不用担心命名冲突,永远不用担心样式覆盖。

ACSS的缺点

会增加HTML 的体积破坏了CSS命名的语义化熟悉命名 ACSS 命名会有一定成本

综上,我们可以看出ACSS 劣处是非常小的,而好处有非常大,没有理由在项目中不适用。下面我们通过使用BEM、ITCSS和ACSS模式打造一套CSS架构方案

项目搭建

创建vue3项目和安装依赖

1.创建vue3项目2.安装:npm i sass@1.26.5 sass-loader@8.0.2 --save

CSS目录结构展示与说明

src  style    acss         # 存放boder、margin、padding等基于acss模式的代码    base         # 存放元素(input、p、h1等)的重置样式    settings     # 存放项目统一规范的文本颜色、边框颜色等变量    theme        # 存放项目特定主题下的元素样式    tools        # 存放封装好的mixin(混合指令)和function(函数)样式    global.scss  # 需要项目全局引用的CSS    index.scss   # 需要Vue文件引用的CSS

1.关于mixin(混合指令)和function(函数)的区别

函数是有计算逻辑,返回计算的结果,不输出css块mixin主要是根据计算结果输出css块

/* mixin */@mixin center-translate($direction: both) {  position: absolute;  @if $direction == both {    top: 50%;    left: 50%;    transform: translate3d(-50%, -50%, 0);  } @else if $direction == horizontal {    left: 50%;    transform: translate3d(-50%, 0, 0);  } @else if $direction == vertical {    top: 50%;    transform: translate3d(0, -50%, 0);  }}/* function */@function am($module, $trait: false) {  @if $trait==false {    @return '[am-' + $module + ']';  } @else {    @return '[am-' + $module + '~="' + $trait + '"]';  }}

2.关于style/global.scss和style/index.scss

global.scss中导入的代码不仅在Vue文件中使用,而且在style中scss定义文件里也会被引用到

# style/global.scss@import "./settings/var.scss";# style/settings/var.scss$background-color-primary: #F1F1F1;$background-color-secondary: $color-white;# style/acss/color.scss@each $style in (primary $background-color-primary, secondary $background-color-secondary) {  [bg-#{nth($style, 1)}] {    background-color: #{nth($style, 2)};  }}

全局引入style/global.scss

// 根目录下:vue.config.jsmodule.exports = {  css: {    loaderOptions: {      scss: {        // @/ 是 src/ 的别名        // 注意:在 sass-loader v8 中,这个选项名是 "prependData"        prependData: `@import "@/style/global.scss";`      },    }  }}

style/index.scss定义的代码只是不被style中其他css文件引用到而已,其他的都和global.scss一致引入style/index.scss

// src/main.jsimport { createApp } from 'vue'import App from './App.vue'import router from './router'import './style/index.scss'createApp(App).use(router).mount('#app')

下面简单分析和演示下各个style目录中的代码作用。

1.acss

该目录主要是定义一些简单的border、color、font-size、margin和padding等代码

/* style/acss/border.scss */@for $i from 1 through 100 {  [radius#{$i}] {     border-radius: #{$i}Px;    overflow: hidden;  }}[circle] {  border-radius: 50%;}/* style/acss/font-size.scss */@for $i from 12 through 30 {  [fz#{$i}] {     font-size: #{$i}px;  }}

使用acss代码

border-radius: 20px;
border-radius: 50%;
font-size: 30px;

2.base

该目录主要是重置项目中一些元素的默认样式,比如input、hn、p、a等元素

/* style/base/form.scss */input {  padding: 0;  outline: none;  border: none;}/* style/base/link.scss */a {  color: #ccc;  text-decoration: none;}

3.settings

该目录是定义全局的、项目统一规范的文本颜色、边框颜色等变量

/* style/settings/var.scss *//* 主题色调 */$color-primary: #FF5777;$color-white: #FFFFFF;/* 文本色调 */$color-text-primary: green;$color-text-secondary: #FF4533;$color-text-tertiary: $color-white;$color-text-quaternary: $color-primary;/* 盒子边框色调 */$border-color-base: #E5E5E5;/* 盒子背景色色调 */$background-color-primary: #F1F1F1;$background-color-secondary: $color-white;$background-color-tertiary: $color-primary;/* 盒子默认边框 */$border-width-base: 1Px !default;$border-style-base: solid !default;$border-base: $border-width-base $border-style-base $border-color-base !default;

4.theme

该目录定义项目各个主题下相关模块的样式

/* style/theme/default.scss */[data-theme='default'] .header {  background: #FF5777;}[data-theme='default'] .footer {  color: #FF5777;  border: 2px solid #FF5777;;}/* style/theme/cool.scss */[data-theme='cool'] .header {  background: #409EFF;}[data-theme='cool'] .footer {  color: #409EFF;  border: 2px solid #409EFF;;}

我们通过添加html元素上的data-theme属性和值,即可达到项目主题的变换

  
export default { name: "Theme", setup() { const changeTheme = (theme = 'default') => { window.document.documentElement.setAttribute("data-theme", theme); } return { changeTheme } }}
This is an about page title
This is an about page content

5.tools

该目录是定义一些全局的公共mixin和function,目前这块内容比较完善就是SassMagic,感兴趣的可以点进来看一下。下面简单看一下BEM模式的应用

$elementSeparator: '__';$modifierSeparator: '--';// 判断`$selector`中是否包含BEM中Modify@function containsModifier($selector) {  $selector: selectorToString($selector);  @if str-index($selector, $modifierSeparator) {    @return true;  } @else {    @return false;  }}// 将`$selector`转换成String@function selectorToString($selector) {  $selector: inspect($selector); //cast to string  $selector: str-slice($selector, 2, -2); //remove brackets  @return $selector;}// @param  {String}  $selector@function getBlock($selector) {  $selector: selectorToString($selector);  $modifierStart: str-index($selector, $modifierSeparator) - 1;  @return str-slice($selector, 0, $modifierStart);}@mixin b($block) {  .#{$block} {    @content;  }}@mixin e($element) {  $selector: &;  @if containsModifier($selector) {    $block: getBlock($selector);    @at-root {      #{$selector} {        #{$block + $elementSeparator + $element} {          @content;        }      }    }  } @else {    @at-root {      #{$selector + $elementSeparator + $element} {        @content;      }    }  }}@mixin m($modifier) {  @at-root {    #{&}#{$modifierSeparator + $modifier} {      @content;    }  }}// @param {string} $block - BEM中的Block// 
//
//
//
//
// @include b(block) {// background: red;// @include e(header){// font-size: 14px;// @include m(css) {// font-size: 18px;// }// };// }// 编译后// .block {// background: red;// }// .block__header {// font-size: 14px;// }// .block__header--css {// font-size: 18px;// }

尾声

暂时先讲这么多,更多内容可以关注下这个仓库vue3-css-architecture,会持续更新完善,补充更多的mixin、function,以及在项目中的应用。

(学习视频分享:css视频教程)

以上就是浅析CSS中的5种设计模式,聊聊vue项目中CSS目录代码的作用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1623695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
鲜为人知!用css做极光效果
上一篇 2025年12月24日 08:22:41
深入浅析css中的层叠上下文
下一篇 2025年12月24日 08:22:48

相关推荐

  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • css max-height属性怎么用

    max-height 属性设置元素的最大高度。 说明 该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。 注意:max-height 属性不包括外边距、边框和内边距。 立即学习“前端免费学习笔记(深入)”; 值描述none 默认。定义对元素被允许的最大高…

    2026年5月10日
    100
  • 修复点击时按钮抖动:CSS垂直对齐实践

    本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…

    2026年5月10日
    100
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 如何在HTML中插入表单元素_HTML表单控件与输入类型使用指南

    HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…

    2026年5月10日
    100
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2026年5月10日
    200
  • JavaScript 动态菜单点击高亮效果实现教程

    本教程详细介绍了如何使用 JavaScript 实现动态菜单的点击高亮功能。通过事件委托和状态管理,当用户点击菜单项时,被点击项会高亮显示(绿色),同时其他菜单项恢复默认样式(白色)。这种方法避免了不必要的DOM操作,提高了性能和代码可维护性,确保了无论点击方向如何,功能都能稳定运行。 动态菜单高亮…

    2026年5月10日
    200
  • html5怎么画实线_HTML5用CSS border-style:solid画元素实线边框【绘制】

    可通过CSS的border-style属性设为solid添加实线边框:一、内联样式用border:2px solid #000;二、内部样式表统一设置如div{border:1px solid #333};三、外部CSS文件定义.my-box{border:3px solid red}并引入;四、单…

    2026年5月10日
    400
  • css如何禁止滚动条

    css禁止滚动条的方法:1、完全隐藏,代码为【】;2、在不需要时隐藏,代码为【】;3、样式表方法。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 1、完全隐藏 在里加入scroll=”no”,可隐藏滚动条;   立即学习“前端免费学习笔记(深入)”;…

    2026年5月10日
    000
  • 动态更新圆形进度条:JavaScript成绩计算器集成指南

    本文档旨在指导开发者如何将JavaScript成绩计算系统与动态圆形进度条集成,实现可视化展示平均成绩。我们将详细讲解如何修改现有的JavaScript代码,使其在计算出平均分后,能够动态更新圆形进度条的进度,从而提供更直观的用户体验。本文档包含详细的代码示例和注意事项,帮助开发者轻松实现这一功能。…

    2026年5月10日
    000
  • React组件中动态属性值的管理与同步:利用状态实现受控组件

    本教程旨在解决react组件中动态属性值同步使用的问题。我们将探讨如何利用react的`usestate` hook来管理组件内部状态,从而实现一个属性的值动态地影响另一个属性,并构建出可预测、易于维护的受控组件。文章将通过具体代码示例,详细阐述从初始化状态到处理状态更新的完整过程,并强调受控组件在…

    2026年5月10日
    000
  • 如何讲html和css_讲解HTML与CSS结合使用基础【基础】

    需将HTML与CSS结合使用以实现网页结构与样式的分离:HTML定义标题、段落等语义结构,CSS控制颜色、字体等外观;可通过内联样式、内部样式表或外部CSS文件引入样式,并利用类选择器和ID选择器精准应用。 如果您希望网页不仅展示内容,还能具备基本的样式和结构布局,则需要将HTML与CSS结合使用。…

    2026年5月10日
    100
  • CSS伪元素与固定背景:移动友好的实现策略

    本文深入探讨了如何利用CSS的::before伪元素、position: fixed和z-index属性,创建一种在移动设备上表现更稳定的全屏固定背景效果,以替代传统background-attachment: fixed可能存在的兼容性问题。教程将详细解析这些核心CSS概念及其在构建响应式布局中的…

    2026年5月10日
    000
  • JavaScript计算器开发:解决数值显示与初始化问题

    本教程深入探讨了使用JavaScript构建计算器时常见的数值显示异常问题,特别是由于类属性未初始化导致的`Cannot read properties of undefined`错误。我们将详细分析问题根源,并通过在构造函数中调用初始化方法来解决该问题,同时优化显示逻辑,确保计算器功能稳定且界面显…

    2026年5月10日
    000
  • HTML表单如何实现PWA支持?怎样添加离线功能?

    答案是利用Service Worker缓存资源并结合Background Sync API实现离线提交与自动同步。通过注册Service Worker缓存表单相关文件,拦截提交行为,将离线数据存入IndexedDB,并注册后台同步任务,待网络恢复后由Service Worker自动发送数据,确保提交…

    2026年5月10日
    000
  • CSS技巧:在复杂悬停效果中确保图像始终可见

    CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见

    本教程探讨如何在包含悬停效果的CSS卡片布局中,确保图像始终显示在最顶层而不被裁剪或遮挡。通过调整HTML结构,利用CSS的position和z-index属性,以及引入pointer-events,我们将解决图像被overflow: hidden和扩展叠加层遮盖的问题,实现复杂的视觉交互效果。 在…

    2026年5月10日 用户投稿
    000
  • HTML文档如何工作?如何编辑HTML格式文件?

    HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?

    浏览器解析和渲染html的过程包括:1. 解析html构建dom树;2. 结合css构建渲染树;3. 布局计算元素位置;4. 绘制像素到屏幕。编辑html可使用记事本、vs code、sublime text等文本或代码编辑器,其中vs code因语法高亮、自动补全和插件生态成为主流选择。标准htm…

    2026年5月10日 用户投稿
    100
  • JavaScript 中使用多个 querySelector 更新页面元素

    本文旨在讲解如何在 JavaScript 的 if 语句中使用多个 querySelector 来更新不同的页面元素,并提供示例代码和注意事项,帮助开发者理解并应用此技术。通过该方法,可以根据特定条件动态修改页面内容,提升用户体验。 使用 querySelector 在 if 语句中更新多个元素 在…

    2026年5月10日
    100
  • HTTP客户端请求缓存与重用优化

    合理使用客户端缓存与连接复用可显著提升Web性能。通过Cache-Control、ETag和Last-Modified实现条件请求,避免重复传输;启用Keep-Alive并维护TCP连接池以减少握手开销;优先采用HTTP/2或HTTP/3实现多路复用与低延迟连接;针对静态资源设置长缓存,动态数据使用…

    2026年5月10日
    000
  • CodeIgniter在IIS环境下实现URL重写与index.php移除指南

    本教程详细指导如何在IIS服务器上部署的CodeIgniter应用中,移除URL中不必要的index.php。核心解决方案涉及修改CodeIgniter的config.php文件,将$config[‘index_page’]设置为空,并辅以正确的IIS web.config重…

    2026年5月10日
    100

发表回复

登录后才能评论
关注微信