sass 会损害性能吗?

2024-01-30

我一直在教育自己。阅读this http://code.google.com/speed/page-speed/docs/rendering.html:

引擎从右到左评估每个规则,从最右边的选择器(称为“键”)开始并遍历每个选择器,直到找到匹配或丢弃该规则。 (“选择器”是规则应应用的文档元素。)

例如:

ul li a {...}
#footer h3 {...}
* html #atticPromo ul li a {...]

现在,一些示例代码 SASS 为我输出:

#content #blog {
  /* ... */
}
/* line 85, ../sass/screen.scss */
#content #flickr {
  /* ... */
}

#content #flickr div p {
  /* ... */
}

这看起来有点尴尬……我做错了什么吗?这是我和Sass之间的沟通问题吗?我们正在失去它吗?

Edit: 一些SCSS代码:

#flickr {
    @include columns(5,8);
    background: url('../img/ipadbg.png') no-repeat;

    #ipod-gloss {
        z-index: 999;
        position: relative;
    }

    div {
        margin-top: -80px;
        margin-right: 20px;

        h2 {
            color: $white;
            font-size: 24px;
        }

        p {
            margin-top: 40px;
        }
    }
}

额外奖励!:文章说浏览器(或至少 Firefox)从右到左搜索选择器。我不明白为什么这是一个更有效的原因。有什么线索吗?


您必须在可维护性(嵌套可以更轻松地在样式表中找到方法)和渲染性能之间找到折衷方案。

根据经验,您应该尝试将自己限制在三层嵌套,并且如果没有必要,您应该避免嵌套 ID。

不过,我认为嵌套太多并不是最大的问题。当我意识到 mixin 的强大功能后,我就大量使用它们。

例如,这是我经常使用的按钮 mixin:

@mixin small-button($active-color: $active-color, $hover-color: $button-hover-color, $shadow: true)
  display: inline-block
  padding: 4px 10px
  margin:
    right: 10px
    bottom: 10px
  border: none
  background-color: $button-color
  color: $font-color-inv
  +sans-serif-font(9px, 700)
  text-align: center
  text-transform: uppercase
  cursor: pointer
  @if $shadow
    +light-shadow
  &:hover
    text-decoration: none
    background-color: $hover-color
  &:last-child
    margin-right: 0
  a
    color: $font-color-inv
    &, &:hover
      text-decoration: none
  &.disabled
    +opacity(0.75)
    &:hover
      background-color: $button-color
  &.active
    background-color: $active-color
    &.disabled:hover
      background-color: $active-color

你看,相当多的代码。将此类 mixin 应用于页面上的许多元素将导致生成一个大的 CSS 文件,并且需要更长的时间来解释。

在老式的 CSS 方式中,你可以给每个按钮元素,例如.small-button 类。但这种方法会用无语义的类污染您的标记。

Sass 提供了一个解决方案:通过选择器继承@extend指令 http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#extend.

如果您为 mixin 的参数设置默认值,您还可以提供一个简单的类,它将 mixin 与您的默认值一起使用:

// Use this mixin via @extend if you are fine with the parameter defaults
.small-button
  +small-button

然后你可以在各种上下文中继承这个类:

#admin-interface
  input[type=submit]
    @extend .small-button

生成的 CSS 语句将 .small 按钮的所有用法聚合到一条规则中,并使用逗号分隔的选择器:

.small-button, #admin-interface input[type=submit] {
  display: inline-block;
  ...
}

