第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 提供了多种简写属性(如 marginpaddingborder 等),可以减少代码量并降低解析负担。
  • 批量更新样式:通过定义好状态变化所需的全部样式,并以类的形式应用,可以减少对 DOM 的多次操作,从而降低重排和重绘的频率。

示例 2: 使用 Will-Change 属性和硬件加速

will-change 属性可以告诉浏览器哪些元素即将发生变化,使浏览器提前进行必要的优化准备。此外,某些 CSS 属性(如 transformopacity)可以通过 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--successmessage-box--error: 这些修饰符清楚地表达了不同状态的消息框(成功或错误),并且可以很容易地添加更多状态(如警告、信息等)。
  • message-titlemessage-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代码的可读性和可维护性。遵循这些最佳实践可以帮助你创建更加清晰、易于理解和维护的样式表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio的笔记--BusyBox相关

BusyBox 相关 BusyBoxandroid上安装busybox和使用示例一、下载二、移动三、安装和设置环境变量四、使用 busybox源码下载和查看 BusyBox BUSYBOX BUSYBOX链接https://busybox.net/ 点击链接后如图 点击左边菜单栏的Get BusyBix中的Download Source 跳转到busybox 的下载源码…

LabVIEW与PLC点位控制及OPC通讯

在工业自动化中&#xff0c;PLC通过标准协议&#xff08;如Modbus、Ethernet/IP等&#xff09;与OPC Server进行数据交换&#xff0c;LabVIEW作为上位机通过OPC客户端读取PLC的数据并进行监控、控制与处理。通过这种方式&#xff0c;LabVIEW能够实现与PLC的实时通信&#xff0c…

C++ OpenGL学习笔记(1、Hello World空窗口程序)

终于抽出时间系统学习OpenGL 教程&#xff0c;同时也一步一步记录怎样利用openGL进行加速计算。 目录 1、环境准备1.1、库的下载1.2、库的选择及安装 2、OpenGL第一个项目&#xff0c;Hello World!2.1、新建hello world控制台项目2.2、配置openGL环境2.2.1 包含目录配置2.2.2 …

系统移植——Linux 内核顶层 Makefile 详解

一、概述 Linux Kernel网上下载的版本很多NXP等有自己对应的版本。需要从网上直接下载就可以。 二、Linux内核初次编译 编译内核之前需要先在 ubuntu 上安装 lzop 库 sudo apt-get install lzop 在 Ubuntu 中 新 建 名 为 “ alientek_linux ” 的 文 件夹 &#xff0c; …

ubuntu16.04ros-用海龟机器人仿真循线系统

下载安装sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi sudo apt-get install ros-kinetic-rocon-*echo "source /opt/ros/kinetic/setup.bash…

Connection lease request time out 问题分析

Connection lease request time out 问题分析 问题背景 使用apache的HttpClient&#xff0c;我们知道可以通过setConnectionRequestTimeout()配置从连接池获取链接的超时时间&#xff0c;而Connection lease request time out正是从连接池获取链接超时的报错&#xff0c;这通常…

【文档搜索引擎】在内存中构造出索引结构(上)

文章目录 主要思路正排索引和倒排索引的表示1. 正排索引查询文档详细信息2. 倒排索引中查找关联词3. 新增文档正排索引倒排索引实现词频统计 主要思路 通过 Index 类&#xff0c;在内存中构造出索引结构。这个类要提供的方法&#xff1a; 给定一个 docId&#xff0c;在正排索…

单节点calico性能优化

在单节点上部署calicov3273后&#xff0c;发现资源占用 修改calico以下配置是资源消耗降低 1、因为是单节点&#xff0c;没有跨节点pod网段组网需要&#xff0c;禁用overlay方式网络(ipip&#xff0c;vxlan),使用route方式网络 配置calico-node的环境变量 CALICO_IPV4POOL_I…

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一&#xff1a;What is HTTP(S)?&#xff08;什么是http&#xff08;s&#xff09;&#xff09; 1.What is HTTP? (HyperText Transfer Protocol)&#xff08;什么是 HTTP&#xff1f;&#xff08;超文本传输协议&#xff09;&#xff09; http是你查看网站的时候遵循的…

Javascript面试手撕常见题目(回顾一)

1.JS查找文章中出现频率最高的单词? 要在JavaScript中查找文章中出现频率最高的单词&#xff0c;你可以按照以下步骤进行操作&#xff1a; 将文章转换为小写&#xff1a;这可以确保单词的比较是大小写不敏感的。移除标点符号&#xff1a;标点符号会干扰单词的计数。将文章拆…

算法-Z-order算法

1、学习背景 激光雷达点云是无序的&#xff0c;Transformer只能对有序的数据进行处理&#xff0c;为了将Transformer用在点云处理中&#xff0c;需要将无序的点云转换成有序的数据&#xff0c;另外&#xff0c;由于Transformer会用到局部注意力机制&#xff0c;所以将无序的数据…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

三、使用langchain搭建RAG:金融问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…

SSH连接成功,但VSCode连接不成功

环境 在实验室PC上连接服务器234 解决方案&#xff1a;在VSCode中重新添加远程主机 删除旧的VSCode Server 在远程主机上&#xff0c;VSCode会安装一个‘vscode-server’服务来支持远程开发&#xff0c;有时旧的‘vscode-server’文件可能会导致问题&#xff0c;删除旧的&am…

scala中正则表达式的使用

正则表达式&#xff1a; 基本概念 在 Scala 中&#xff0c;正则表达式是用于处理文本模式匹配的强大工具。它通过java.util.regex.Pattern和java.util.regex.Matcher这两个 Java 类来实现&#xff08;因为 Scala 运行在 Java 虚拟机上&#xff0c;可以无缝使用 Java 类库&…

COMSOL with Matlab

文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…

小鹏“飞行汽车”上海首飞,如何保障智能出行的安全性?

近日&#xff0c;小鹏汇天的“陆地航母”飞行汽车在上海陆家嘴成功完成首飞&#xff0c;标志着飞行汽车时代在中国正式拉开序幕。作为一项突破性的科技创新&#xff0c;飞行汽车不仅将重塑我们的出行方式&#xff0c;还将深刻改变城市的交通格局。此次飞行不仅证明了飞行汽车的…

Service Discovery in Microservices 客户端/服务端服务发现

原文链接 Client Side Service Discovery in Microservices - GeeksforGeeks 原文链接 Server Side Service Discovery in Microservices - GeeksforGeeks 目录 服务发现介绍 Server-Side 服务发现 实例&#xff1a; Client-Side 服务发现 实例&#xff1a; 服务发现介绍…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

深度学习之超分辨率算法——SRGAN

更新版本 实现了生成对抗网络在超分辨率上的使用 更新了损失函数&#xff0c;增加先验函数 SRresnet实现 import torch import torchvision from torch import nnclass ConvBlock(nn.Module):def __init__(self, kernel_size3, stride1, n_inchannels64):super(ConvBlock…