Tambahkan variabel dalam LESS css

Bagaimana saya bisa menambah variabel dalam LESS css?

Ini contohnya..

@counter: 1;
.someSelector("nameOfClass", @counter);
@counter: @counter + 1;
.someSelector("nameOfClass", @counter);

Cuplikan kode di atas akan menyebabkan "Kesalahan Sintaks" ini

SyntaxError: Recursive variable definition for @counter

Apakah ada solusi untuk kesalahan ini? Misalnya apakah ada notasi seperti @counter++ ?

Terima kasih..


person Yacoub Oweis    schedule 25.11.2013    source sumber
comment
Bukankah ini hanya duplikat yang diperkecil dari stackoverflow.com/questions/20199298?   -  person seven-phases-max    schedule 25.11.2013
comment
@ seven-phases-max: mungkin (mencurigai mirip baik dalam pertanyaan maupun waktunya).   -  person ScottS    schedule 25.11.2013


Jawaban (1)


Sangat Tidak Mungkin

Lihat dokumentasi tentang variabel LESS. Pada dasarnya, variabel LESS adalah konstanta dalam lingkup pembuatannya. Mereka malas memuat, dan tidak dapat "diubah" dengan cara itu. Definisi terakhir akan menjadi definisi yang digunakan untuk semua orang dalam lingkup tersebut. Dalam kasus Anda, kesalahan akan terjadi, karena variabel tidak dapat mereferensikan dirinya sendiri.

Perhatikan contoh ini:

@counter: 1;
.someSelector("nameOfClass", @counter);
@counter: 2;
.someSelector("nameOfClass1", @counter);

.someSelector(@name; @count) {
  @className: ~"@{name}";
  .@{className} {
  test: @count;
  }
}

Outputnya akan menjadi 2 untuk keduanya:

.nameOfClass {
  test: 2;
}
.nameOfClass1 {
  test: 2;
}

Ini karena LESS mendefinisikan @counter dengan definisi terakhir dari variabel dalam cakupan tersebut. Ia tidak memperhatikan urutan panggilan yang menggunakan @counter, melainkan bertindak seperti CSS dan mempertimbangkan "cascade" variabel.

Untuk diskusi lebih lanjut mengenai hal ini di LESS, Anda dapat melacak diskusi yang terjadi pada permintaan fitur LESS ini.

Solusinya ada di Penyetel Panggilan Rekursif untuk Variabel Lokal

Seven-phases-max tertaut dengan apa yang dia yakini sebagai bug di LESS , tapi menurutku tidak. Sebaliknya, bagi saya tampaknya merupakan penggunaan kreatif dari pengaturan ulang penghitung secara rekursif untuk mendapatkan efek yang diinginkan. Ini memungkinkan Anda mencapai apa yang Anda inginkan (menggunakan kode contoh saya):

// counter

.init() {
  .inc-impl(1); // set initial value
} .init();

.inc-impl(@new) {
  .redefine() {
    @counter: @new;
  }
}

.someSelector(@name) {
  .redefine(); // this sets the value of counter for this call only
  .inc-impl((@counter + 1)); // this sets the value of counter for the next call
  @className: ~"@{name}";
  .@{className} {
    test: @counter;
  }
}

.someSelector("nameOfClass");
.someSelector("nameOfClass1");

Berikut ini keluaran CSSnya:

.nameOfClass {
  test: 1;
}
.nameOfClass1 {
  test: 2;
}

CATATAN: Saya yakin Anda tidak sepenuhnya mengubah nilai global di sini, melainkan menetapkan nilai lokal baru dengan setiap panggilan ke .someSelector. Apakah ini didasarkan pada perilaku buggy atau tidak masih dipertanyakan, namun jika demikian, solusi ini mungkin akan hilang di masa mendatang. Untuk komentar lebih lanjut mengenai keterbatasan metode ini, lihat diskusi di sini.

person ScottS    schedule 25.11.2013
comment
Omong-omong. Saya baru ingat bahwa ada bug/masalah KURANG yang dapat disalahgunakan untuk meniru penghitung dan redefinisi variabel tersebut. Lihat inti ini. Tapi tentu saja ini tidak lebih dari sekedar peretasan yang aneh. Saya berharap masalah ini pada akhirnya akan diperbaiki. - person seven-phases-max; 25.11.2013
comment
@ seven-phases-max: Saya tidak setuju bahwa ini adalah bug di inti Anda. Ada satu mixin dengan cakupan global .inc() yang ditentukan, yang secara rekursif menetapkan variabel lokal @counter pada setiap panggilan (itu tidak benar-benar mengubah variabel penghitung global). Jadi pada dasarnya ini melacak penghitungan yang berkelanjutan, tetapi menyajikan variabel secara lokal, itulah yang diperlukan untuk solusi di sini. Saya telah mengadaptasi kode ini dan pertanyaan lain agar dapat memanfaatkan ini. - person ScottS; 26.11.2013
comment
Apa pun yang terjadi, meskipun ini dianggap sebagai masalah, hampir tidak mungkin untuk memperbaikinya tanpa pemfaktoran ulang kompiler besar sehingga perilaku ini hampir tidak berubah dalam waktu dekat, jadi menurut saya ini cukup aman untuk digunakan. Tentu saja jika tidak ada solusi lain yang tidak terlalu meretas. - person seven-phases-max; 26.11.2013
comment
Omong-omong. untuk berjaga-jaga, perhatikan juga bahwa Anda tidak perlu mengubah .inc() sendiri untuk menggunakan nilai penghitung baru. Lihat varian lain, dengan cara ini penerapannya bahkan dapat dimasukkan ke dalam file yang lebih sedikit dan terpisah . Saya juga menaruh beberapa komentar di sana mengenai isu-isu yang terlibat (tampaknya lebih lengkap daripada yang saya tulis di atas). - person seven-phases-max; 26.11.2013
comment
Omong-omong. trik ini mungkin tidak akan berhasil di Less 1.7.0 (ternyata ini berdasarkan pada #1291 masalah yang telah diperbaiki baru-baru ini). Atau mungkin iya, saya tidak yakin perlu tes lagi... - person seven-phases-max; 21.02.2014
comment
- pembaruan: Ini akan berfungsi sebagian. Penghitung meningkat hanya ketika diperbarui dalam lingkup global. - person seven-phases-max; 21.02.2014