【问题标题】:Is it possible to alias a class or tag to another class or tag in SASS or LESS?是否可以将一个类或标签别名为 SASS 或 LESS 中的另一个类或标签?
【发布时间】:2012-09-07 04:52:26
【问题描述】:

我正在尝试使用 Less 或 Sass 使我的 bootstrap 2.1 标记更具语义化。考虑 Bootstrap 标准导航栏的以下标记:

<header id="main-nav" class="navbar navbar-static-top" role="banner">
    <nav class="navbar-inner" role="navigation">
        <div class="container">

            <!-- Collapse nav button -->
            <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

            <!-- Nav -->
            <nav id="navlinks" class="nav-collapse collapse pull-right">
                <ul class="nav nav-pills">
                    <li class="active">@Html.ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                    <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                </ul>
            </nav>
        </div>
    </nav>
</header>

显然,将 DIV 更改为更具语义的 HTML 5 标记很容易,但从标记中删除类链则更加困难。如果您要使用 mixin,例如:

header #main-nav {
    .navbar;
    .navbar-static-top;
}

以下定义不起作用,因为复合类不受影响:

.navbar .btn-navbar {
    display: none;  // hide button in full width (Why a compound class? Redundant?)
}

理想情况下,如果 less 或 sass 有这样的语法就好了:

header#main-nav $= .navbar;  // copy .navbar definitions using #main-nav as the name

header#main-nav @= .navbar;  // rename .navbar definitions to #main-nav

这可以吗?如果没有,如何实现语义标记?

【问题讨论】:

  • 一想到这件事的影响,我的后背不寒而栗……
  • 使用这些预处理器的主要原因之一是语义标记,尤其是在使用 css 框架时(提示:引导程序)。如果你能以某种方式让类自动应用到标签(如导航、菜单等),那么你基本上是无家可归的。我试图看看是否有办法消除那些长长的类链,但是这些类有很多嵌套和 JavaScript 依赖,因此几乎不可能在不丢失任何东西的情况下实现。

标签: twitter-bootstrap less sass


【解决方案1】:

你说的没有别名,但是LESS和Sass都有这样写的能力:

.navbar, #main-nav {
    .collapse {}
}

输出如下:

.navbar .collapse, #main-nav .collapse {}

Sass 有一个名为 @extend 的独特指令,其功能如下:

%common-styles {
    .collapse {}
}

.navbar {
    // unique navbar styles
    @extend %common-styles
}

#main-nav {
    // unique main-nav styles
    @extend %common-styles
}

此简化案例的输出将与第一个输出相同,但允许您以优雅的方式添加其他样式。

改写问题的更新

我非常谨慎地使用类,只是将元素集合描述为一个整体(它是电影列表吗?它是关于客户的信息吗?它是一个行动号召元素吗?)并让后代选择器处理休息。使用 CSS 预处理器时,链式类(ala OOPCSS)在很大程度上是不必要的:它可以为您组装样式。

在理论上的 Sass 引导程序中,无论我们设计什么网站,我们都可以定义一些我们希望为导航元素重用的东西(LESS 的语法略有不同,但它也可以这样做)。

@mixin drop-menu { // intended for use with ordered or unordered lists that contain unordered lists
    & > li {
        @include inline-menu;
        ul { display: none }
        &:hover {
            ul { display: list }
        }
    }
}

@mixin inline-menu { // use with ordered or unordered lists if you'd like
    display: inline;
    margin-right: 1em;
    & + li { margin-left: 1em; border-left: 1px solid }
}

@mixin subtle-box { // just a box with a subtle gradient and slightly rounded corners
    linear-gradient(white, #CCC);
    border-radius: .25em;
    padding: .5em;
}

@mixin clearfix {
    &:after {
        content: " ";
        display: table;
        clear: both;
    }
}

这些项目都不是你的 CSS 的一部分,除非你要求它们。

body > header nav { // this is our main navigation element
    @include drop-menu;
    @include subtle-box;
    color: blue;
    font-family: garamond, serif
}

nav.admin {
    @include inline-menu;
    color: orange;
}

section.gallery {
    @include clearfix;
    img { float: left; padding: 0 10px 10px 0 }
}

现在,如果您有多个非常不同但有很多共同样式的元素,请务必使用原始答案中提到的@extend 指令。

如果您在 Sass 和 LESS 之间做出选择,Sass 有更多的功能(例如非常酷的 @extend 指令、函数、列表等)。我最初选择 LESS 是因为它有一个不错的 3rd 方 Windows 编译器,所以我不必在我的虚拟机上安装 Ruby,而是不断地与语言作斗争(这些变量变量没用!)。

【讨论】:

  • 所以我想,您也必须对所有复合类选择器都这样做。我想它不会工作。
  • 如果您想用更复杂的测试用例更新您的原始问题,可能仍然有一个优雅的解决方案。如果有影响的话,我已经更正了我的答案生成的输出中的一个错误。
  • 我刚刚更新了我的问题,但问题的性质发生了变化。我暂时把你的答案标记为答案。
  • 我已经更新了答案。我创作 CSS 的方式与您当前使用的 OOPCSS 样式发生冲突。我坚信将逻辑与表示分离并促进可重用的 HTML,当您将一堆纯表示类附加到每个元素时,这是很难做到的。
猜你喜欢
  • 2015-06-08
  • 2016-09-11
  • 2018-07-25
  • 2020-03-14
  • 2022-07-23
  • 1970-01-01
  • 2011-04-24
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多