编写高效的CSS代码

Vue3+Nuxt4 SSR项目Ubuntu部署全流程与性能优化指南 服务端渲染(SSR)是一种在服务器端生成完整HTML页面的技术,通过将Vue组件预先渲染成静态内容,有效提升首屏加载速度和搜索引擎优化(SEO)效果。其核心原理是在Node.js环境中执行前端框架的渲染逻辑,生成可直接呈现的HTML结构,再配合客户端Hydration实现交互功能。这种架构特别适合内容密集型应用,如新闻门户和电商平台,能显著改善核心Web指标(如LCP)。在工程实践中,结合Nginx反向代理和PM2进程管理,可以构建高可用的生产环境部署方案。本文以Vue3和Nuxt4技术栈为例,详细解析在U 阅读详情

高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题。

有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也可以变得很低能。这很容易被忘记,尤其是当你意识到你会的太少,CSS代码效率很低的时候。

下面的规则只真正被应用到那些速度要求很高,有成百上千的DOM元素被绘制在页面上的大型网站。但是,实践出真理,这和你是在创建下一个Facebook,还是写一个本地的展示页面都没有关系,多知道一点总是好的。

CSS选择器:

对我们大多数人来说,CSS选择器并不陌生。最基本的选择器是元素选择器(比如div),ID选择器(比如#header)还有类选择器(比如.tweet)。

一些的不常见的选择器包括伪类选择器(:hover),很多复杂的CSS3和正则选择器,比如:first-child,class ^= “grid-”.

CSS选择器具有高效的继承性,引用Steve Souders的话, CSS选择器效率从高到低的排序如下:

1.ID选择器 比如#header

2.类选择器 比如.promo

3.元素选择器 比如 div

4.兄弟选择器 比如 h2 + p

5.子选择器 比如 li > ul

6.后代选择器 比如 ul a 7. 通用选择器 比如 *

7.属性选择器 比如 type = “text”

8.伪类/伪元素选择器 比如 a:hover

以上引用自Steve Souders的Even Faster网站、

我们不得不提的是,纵使ID选择器很快、高效,但是它也仅仅如此。从Steve Souders的CSS Test我们可以看出ID选择器和类选择器在速度上的差异很小很小。

在Windows系统上的Firefox 6上,我测得了一个简单类选择器的(reflow figure)重绘速度为10.9ms,而ID选择器为12.5ms,所以事实上ID比类选择器重绘要慢一点点。

ID选择器和类选择器在速度上的差异基本上没有关系。

在一个标签选择器(a)的测试上显示,它比类或ID选择器的速度慢了很多。在一个嵌套很深的后代选择器的测试上,显示数据为440左右!从这里我们可以看出ID/类选择器 和 元素/后代选择器中间的差异较大,但是相互之间的差异较小。

注意: 这些数据可能在不同计算机和浏览器中间的差异较大。强烈地建议大家在自己的机子上测试一下。

组合选择器

你可以有一个标准的选择器比如 #nav,来选择任何带有ID为”nav”的元素,或在你可以有一个组合选择器比如#nav a,来选择任何在ID为’nav’的元素里面的链接元素

此刻,我们读这些是从左到右的方式。我们是先找到#nav,然后从它的里面找其他元素。但是浏览器解析这些不是这样的:浏览器解析选择器是从右到左的方式。

在我们看来,#nav里面带了一个a,浏览器却是看到的a在#nav里面。这些细微的差异对选择器的效率有很大的影响,同时学这些差异也是很有价值的。

如果想要知道更多浏览器这样解析的原因,请看Stack Overflow上的讨论

浏览器从最右边的元素开始(它想要渲染的元素),然后用它的方式回溯DOM树比从DOM树的最高层开始选择向下寻找,甚至可能达不到最右边的选择器—关键的选择器要高效。

这些对CSS选择器的效率有很大的影响。

关键选择器

关键选择器,正如前面讨论的一样,是一个复杂的CSS选择器中最右边部分。它是浏览器最先寻找的。

现在我们回到讨论开始的地方,哪类选择器是最高效的?哪个是会影响选择器效率的关键选择器;写CSS代码的时候,关键选择器是能否高效的决定因素。 一个关键CSS选择器像这样:

#content .intro {..} 

是不是高效选择器比如类选择器天生就高效?浏览器会寻找.intro的实例(可能会很多),然后沿着DOM树向上查找,确定刚才找到的实例是否在一个带有ID为”content”的容器里面。

但是,下面的选择器就表现的不是那么好了:

#content * {..} 

这个选择器所做的是选择所有在页面上的单个元素(是每个单个的元素),然后去看看它们是否有一个 #content 的父元素。这是一个非常不高效选择器因为它的关键选择器执行开销太大了。

运用这些知识我们就可以在分类和选择元素的时候做出更好的选择。

假设你有一个复杂的页面,它相当巨大并且在你的一个很大很大的站点上。在那个页面上有成百上千甚至上万的 a 标签。它还有一个小的社交链接区域放在一个ID为#social的Ul里面。我们假设它们是Twitter,Facebook,Dribbble还有 Google+的链接吧。在这个页面上我们有四个社交链接和成百上千的其他链接。 下面的这个选择器就自然的不是那么高效和合理了:

#social a {…} 

这里发生的情况是浏览器会在定位到#social区域下的四个链接之前得到页面上所有成千上万的链接。我们的关键选择器匹配了太多我们不感兴趣的其他元素。

为了补救我们可以给每个在社交链接区域的 a 增加一个更特殊、明确的选择器 .social-link , 但是这好像有点违背我们的认知:当我们能用组合选择器的时候就不要放不必要的类标示在元素上。

这就是为什么我对选择器的性能如此感兴趣的原因了:必须在web 标准最佳实践和速度之间的保持平衡。

通常我们有:

<ul id="social"> 

    <li><a href="#" class="twitter">Twitter</a></li> 

    <li><a href="#" class="facebook">Facebook</a></li> 

    <li><a href="#" class="dribble">Dribbble</a></li> 

    <li><a href="#" class="gplus">Google+</a></li> 

</ul> 

CSS:

#social a {} 

我们现在最好有:

<ul id="social"> 

    <li><a href="#" class="social-link twitter">Twitter</a></li> 

    <li><a href="#" class="social-link facebook">Facebook</a></li> 

    <li><a href="#" class="social-link dribble">Dribbble</a></li> 

    <li><a href="#" class="social-link gplus">Google+</a></li> 

</ul> 

加上CSS:

#social .social-link {} 

这个新的关键选择器将会匹配更少的元素,这意味着浏览器能够很快的找到它们并渲染特定的样式,然后专注于下一件事。

另外,事实上我们可以用.social-link{}更清晰的选择,而不是过分限制它。阅读下一部分你会原因…

简单的重述一次,你的关键选择器会决定浏览器的工作量,因此,我们应该重视一下关键选择器

过度限制选择器

现在我们知道了什么是关键选择器,还有它是大部分工作的来源,但是我们可以更乐观一点。拥有一个明确的关键选择器最大的好处就是你可以避免使用过度限制选择器。一个过度限制选择器可能像:

html body .wrapper #content a {} 

这里的写的太多了,至少3个选择器是完全不需要的。它可以最多像这个样子:

#content a {} 

这会发生什么呢? 首先第一个意味着浏览器不得不寻找所有的 a 元素,然后检查他们是否在一个ID为”content”的元素中,然后如此循环直到HTML标签。这样造成了太多的我们不太想要的花费。了解了这个,我们得到一些更现实的例子:

#nav li a{} 

变成这个:

#nav a {} 

我们知道如果a在li里面,它也必定在#nav里面,所有我们可以马上把li从选择器组中拿掉。然后,既然我们知道在页面中只有一个ID为nav的元素,那么它依附的元素就是完全没有关系得了,我们也可以拿掉ul

过度限制选择器使浏览器工作比它实际需要的更繁重,花费的时间更多。我们可以删掉不必需的限制,来使我们的选择器更简单和高效。

这些真的需要吗?

最短的答案是:或许不是。

最长的答案是:它取决于你正在搭建的站点。如果你正在为你的晋升而努力,那么就好好写出简单、高效的CSS代码吧,因为你可能不会感觉到它给你带来的改变。 如果你正在搭建下一个每个页面都以毫秒计算的Amazon网站,这样有时速度会很快,但有时可能不是。

浏览器将会在解析CSS的速度上变得更好,甚至在手机端。在一个网站上,你不太可能会觉察到一个低效的CSS选择器,但是….

但是

它确实发生了,浏览器还是不得不去做我们讨论的所有工作,无论它们变得多快。即使你不需要或者甚至不想实践任何一个,但是它都是我们值得学习的知识。请记住选择器可能会让你付出很大代价,你应该避免盯着一个看。这意味着如果你发现你自己在写像这样的:

div:nth-of-type(3) ul:last-child li:nth-of-type(odd) *{ font-weight:bold } 

这时,你可能就做错了。

现在,在高效选择器的世界我还是一个新人。所以如果我忘记了什么,或者你有需要补充的,请在评论里面留言。

更多高效选择器

我还不能完全介绍Steve Souders的网站和书籍(《更快速网站》、《高性能网站》),它们是如此之好,以至于值得你花更多时间来阅读和推荐。这个家伙只有他自己才了解自己!

Nuxt 3项目实战:从零到一构建与自动化部署全流程 本文详细介绍了从零开始搭建Nuxt 3项目并实现自动化部署的全流程。内容涵盖项目初始化、核心目录结构解析、数据获取与API路由开发,并重点讲解了使用PM2进行进程管理、Nginx配置反向代理,以及通过Shell脚本或GitHub Actions实现CI/CD自动化部署的最佳实践,帮助开发者高效构建稳定、可维护的生产级应用。 阅读详情

相关推荐

Django+Nuxt.js构建Universal Application实战指南

Universal Application(通用应用)是一种以环境无关性为核心理念的现代Web架构范式,强调同一业务逻辑在服务端与客户端具备行为一致性与确定性。其本质并非简单服务端渲染(SSR),而是通过分层契约实现路由、数据、状态的跨环境协同。Django凭借成熟的ORM、中间件生态与同步/异步双模能力,天然适合作为业务逻辑中枢;Nuxt.js则提供视图层的通用编排能力,支持SSG、SSR与SPA无缝切换。该架构显著提升首屏性能(LCP降低64%+)、SEO表现与错误可控性,特别适用于教育SaaS、企业内

weixin_30460489的博客 663

CSS中的选择器种类总结及效率比较

主要介绍了CSS中的选择器种类总结及效率比较,包括伪类选择器和伪元素选择器等,需要的朋友可以参考下

Nuxt 3 + Django 4 构建通用应用:SSR/SSG/水合一体化实践

通用应用(Universal Application)是一种支持服务端渲染(SSR)、静态站点生成(SSG)与客户端水合(Hydration)三态统一的现代Web架构范式。其核心原理在于将展示逻辑与业务逻辑严格分层,由前端框架(如Nuxt)负责视图呈现与首屏性能优化,后端框架(如Django)专注数据安全、权限校验与事务一致性。该模式显著提升SEO友好度、首屏加载速度与高并发稳定性,广泛适用于电商、内容平台与企业级管理后台等场景。本文基于Nuxt 3.12与Django 4.2生产级组合,详解跨域通信、数据

weixin_30312563的博客 312

css效率低怎么办,CSS选择器的一般性优化建议

如何对选择器进行优化并不是一个那么新鲜的话题,但是个人觉得,css作为前端开发人员一项必备的专业技能,有必要深入了解下css在页面渲染的一些关键点,并以此为css的优化提供依据。我们这篇文章将讨论选择器优化的一般性建议。浏览器如何应用选择器在给出css选择器优化建议之前,我们有必要弄清楚这样一个问题,那就是浏览器如何识别选择器并对相应的html元素进行样式渲染?浏览器对CSS的匹配原理是这样的,浏...

weixin_35917193的博客 407

基于vue2+nuxt构建的高仿饿了么(2018版)

前言 高仿饿了么,以nuxt作为vue的服务端渲染,适合刚接触或者准备上vue ssr的同学参考和学习 项目地址如遇网络不佳,请移步国内镜像加速节点 效果演示 查看demo请戳这里(请用chrome手机模式预览) 移动端扫描下方二维码 API接口文档 接口文档地址(基于apidoc) 技术栈 vue2 + vuex + vue-router + mint-ui...

qq_37529115的博客 2776

Nuxt.js 实战指南:从 Vue.js 到服务端渲染与静态站点生成

在现代前端开发中,服务端渲染(SSR)和静态站点生成(SSG)是解决单页应用(SPA)首屏加载缓慢与SEO优化难题的关键技术。其核心原理在于将页面的HTML在服务器端或构建时预先渲染,直接向浏览器或爬虫返回完整的页面内容,从而显著提升用户体验和搜索引擎友好度。这一技术价值在于平衡了开发效率与应用性能,尤其适用于内容型网站、电商平台及对首屏速度有严苛要求的应用场景。本文聚焦于Vue.js生态中的Nuxt.js框架,它通过约定大于配置的设计哲学,将SSR、SSG和SPA模式统一封装,提供了开箱即用的解决方案。通

weixin_30385925的博客 519

css选择器的效率

CSS选择器对我们来说并不是什么新东西,比如我们常用的基本选择器“元素标签选择器div”、“id选择器#header”、“类选择器.class”,或者我们很少见的伪类选择器“:focus”以及更复杂的 css3选择器“:nth-child”等等。 选择器有一个固有的效率,我们来看Steve S...

chijiesou6359的博客 539

Express框架核心概念与实战:从路由、中间件到项目部署

在Web开发领域,后端框架是构建高效、可维护服务器的关键工具。其核心原理在于通过抽象和封装底层HTTP处理逻辑,提供标准化的开发范式,从而提升开发效率和代码质量。这一技术价值体现在快速构建API服务、处理复杂业务逻辑以及实现安全防护等方面,广泛应用于博客后台、RESTful API接口和实时应用后端等场景。Express作为Node.js生态中最基础的Web应用框架,通过其极简的API和强大的中间件机制,完美诠释了这一理念。Express框架的核心在于路由、中间件和请求响应对象,其中中间件机制是其灵魂,允许

weixin_33889665的博客 388

css的选择器效率分析

我们都知道,CSS具有叠加性(同一个元素被多条样式规则指定),继承性(后代元素会继承前辈元素的一些样式和属性)和优先级 (由于CSS的叠加性和继承性,将产生优先级,这指的是哪条样式规则会最终作用于指定的元素,他只遵循一条规则,指定的越具体,优先级越高) 由上可知,选择器指定的越具体,那么他的优先级就越高, 在这里,我们来总结一下css的选择器: 一、基本选择器(标签选择器、通用选择器、类和I

384

SpringBoot+Vue3博客系统深度解析:从环境搭建到部署上线的完整工程实践

SpringBoot和Vue3作为现代Web开发的主流技术栈,其核心在于通过约定大于配置和组件化思想,构建高效、可维护的应用。SpringBoot通过自动配置和Starter依赖简化了Java后端开发,而Vue3的组合式API和响应式系统则提升了前端开发体验。在工程实践中,前后端分离架构需要解决跨域通信、统一API设计、状态管理等关键技术问题,这些能力对于构建博客系统、内容管理平台等应用具有普遍价值。本文以博客系统为例,深入探讨了从项目初始化、数据库设计到前后端联调的完整流程,特别是针对SpringBoot

dezhen7015的博客 347

Vue.js SEO优化实战:meta标签+预渲染解决百度不收录问题

单页应用(SPA)因客户端渲染(CSR)机制导致搜索引擎爬虫无法抓取动态内容,这是 Vue.js 项目上线后百度搜不到首页的核心原因。其技术本质在于 HTML 初始响应为空壳,缺乏语义化元信息与可索引内容。通过动态注入 meta tags 实现页面级 SEO 基础覆盖,结合 prerendering 预渲染生成静态 HTML 快照,可在不引入 SSR 复杂度的前提下显著提升收录效率与搜索可见性。该方案适用于官网、文档站、营销页等静态主导场景,兼顾开发效率与 SEO 效果,是中小型 Vue 项目最务实的落地路

weixin_30363509的博客 389

属性选择器

1.E[att^=value]属性选择器     E[att^=value]属性选择器是指选择名称为E的标记,且该标记定义了att属性,att属性值包含前缀为value的子字符串。需要注意的是E是可以省略的,如果省略则表示可以匹配满足条件的任意元素。例如,div[id^=section]表示匹配包含id属性,且id属性值是以“section”字符串开头的div元素。 &lt;!doctype...

无区新手的博客 1万+

基于Django与Nuxt的ChatGPT私有化部署:多用户Web客户端实战指南

在现代Web应用开发中,前后端分离架构已成为主流范式,它通过将用户界面与业务逻辑解耦,实现了职责清晰、独立部署与技术选型灵活等核心优势。其原理在于前端负责视图渲染与交互,后端通过API提供数据与服务,二者通过HTTP/HTTPS协议进行通信。这种架构的技术价值在于提升了开发效率、系统可维护性及横向扩展能力,广泛应用于企业级管理系统、中后台平台及实时交互应用等场景。以**Docker**容器化技术为基础,结合**PostgreSQL**等关系型数据库,开发者可以快速搭建高可用的私有化服务。本文聚焦于如何利用这

weixin_42676876的博客 504

编写高效的CSS选择器

英文原文:Writing efficient CSS selectors 参与翻译(4人): mischiefqlf, super0555, enixyu, throwable 高效的CSS已经不是一个新话题,也不是一个我非得重拾的话题,但是,它却是自我在SKY工作以后,真正感兴趣并始终关注的一个话题。 很多人或者忘记了,或者仅仅是没有意识到,CSS可以

不懂不懂 822

Vue 3与Vite技术栈演进:2026年前端开发趋势与最佳实践

现代前端开发中,响应式编程和组件化架构是构建复杂Web应用的核心概念。Vue.js作为渐进式框架,通过其响应式系统实现了数据与视图的自动同步,而Vite作为下一代前端构建工具,利用原生ES模块和预构建机制大幅提升了开发体验。这些技术的结合不仅优化了开发效率,还通过TypeScript支持和组合式API增强了代码的可维护性和类型安全。在工程实践中,Vite正从构建工具演进为全栈开发基座,与Vue生态深度集成,为服务端渲染、微前端架构等高级场景提供支持。本文聚焦Vue 3 Composition API、Vit

weixin_30254435的博客 445

Vercel免费部署指南:从零上手Serverless与前端项目实战

在云原生和Serverless架构日益普及的今天,开发者无需再为服务器运维、网络配置等底层细节耗费精力。Serverless Functions(无服务器函数)作为核心实现原理,通过事件驱动和按需执行的模式,将资源管理和扩缩容交由云平台自动处理,极大降低了运维成本和技术门槛。这种架构的技术价值在于实现了极致的弹性伸缩和按量计费,特别适合流量波动大或需要快速迭代的应用。在应用场景上,Serverless广泛服务于Web API、数据处理、实时文件处理以及AI应用接口等。结合全球CDN(内容分发网络)的边缘节点

weixin_33812433的博客 560

OpenClaw前端技术栈解析:React/Next.js在AI智能体项目中的选型与实践

在现代Web开发中,技术选型是项目成功的关键基础。React作为主流前端框架,以其声明式编程、组件化架构和庞大的生态系统,成为构建复杂交互界面的首选。其核心原理在于虚拟DOM和单向数据流,能够高效管理应用状态,尤其适合处理实时数据更新和复杂UI逻辑。结合Next.js全栈框架,开发者可以获得开箱即用的服务端渲染、静态生成及API路由能力,这显著提升了应用的首屏性能、SEO友好性和开发效率。这种技术组合在需要处理实时数据流、复杂状态管理和快速迭代的AI应用场景中价值尤为突出。以OpenClaw这类多模态AI智

weixin_34416649的博客 386

Spring Boot + Vue 3 + Elasticsearch 构建术语学习平台全栈实战

在软件开发领域,高效学习和掌握层出不穷的技术术语与框架概念是开发者面临的普遍挑战。传统文档阅读枯燥,知识碎片化严重。为了解决这一痛点,构建一个集结构化知识库、智能搜索和交互式学习于一体的平台成为技术趋势。其核心原理在于利用现代Web技术栈,将后端业务逻辑、前端用户界面与强大的搜索引擎相结合,实现知识的聚合与高效检索。这种平台的技术价值在于能够系统化地组织知识,通过关联代码示例和社区互动,将被动阅读转化为主动学习,极大提升学习效率。典型的应用场景包括企业内部知识库、技术社区以及个人学习管理工具。本文以构建一个

weixin_34208283的博客 374
上一篇: Struts2 ongl
下一篇: 将e盘的一个文本文件复制到d盘
张征宇
博客等级 码龄14年 4粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值