第10章:CSS最佳实践 --[CSS零基础入门]
代码组织
在CSS开发中,良好的代码组织和最佳实践对于项目的可维护性和扩展性至关重要。以下是两个示例,展示了如何遵循CSS最佳实践来组织代码。
示例 1: 使用 BEM(Block Element Modifier)命名法
BEM 是一种用于提高 CSS 可读性和可维护性的命名约定。它通过使用特定的命名模式帮助开发者更好地理解和组织样式规则。下面是一个简单的例子,展示如何在 HTML 和 CSS 中应用 BEM 命名法。
HTML
<article class="card"><img src="image.jpg" alt="Description" class="card__image"><div class="card__content"><h2 class="card__title">Title</h2><p class="card__text">Some descriptive text.</p><a href="#" class="card__link card__link--primary">Read More</a></div>
</article>
CSS
/* Block */
.card {border: 1px solid #ddd;border-radius: 4px;overflow: hidden;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}/* Element */
.card__image {width: 100%;display: block;
}.card__content {padding: 16px;
}.card__title {margin: 0 0 8px;font-size: 1.5em;
}.card__text {margin: 0 0 16px;
}/* Modifier */
.card__link {color: #007bff;text-decoration: none;
}.card__link--primary {background-color: #007bff;color: white;padding: 8px 16px;border-radius: 4px;
}
说明:
- Block:
.card是一个独立的组件。 - Element:
.__element表示属于该块的部分,如.card__image、.card__content等。 - Modifier:
.--modifier用来表示元素或块的不同状态或版本,例如.card__link--primary表示链接的一个变体。
示例 2: 使用 SCSS(Sass)进行模块化和嵌套
SCSS 是 CSS 的预处理器,允许你编写更简洁且结构化的代码。它可以让你利用变量、嵌套、混合(mixins)、函数等功能,从而提高代码的可维护性。
SCSS 文件 (styles.scss)
// Variables
$primary-color: #007bff;
$secondary-color: #6c757d;// Mixin for media queries
@mixin respond-to($media) {@if $media == small {@media (max-width: 576px) { @content; }} @else if $media == medium {@media (min-width: 576px) and (max-width: 768px) { @content; }} // Add more media queries as needed
}// Base styles
body {font-family: Arial, sans-serif;line-height: 1.5;color: $secondary-color;
}// Component: Button
.button {display: inline-block;padding: 8px 16px;font-size: 1em;border: none;border-radius: 4px;cursor: pointer;transition: all 0.3s ease;&--primary {background-color: $primary-color;color: white;&:hover {background-color: darken($primary-color, 10%);}}&--secondary {background-color: $secondary-color;color: white;&:hover {background-color: darken($secondary-color, 10%);}}@include respond-to(small) {padding: 6px 12px;font-size: 0.9em;}
}
说明:
- Variables: 定义了颜色等常用值作为变量,方便全局修改。
- Mixins: 创建了一个响应式断点的 mixin,简化了媒体查询的书写。
- Nesting: 使用嵌套减少了重复选择器的输入,并且使得样式与HTML结构更加匹配。
- Component: 按照组件的方式定义样式,比如按钮(
.button),并且为不同类型的按钮提供了修饰符(如.button--primary和.button--secondary)。
这两个示例展示了如何通过采用 BEM 命名法和使用 SCSS 来提高 CSS 代码的组织性和可维护性。遵循这些最佳实践可以帮助团队成员更容易地理解代码,同时也使得项目在未来更容易扩展和维护。
重用代码
在CSS开发中,重用代码是提高效率、减少冗余和增强可维护性的关键。以下是两个示例,展示了如何通过不同的方法来实现CSS代码的重用。
示例 1: 使用 CSS 类的组合与继承
通过定义通用样式类,并将这些类组合应用到HTML元素上,可以有效地重用样式规则。此外,使用伪类(如 :hover)可以在不增加额外类的情况下为特定状态添加样式。
HTML
<div class="container"><button class="btn btn-primary">Primary Button</button><button class="btn btn-secondary">Secondary Button</button><button class="btn btn-success">Success Button</button>
</div>
CSS
/* 基础按钮样式 */
.btn {display: inline-block;padding: 10px 20px;font-size: 16px;border: none;border-radius: 4px;cursor: pointer;transition: background-color 0.3s ease;
}/* 按钮颜色变体 */
.btn-primary {background-color: #007bff;color: white;
}.btn-secondary {background-color: #6c757d;color: white;
}.btn-success {background-color: #28a745;color: white;
}/* 鼠标悬停效果 */
.btn:hover {opacity: 0.9;
}
说明:
- 基础样式类:
.btn定义了所有按钮共享的基础样式。 - 变体类:
.btn-primary,.btn-secondary,.btn-success等为不同类型的按钮提供了特定的颜色和外观。 - 状态样式:通过
:hover伪类为所有按钮提供一致的鼠标悬停效果,无需为每个按钮单独定义。
示例 2: 使用 CSS 预处理器(如 SCSS/Sass)进行代码重用
CSS预处理器如SCSS允许你使用变量、混合(mixins)、嵌套等功能,从而更方便地重用代码并保持样式的一致性。
SCSS 文件 (styles.scss)
// 定义全局变量
$primary-color: #007bff;
$secondary-color: #6c757d;
$success-color: #28a745;
$padding-base: 10px;
$border-radius: 4px;// 创建mixin用于生成按钮样式
@mixin button-style($color) {background-color: $color;color: white;&:hover {background-color: darken($color, 10%);}
}// 定义基础按钮样式
.button {display: inline-block;padding: $padding-base 20px;font-size: 16px;border: none;border-radius: $border-radius;cursor: pointer;transition: background-color 0.3s ease;
}// 应用mixin到不同类型的按钮
.button--primary {@include button-style($primary-color);
}.button--secondary {@include button-style($secondary-color);
}.button--success {@include button-style($success-color);
}
说明:
- 变量:使用
$variable定义常用值,例如颜色和间距,这使得全局修改变得简单。 - Mixin:创建了一个名为
button-style的 mixin 来封装按钮的颜色逻辑,包括默认状态和悬停状态。这样可以避免重复编写相似的样式代码。 - 嵌套:利用 SCSS 的嵌套功能简化选择器结构,同时保持代码清晰易读。
这两个示例展示了如何通过合理组织 CSS 类以及使用预处理器特性来重用代码,减少重复劳动,并确保样式的一致性和可维护性。
性能优化
优化 CSS 性能对于提高网页加载速度和用户体验至关重要。以下是两个示例,展示了如何通过具体的策略来优化 CSS 性能。
示例 1: 减少重排(Reflow)和重绘(Repaint)
频繁的 DOM 操作和样式变化会触发浏览器重新计算布局(重排)和重新绘制页面(重绘),这可能会导致性能瓶颈。为了减少这些操作,应该尽量避免在运行时频繁修改样式,并将多个样式变更合并为一次执行。
优化前
/* 不推荐:每个属性单独设置 */
.box {margin-top: 10px;margin-right: 20px;margin-bottom: 10px;margin-left: 20px;
}/* 动态添加类或内联样式 */
<script>document.querySelector('.box').style.width = '200px';document.querySelector('.box').style.height = '200px';
</script>
优化后
/* 推荐:使用简写属性 */
.box {margin: 10px 20px; /* 简化后的写法 */
}/* 使用类切换而不是直接修改样式 */
<style>.box--expanded {width: 200px;height: 200px;}
</style><script>// 合并所有样式变更到一个类中,然后一次性应用document.querySelector('.box').classList.add('box--expanded');
</script>
说明:
- 使用简写属性:CSS 提供了多种简写属性(如
margin、padding、border等),可以减少代码量并降低解析负担。 - 批量更新样式:通过定义好状态变化所需的全部样式,并以类的形式应用,可以减少对 DOM 的多次操作,从而降低重排和重绘的频率。
示例 2: 使用 Will-Change 属性和硬件加速
will-change 属性可以告诉浏览器哪些元素即将发生变化,使浏览器提前进行必要的优化准备。此外,某些 CSS 属性(如 transform 和 opacity)可以通过 GPU 加速渲染,从而提高动画性能。
优化前
.element {transition: transform 0.5s, opacity 0.5s;
}.element:hover {transform: rotate(360deg);opacity: 0.5;
}
优化后
/* 提示浏览器提前准备好元素的变化 */
.element {will-change: transform, opacity;transition: transform 0.5s, opacity 0.5s;backface-visibility: hidden; /* 强制硬件加速 */
}.element:hover {transform: rotate(360deg);opacity: 0.5;
}
说明:
will-change属性:告知浏览器元素可能发生的改变,允许它提前做出优化。注意不要滥用此属性,因为过度使用可能导致不必要的资源消耗。- 硬件加速:通过设置
backface-visibility: hidden或者使用translateZ(0)等技巧,可以强制浏览器使用 GPU 来处理特定的动画效果,提升性能。
这两个示例展示了如何通过减少重排和重绘的操作次数以及利用硬件加速来优化 CSS 性能。遵循这些最佳实践可以帮助你构建更快、更流畅的网页应用。
语义化命名
语义化命名是 CSS 编码中的一个重要原则,它强调通过有意义的名称来描述样式的作用和用途,而不是基于样式的表现形式。这种方式有助于提高代码的可读性和可维护性,并且让其他开发者更容易理解代码的意图。
以下是两个使用语义化命名的例子:
示例 1: 使用语义化的类名来定义导航栏
HTML
<nav class="main-navigation"><ul><li><a href="#home" class="nav-link">Home</a></li><li><a href="#services" class="nav-link">Services</a></li><li><a href="#about" class="nav-link">About</a></li><li><a href="#contact" class="nav-link">Contact</a></li></ul>
</nav>
CSS
.main-navigation {background-color: #333;
}.main-navigation ul {list-style-type: none;margin: 0;padding: 0;display: flex;
}.nav-link {color: white;text-decoration: none;padding: 14px 16px;display: block;
}.nav-link:hover {background-color: #ddd;color: black;
}
说明:
main-navigation: 这个类名清晰地表示了这是一个主要的导航组件。nav-link: 表示这些链接是导航的一部分,而不仅仅是普通的链接。这使得它们与页面上的其他链接区分开来。
示例 2: 使用语义化的类名来构建一个消息框
HTML
<article class="message-box message-box--success"><h1 class="message-title">Success!</h1><p class="message-text">Your changes have been saved.</p>
</article><article class="message-box message-box--error"><h1 class="message-title">Error!</h1><p class="message-text">There was a problem with your request.</p>
</article>
CSS
.message-box {border: 1px solid #ccc;border-radius: 5px;padding: 16px;margin-bottom: 10px;
}.message-box--success {border-color: #28a745;background-color: #d4edda;
}.message-box--error {border-color: #dc3545;background-color: #f8d7da;
}.message-title {margin-top: 0;font-size: 1.2em;
}.message-text {margin: 0;
}
说明:
message-box: 类名直接反映了这个组件的功能——它是一个用来显示消息的盒子。message-box--success和message-box--error: 这些修饰符清楚地表达了不同状态的消息框(成功或错误),并且可以很容易地添加更多状态(如警告、信息等)。message-title和message-text: 这些类名明确了元素在消息框内的角色,即标题和正文内容,而不是依赖于视觉表现(如颜色或大小)来命名。
这两个例子展示了如何利用语义化命名来编写更清晰、更具描述性的 CSS。这样的做法不仅使代码更容易被其他开发者理解,而且也有助于保持样式的一致性和适应未来的设计变更。如果你有更多问题或需要进一步的帮助,请随时提问!
代码注释
良好的代码注释是确保CSS代码可读性和可维护性的关键。适当的注释可以帮助开发者快速理解样式的目的和作用,尤其是在团队协作或代码需要长期维护的情况下。以下是两个示例,展示了如何在CSS中添加有效的注释。
示例 1: 使用注释解释复杂的样式规则
当编写涉及复杂逻辑或特定浏览器兼容性的样式时,清晰的注释可以大大提升代码的可读性。下面是一个关于响应式设计的例子:
CSS
/* 响应式布局:根据屏幕宽度调整主内容区域和侧边栏的比例。主要适用于桌面和移动设备之间的转换。
*//* 桌面视图 */
@media (min-width: 768px) {.main-content {/* 主内容区占据75%的宽度 */flex: 3;}.sidebar {/* 侧边栏占据25%的宽度 */flex: 1;}
}/* 移动视图 */
@media (max-width: 767px) {.main-content, .sidebar {/* 在较小屏幕上,主内容区和侧边栏都占据整个宽度 */flex: 1 100%;}
}
说明:
- 整体注释:在
@media查询之前添加了一段描述,解释了接下来的样式将如何影响页面布局。 - 局部注释:为每个具体的样式规则提供了简短的注释,说明它们的作用和预期效果。
示例 2: 使用注释组织代码结构和模块化
对于大型项目,通过注释来划分不同的样式模块可以显著提高代码的结构性和易读性。以下是如何使用注释来组织一个包含多个组件的样式文件的例子:
SCSS 文件 (styles.scss)
// === 全局变量 ===
$primary-color: #007bff;
$secondary-color: #6c757d;
$base-font-size: 16px;// === 混合(Mixins) ===
@mixin flex-center {display: flex;justify-content: center;align-items: center;
}// === 组件:按钮 ===
.button {padding: 0.5em 1em;font-size: $base-font-size;border: none;border-radius: 4px;cursor: pointer;transition: background-color 0.3s ease;&--primary {@include button-style($primary-color);}&--secondary {@include button-style($secondary-color);}
}// === 组件:卡片 ===
.card {border: 1px solid #ddd;border-radius: 4px;overflow: hidden;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);&__image {width: 100%;display: block;}&__content {padding: 1em;}
}// === 工具函数 ===
@function button-style($color) {@return (background-color: $color,color: white,&:hover {background-color: darken($color, 10%);});
}
说明:
- 分隔线注释:使用
===分隔符将不同部分的代码区分开来,如全局变量、混合、组件等。这有助于快速定位和浏览代码的不同模块。 - 组件注释:为每个组件添加简短的标题注释,使读者能够迅速识别出各个部分的功能。
- 内联注释:对于一些不那么直观的样式规则(如混合中的
flex-center),提供额外的解释以帮助理解其功能。
这两个示例展示了如何通过详细的注释来增强CSS代码的可读性和可维护性。遵循这些最佳实践可以帮助你创建更加清晰、易于理解和维护的样式表。
相关文章:
第10章:CSS最佳实践 --[CSS零基础入门]
代码组织 在CSS开发中,良好的代码组织和最佳实践对于项目的可维护性和扩展性至关重要。以下是两个示例,展示了如何遵循CSS最佳实践来组织代码。 示例 1: 使用 BEM(Block Element Modifier)命名法 BEM 是一种用于提高 CSS 可读性…...
怎么在idea中创建springboot项目
最近想系统学习下springboot,尝试一下全栈路线 从零开始,下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea,选择file->New->Project 2.选择Spring Initializr->设置JDK->…...
递归读取指定目录下的文件
序言 需要读取sftp服务器上符合指定的文件名正则的文件列表,目前想到的最好的办法就是递归。 我这里引入的依赖是: <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…...
【模型压缩】原理及实例
在移动智能终端品类越发多样的时代,为了让模型可以顺利部署在算力和存储空间都受限的移动终端,对模型进行压缩尤为重要。模型压缩(model compression)可以降低神经网络参数量,减少延迟时间,从而实现提高神经…...
常用的JVM启动参数有哪些?
大家好,我是锋哥。今天分享关于【常用的JVM启动参数有哪些?】面试题。希望对大家有帮助; 常用的JVM启动参数有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM(Java Virtual Machine)启…...
Curvelet 变换与FDCT
Curvelet变换 Curvelet变换 是一种多尺度、多方向的信号分析工具,专门用于处理具有各向异性特征的信号,例如边缘和曲线。与传统的傅里叶变换和小波变换相比,Curvelet变换能够更精确地表示信号中的曲线特征,因此在图像处理、地震数据分析、医学成像等领域得到了广泛应用。 …...
Django Admin 管理工具
Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: /HelloWorld/HelloWorld/settings.py 文件代码: INSTALLED_APPS ( django.contrib.admin, django.co…...
Android笔记【19】
具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…...
矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
本文中的例子来源于: 这本书,网址为:https://web.stanford.edu/~boyd/vmls/ 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例 在量化金融中,矩阵作为一种重要的数学工具,被广泛用于描述和分析…...
Docker 中如何限制CPU和内存的使用 ?
在容器化的动态世界中,Docker 已经成为构建、部署和管理容器化的关键工具应用。然而,Docker 的效率在很大程度上取决于资源管理得有多好。设置适当的内存和 CPU 限制对于优化 Docker 性能至关重要,确保每个容器在不使主机负担过重的情况下获得…...
【AIGC-ChatGPT进阶提示词-《动图生成》】怪物工厂:融合想象力与创造力的奇幻世界
引言 在这个科技飞速发展的时代,人工智能正在不断突破我们的想象。而在众多AI应用中,有一个独特的创意工具正在悄然兴起,它就是"怪物工厂"。这个神奇的工具能够将人类天马行空的想象力与AI的创造力完美结合,打造出一个个奇异、有趣、甚至有些恐怖的怪物形象。本…...
docker 使用 xz save 镜像
适用场景 如果docker save -o xxx > xxx 镜像体积过大,可以使用 xz 命令压缩。 命令 例如 save busybox:1.31.1 镜像,其中 -T 是使用多核心压缩,可以加快压缩。 docker save busybox:1.31.1 |xz -T 8 > /tmp/busybox:1.31.1安装 xz Ubuntu/Debian sudo apt upda…...
C#经典算法面试题
网络上收集的一些C#经典算法面试题,分享给大家 # 递归算法 ## C#递归算法计算阶乘的方法 > 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿…...
vulnhub靶场【DriftingBlues】之9 final
前言 靶机:DriftingBlues-6,IP地址192.168.1.66 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...
有124个叶子节点的,完全二叉树最多有多少个节点
n=n0n1n2 其中n0为叶子节点, n2=n0-1 完全二叉树的定义和性质 最后化简,n=2*n0n1-1...
从RNN到Transformer:生成式AI自回归模型的全面剖析
个人主页:chian-ocean 文章专栏 生成式AI中的自回归模型详解 在生成式AI的飞速发展中,自回归模型作为核心技术之一,成为文本生成、语音合成、图像生成等领域的重要支柱。本文将全面探讨自回归模型的原理、架构、实际应用,并结合…...
Java爬虫大冒险:如何征服1688商品搜索之巅
在这个信息爆炸的时代,数据就是力量。对于电商平台而言,数据更是金矿。今天,我们要踏上一场Java爬虫的冒险之旅,目标是征服1688这个B2B电商巨头,获取按关键字搜索的商品信息。这不仅是技术的挑战,更是智慧的…...
基于Spring Boot的无可购物网站系统
一、系统背景与意义 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统,对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架ÿ…...
智能人家谱程序创意
实现一个家谱程序,并结合自传、视频、图片资料和智能对话系统,涉及到多个领域的技术:自然语言处理(NLP)、机器学习、计算机视觉、多媒体处理和数据存储。下面,我为你制定一个可执行的计划,详细阐…...
Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
大家好,我是袁庭新。 在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中࿰…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