总之,简单地使用 Sass 会影响 CSS 性能。然而,如果使用得当,由于结构良好和 DRY 代码,它是可维护的,它可以正确分离标记和样式(仅语义类),并允许智能和高性能的 CSS 代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sass 会损害性能吗? 的相关文章

  • Quill 公开可用的 CSS

    我最初的目的是从 PrimeFaces TextEditor 组件输出的 HTML 生成 PDF 文件 而该组件又基于 免费开源 WYSIWYG 编辑器 Quill 为此 我需要获取 TextEditor 组件生成的 HTML 将其包含在
  • chrome 中选择选项元素的额外填充

    我有一个选择元素 用户可以在其中选择分类和描述 仅在 Chrome 浏览器中 我有一个额外的填充 无法使用 padding 0 或其他 css 标签删除它 Chrome 的屏幕 https i stack imgur com m3iIb p
  • 重新创建 CSS3 过渡三次贝塞尔曲线

    在 CSS3 过渡中 您可以将计时函数指定为 cubic bezier 0 25 0 3 0 8 1 0 在该字符串中 您仅指定曲线上点 P1 和 P2 的 XY 因为 P0 和 P3 始终分别为 0 0 0 0 和 1 0 1 0 根据苹
  • Bootstrap Affix Nav 导致下面的 Div 向上跳转

    我使用 Bootstrap 的 Affix 函数创建了一个 JSFiddle 以便在向下滚动并且标题移出视图时使导航保持在屏幕顶部 我遇到的问题是 当使用纯 HTML 时 导航下方的文本会过早地跳起来并隐藏在导航后面 查看有问题的代码her
  • Bootstrap 5 是否删除了行之间的间距?

    我开始使用 bootstrap 5 并注意到行之间没有空格 我们是否必须明确使用spacing https getbootstrap com docs 5 0 utilities spacing 实用程序喜欢mb 3 or mb 2等等试图
  • Gmail 无法在电子邮件上正确呈现字体

    我已经建立了一个 html 电子邮件并使用了 Google 字体 我已使用以下方法将字体包含在 head 标签中 if mso endif 并使用字体 即我这样做了
  • iPad - 无法在框架内滚动

    我无法滚动 iPad Safari 中框架内调用的 pdf 我已经尝试过两件事 2 指滚动 使用对象 嵌入代替框架 但这是行不通的 事实上我已经尝试了很多东西 溢出 高度等等 请帮我 先感谢您 根据这篇文章http support appl
  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • 如何将大于整个页面 100% 的元素居中对齐?

    我有一个宽度为 100 的 div 并且隐藏了一个宽度为 3000px 的 div 我希望3000px的div左右均匀地被切断 我会使用背景位置 中心 然而 事情比这更复杂 3000px div 包含 30 100px div 我尝试过在
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • GWT 主题/模板 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 GWT 开发一个应用程序 尽管 GWT 是基于 JAVA 的媒介 但外观和感觉只能通过 CS
  • 没有类的 CSS 选择器

    我正在使用选择器来选择不具有一个类的所有元素 list th not foo some rules 我怎样才能将其应用到多个班级 list th not foo list th not bar some rules 上面的 CSS 当然不会
  • 水平对齐输入字段

    我正在尝试获取一个输入字段 并且它与同一水平线上的关联提交按钮相关 但事实证明这是一个挑战 这是我的代码
  • 如何在文本区域中使用除“文本插入符号”之外的透明字体?

    我有一个简单的文本区域 我需要制作透明字母 同时允许文本插入符可见 当我应用以下规则时 我会得到隐形插入符 textarea background transparent opacity 0 当我键入不可见文本时 我需要看到文本插入符移动
  • 将父容器扩展至 100% 高度以容纳浮动内容

    我正在为一个客户项目而苦苦挣扎 我的全部divs 没有绝对定位 height 100 for html body 和容器divs 但静态内容未达到其内容 在 910 像素处 我可以将溢出属性更改为auto 并且背景会继续向下到内容的末尾 但
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 调整文本区域大小

    我需要使用文本区域来显示一些文本 问题是 如果我放置 4 5 行文本 就会出现滚动条 如何使用 CSS HTML 使文本区域与其内容一样大 没有滚动条 文本区域不需要动态更改其大小 我仅使用它来显示文本 我也可以使用禁用的文本区域 我希望文
  • 如何使用 Antd / Less 和 Sass / CSS 模块配置 Next.js

    我想用Next js https nextjs org 带有 Sass 和 CSS 模块但也想使用蚂蚁设计 https ant design 并希望对较小的建筑尺寸使用 Less 样式 我可以启用 CSS 模块或 Less 加载器 但不能同
  • 悬停时为 SVG 制作动画

    我正在尝试在悬停时为 SVG 文件设置动画 默认情况下 它可以使用 svg 函数实现出色的动画效果 例如
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di

