首頁 >web前端 >css教學 >鑑於 LESS 沒有內建的動態注入功能,如何在 LESS 中使用動態屬性名稱?

鑑於 LESS 沒有內建的動態注入功能,如何在 LESS 中使用動態屬性名稱?

Susan Sarandon
Susan Sarandon原創
2024-11-07 08:30:031029瀏覽

How can you use dynamic property names in LESS, given that it doesn't have a built-in feature for dynamic injection?

在LESS 中使用動態屬性和屬性名稱插值

一些程式框架(如CSS SASS)支援使用@ 語法動態注入屬性名稱,允許您將屬性的名稱和值注入選擇器。這是跨多個規則覆蓋公共屬性、應用轉換和管理複雜樣式而無需直接聲明它們的好方法。

不幸的是,LESS 缺乏這樣的功能,但它確實提供了一些使用參數混合的各種組合的解決方法-ins、變量注入(e() 函數)和模式匹配(@{ } )文法.

選項 1:使用 e() 函數注入屬性名稱

此方法涉及將動態建立的屬性名稱注入到另一個屬性的值中。儘管不優雅,但它確實完成了工作。

.vendors(@property, @value...){
    -webkit-@{e(@property)}: @value;
       -moz-@{e(@property)}: @value;
        -ms-@{e(@property)}: @value;
         -o-@{e(@property)}: @value;
            @{e(@property)}: @value;
}

選項2:將屬性注入以下類別名稱(小於v1.3.3)

此方法涉及定義供應商混合,然後建立包含供應商屬性的虛擬類別/規則集。然後使用 ~ 語法建構下一個類,將兩個供應商區塊綁定在一起。

.vendors(@property, @value, @rest:"") {
    @inject:~"@{rest} -webkit-@{property}: @{value}; -moz-@{property}: @{value}; -ms-@{property}: @{value}; -o-@{property}: @{value}; @{property}: @{value};";
}

.test(@nextclass){
    .vendors(transform, "matrix(2,0,0,2,20,20)");
    .vendors(transform-origin,"10px 10px", @inject);
    (~"{@{inject}} .@{nextclass}"){/*next class properties*/};
}

.this-class{
    .test(next-class);
}

選項3:使用遞歸注入屬性(Less v1.4.0 )

此方法解決了前一個方法在使用less v1.4 時的限制性,引入遞歸來建構供應商區塊並將其註入最終變數。

@nl: `"\n\t"`; 

.multi(@props,@vals,@i,@inj) {
    @property: extract(@props, 1);
    @value: extract(@vals, 1);
    @inject:~"@{inj}@{nl}-webkit-@{property}: @{value};@{nl}-moz-@{property}: @{value};@{nl}-ms-@{property}: @{value};@{nl}-o-@{property}: @{value};@{nl}@{property}: @{value};";
}

.multi(@props,@vals,@i,@inj:"") when (@i > 0) {
    @property: extract(@props, @i);
    @value: extract(@vals, @i);
    @injnext:~"@{inj}@{nl}-webkit-@{property}: @{value};@{nl}-moz-@{property}: @{value};@{nl}-ms-@{property}: @{value};@{nl}-o-@{property}: @{value};@{nl}@{property}: @{value};";
    .multi(@props,@vals,(@i - 1),@injnext);
}

@properties: "transform-origin" "transform";
@values: "10px 10px" "matrix(2,0,0,2,20,20)";

@p: ~"@{nl}width:20px; @{nl}height:12px; @{nl}background-color:#000;";

.this-class {
    .multi(@properties,@values,2,@p);
    @inj: ~"{@{inject}`'\n'`} `'\n'`.next-class ";
    @{inj} {/**/}
}

這些解決方法提供了一種創建動態屬性的方法LESS 中的名稱,儘管它不如使用其他框架的內建功能那麼優雅。隨著 LESS 1.6 的發布,實現了動態屬性名稱插值,使這個過程變得更加簡單。語法與選項 2 類似,使用 @{ } 作為屬性名稱。

以上是鑑於 LESS 沒有內建的動態注入功能,如何在 LESS 中使用動態屬性名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn