【问题标题】:How to downsize my scss code?如何缩小我的 scss 代码?
【发布时间】:2017-03-31 02:41:56
【问题描述】:

我开始编写以下课程:

.small-bottom-margin { margin-bottom: $margin; }
.small-top-margin { margin-top: $margin; }
.medium-bottom-margin { margin-bottom: $margin *2; }
.medium-top-margin { margin-top: $margin *2; }
.large-bottom-margin { margin-bottom: $margin *4; }
.large-top-margin { margin-top: $margin *4; }

很快我就希望能够指定不同屏幕上发生的情况,例如(对于小的底部边距示例):

@media #{$small-only} { .small-bottom-margin-sm { margin-bottom: $margin; }}
@media #{$medium-only} { .small-bottom-margin-md { margin-bottom: $margin; }}
@media #{$large-only} { .small-bottom-margin-lg { margin-bottom: $margin; }}
@media #{$small-up} { .small-bottom-margin-sm-up { margin-bottom: $margin; }}
@media #{$medium-up} { .small-bottom-margin-md-up { margin-bottom: $margin; }}
@media #{$large-up} { .small-bottom-margin-lg-up { margin-bottom: $margin; }}
@media #{$medium-down} { .small-bottom-margin-sm-mp { margin-bottom: $margin; }}

... 等所有边距大小(中号和大号),以及上边距。

我发现这在我的 html 的可读性 + 通过我的应用程序添加边距的速度方面非常实用,当你有一个复杂的布局时,这通常是一种痛苦,但在我的 css 中编写似乎非常长。

这样做是不好的做法吗? 如果没有,是否有某种 css 函数可以让我自动生成所有这些代码?

【问题讨论】:

    标签: html css sass


    【解决方案1】:

    我认为这首先是你自己的编码风格和品味的问题,但对我来说,这些类似乎有点“无意义”。

    如果有一天,您决定让这些元素使用padding 而不是margin 会更实用。因此,您只需执行以下操作:

    .small-bottom-margin {
        /* margin-bottom: $margin; */
        padding-bottom: $margin;
    }
    

    这可行,但会使您的班级名称看起来很愚蠢。很像一个名为.red-button 的类。将其命名为 .alert-button 将更具未来性。

    我倾向于总是根据它们的功能来命名类。

    如果你想这样做,你可以通过做这样的事情来保持 SCSS 更加干燥。

    $breakpoints: (
        'sm': $small-only,
        'md': $medium-only,
        'lg': $large-only,
        'sm-up': $small-up,
        'md-up': $medium-up,
        'lg-up': $large-up,
        'sm-mp': $medium-down
    );
    
    $sizeFactors: (
        'small': 1,
        'medium: 2,
        'large: 4
    );
    
    $directions: (
        'up',
        'down',
    );
    
    @each $breakpointKey, $breakpointValue in $breakpoints {
        @media #{$breakpointValue} {
            @each $sizeFactorKey, $sizeFactorValue in $sizeFactors {
                @each $direction in $directions {
                    .#{$sizeFactorKey}-#{$direction}-margin-#{$breakpointKey} {
                        margin-#{$direction}: $margin * $sizeFactorValue; 
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答!如果我将我的班级称为 .small-bottom-spacing 而不是 margin 怎么办?这样我描述了类的功能。 (实际上,如果这样更好,我会觉得这有点傻,因为我们在玩文字……但很想知道你的想法!)
    • 总的来说,我同意 'iuliu.net' 所说的——你应该让你的类更加具体,这样你就可以在单个类上获得一堆 CSS 规则,而不是在一个类上获得一大堆类。单个 HTML 元素。但是是的:我发现至少做类似small-bottom-spacing 这样的事情会更好。 ;-)
    • 是的,我明白你们俩的意思;这似乎是商定的方式。我只是不明白,我可以有 2 个工作流程。 a) 预先创建我所有的类,当我需要它们时,我只需将它们添加到我的 html 中。或者b)为我想要添加间距的每个html元素创建一个类,然后进入css,在那里用它的间距写那个类,而大多数时候我不想给它任何其他属性.如果稍后我想更改该间距,我将不得不在 css 中找到该类,而不是直接在我的 html 中修改它。这不是浪费大量时间吗?
    • 您不必编写特定于单个元素的类。困难在于以合理和可管理的方式聚合属性。我会从另一边问你的问题:如果你有 30 个带有 .small-bottom-spacing 的标题和 30 个与这个类混合的其他元素。稍后您想减少除标题之外的所有内容的边距。现在你必须检查你所有的标记,并给元素像.very-very-small-bottom-spacing 或者像.small-bottom-spacing:not(h1,h2,h3,h4,h5,h6) { margin-bottom: $margin/2; } 这样的东西。你知道吗?
    • 嗯,是的,有道理。是的,我将深入研究我的代码,看看如何重构它。谢谢!
    【解决方案2】:

    像这样遍历不同的大小:

       $sizes: (
          'sm': $small-only,
          'md': $medium-only,
          'lg': $large-only,
          'sm-up': $small-up,
          'md-up': $medium-up,
          'lg-up': $large-up,
          'sm-mp': $medium-down
        );
    
        @each $key, $value in $sizes {
          @media #{$value} { .small-bottom-margin-#{$key} { margin-bottom: $margin; }}
        }
    

    【讨论】:

      【解决方案3】:

      你的课程太多了。您基本上只是为了不使用内联样式而复制所有 css 属性,这确实不是最理想的,但绝对比这样做更好。

      当您将 CSS 类应用于元素时,它应该主要说明该特定元素 ,而不是描述它应该具有什么类型的视觉样式已申请。

      根据the Google HTML/CSS Style guide,在ID 和类命名他们说

      /* Not recommended: presentational */
      .button-green {}
      .clear {}
      

      并且应该有一些隐含意味着更多属性的东西,比如

      /* Recommended: specific */
      .contact-image {}
      .btn-primary {}
      .video {}
      

      通过这种方式,您可以避免在一个元素上使用大量的类(我想您必须至少应用 4-5 个类才能使元素看起来像您想要的那样),并且您还可以添加含义一个元素。在 HTML 中,意义总是好的。

      另外,假设您的元素不能完全满足某个类的要求,而更像是现有元素的变体,您可以内联添加差异或创建变体类(如 .disabled、@ 987654325@, .full-width) 如果您认为它们将来会再次出现。

      【讨论】:

      • .full-width 与 .large-bottom-margin 不是同一个概念吗?或者可能是 .large-bottom-spacing,如果边距过于字面?
      • 真的取决于你的应用。我实际上有一种按钮,可以是固定的、动态的或全宽的(父级的)。这是设计师想出的,所以它们就像同一类的三个变体。恰好其中一个与您的情况接近。
      猜你喜欢
      • 2011-08-14
      • 2010-12-16
      • 2021-05-16
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多