随机推荐

  • 大地图寻路

    我正在创建一个带有 10 000 x 10 000 地图的游戏 我希望用户能够设置位置并让计算机立即找到最佳路径 然而 由于地图是10 000 x 10 000 有100 000 000个节点 并且通过诸如A 或Dijkstra之类的传统方
  • SQL GROUP_CONCAT 拆分为不同的列

    我进行了很多搜索 但没有找到解决我的问题的正确方法 我想做什么 我在 MySQL 中有 2 个表 国家 货币 我通过 CountryCurrency 将它们加入到一起 gt 由于多对多的关系 请参阅此示例 http sqlfiddle co
  • 将 cython cdef 扩展数组设置为零

    有没有一种 cython ic 方式来设置cdef数组归零 我有一个具有以下签名的函数 cdef cget values double cpc x double cpc y 该函数的调用方式如下 cdef double cpc x 16 c
  • 当鼠标实际移动到元素上时如何获取 MouseMove 事件

    基本上我想要做的是将自定义窗口的状态从最大化更改为正常状态 并调整窗口的位置 当用户单击标题栏并将鼠标移动到标题栏上时 在我的情况下 标题栏是一个简单的边框 显而易见的事情是将事件处理程序附加到MouseMove并检查鼠标左键是否被按下 p
  • 带有嵌套对象数组的胡子模板

    需要一点帮助来弄清楚为什么我的 Mustache 模板无法正确呈现 我很困惑为什么以下不起作用 我确信这是我的一个小错误或者其他什么 var tableRows name name1 values 1 2 3 name name2 valu
  • Python - 自动检测电子邮件内容编码

    我正在编写一个脚本来处理电子邮件 并且我可以访问电子邮件的原始字符串内容 我目前正在寻找字符串 Content Transfer Encoding 并扫描紧随其后的字符 以确定编码 编码示例 base64 或 7bit 或引用打印 有没有更
  • 在 Play Framework 2.0 上运行演化

    最近的这篇文章 如何在 Play Framework 2 0 中使用 Evolutions https stackoverflow com questions 8164157 how to use evolutions in play fr
  • 从我的网页访问 Flask 服务器

    这是一个问题 从这个问题继续here https stackoverflow com questions 22088719 can flask use with jquery post 我正在尝试使用网页上的图像按钮来控制伺服电机 我的伺服
  • 使用完整单词作为登录系统的变量[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在创建一个登录系统 当前使用硬编码整数作为用户 ID 密码和学生号 这意味着它们都是数字 我将使用什么来使整数 用户 ID 和密码 成为
  • PSQLException:当前事务被中止,命令被忽略直到事务块结束

    我在 JBoss 7 1 1 Final 的 server log 文件中看到以下 截断的 堆栈跟踪 Caused by org postgresql util PSQLException ERROR current transaction
  • 如何从其他节点js文件调用该函数

    这些代码存储在单独的文件中 我尝试从该文件调用 get 方法到另一个nodejs 但我只得到 Function 作为输出 谁能告诉我如何从这个文件调用另一个节点js文件的get方法 use strict var createAPIReque
  • 如何清除 MySQL 控制台中的屏幕? [复制]

    这个问题在这里已经有答案了 我无法清除 MySQL 命令行提示符中的屏幕 我的屏幕上充满了表格 数据和查询 我怎样才能清除它 Ctrl L 会做的 这是一个 shell 命令 但它在 MySQL 控制台中运行良好
  • 带 DatePicker 的 AlertDialog

    我的想法是使用 AlertDialog 并将其设置为 DatePicker 我的代码是 AlertDialog Builder builder new AlertDialog Builder this DatePicker picker n
  • PLCrashReporter - 如何符号化进程中的崩溃数据?

    在我们获得崩溃数据后 有没有办法对崩溃报告进行符号化 目前 这就是我在handleCrashReport方法中所做的事情 PLCrashReportTextFormat textFormat PLCrashReportTextFormati
  • Android 在 Google 地图中进行捏合缩放

    谷歌地图中的捏缩放功能是否可行 我进行了多次搜索但没有得到任何解决方案 请给出您的看法 或者需要编写api来实现这些功能 您是否使用 ScaleGestureDetector 来实现捏合和缩放 http developer android
  • 我的 Android 设备上的多个编码器支持 Mime 类型视频/avc

    当我枚举设备上的所有媒体编解码器时 我注意到以下编码器支持 mime 类型 video avc OMX qcom video encoder avc OMX google h264 encoder 你打电话时MediaCodec Creat
  • 如何高效找到重叠区间?

    我有以下玩具示例数据框 df f low f high 0 476201 0 481915 0 479161 0 484977 0 485997 0 491911 0 503259 0 508679 0 504687 0 510075 0
  • 尝试在 C# 中的 UInt16 上执行按位非 (~) 时出错

    出于某种原因 我根本不理解 或不明白 为什么这是有效的 UInt32 a 0x000000FF a UInt32 0x00000001 但这并没有 UInt16 a 0x00FF a UInt16 0x0001 它给出错误 常量值 某些数字
  • 如何处理 上的点击而不是子元素上的点击?

    我用以下代码处理点击 带输入的表 table tr td td tr table
  • sass 会损害性能吗?

    我一直在教育自己 阅读this http code google com speed page speed docs rendering html 引擎从右到左评估每个规则 从最右边的选择器 称为 键 开始并遍历每个选择器 直到找到匹配或丢