เพิ่มตัวแปรใน CSS น้อยลง

ฉันจะเพิ่มตัวแปรใน LESS css ได้อย่างไร

นี่คือตัวอย่าง..

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

ข้อมูลโค้ดด้านบนจะทำให้เกิด "ข้อผิดพลาดทางไวยากรณ์"

SyntaxError: Recursive variable definition for @counter

มีวิธีแก้ไขข้อผิดพลาดนี้หรือไม่? ตัวอย่างเช่นมีสัญลักษณ์เช่น @counter++ หรือไม่

ขอบคุณ..


person Yacoub Oweis    schedule 25.11.2013    source แหล่งที่มา
comment
นี่ไม่ใช่แค่การย่อขนาดซ้ำของ stackoverflow.com/questions/20199298 ไม่ใช่หรือ   -  person seven-phases-max    schedule 25.11.2013
comment
@ เจ็ดเฟส-สูงสุด: อาจจะ (คล้ายกันอย่างน่าสงสัยทั้งในคำถามและเวลา)   -  person ScottS    schedule 25.11.2013


คำตอบ (1)


เป็นไปไม่ได้อย่างเคร่งครัด

ดูเอกสารประกอบเกี่ยวกับตัวแปร LESS โดยพื้นฐานแล้ว ตัวแปร LESS จะเป็นค่าคงที่ในขอบเขตของการสร้างตัวแปรเหล่านั้น พวกมันขี้เกียจโหลดและไม่สามารถ "เปลี่ยนแปลง" ในลักษณะนั้นได้ คำจำกัดความสุดท้ายจะเป็นคำจำกัดความที่ใช้สำหรับทุกคนในขอบเขตนั้น ในกรณีของคุณข้อผิดพลาดจะเกิดขึ้น เนื่องจากตัวแปรไม่สามารถอ้างอิงตัวเองได้

ลองพิจารณาตัวอย่างนี้:

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

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

ผลลัพธ์จะเป็น 2 สำหรับทั้งคู่:

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

เนื่องจาก LESS กำหนด @counter ด้วยคำจำกัดความสุดท้ายของตัวแปรในขอบเขตนั้น มันไม่ได้ใส่ใจกับลำดับของการเรียกที่ใช้ @counter แต่ทำหน้าที่เหมือน CSS มากและคำนึงถึง "การเรียงซ้อน" ของตัวแปรด้วย

สำหรับการสนทนาเพิ่มเติมเกี่ยวกับเรื่องนี้ใน LESS คุณอาจติดตามการสนทนาที่เกิดขึ้นใน คำขอคุณลักษณะ LESS นี้< /ก>.

โซลูชันอยู่ในตัวตั้งค่าการโทรแบบเรียกซ้ำสำหรับตัวแปรท้องถิ่น

Seven-phases-max เชื่อมโยงกับสิ่งที่เขาเชื่อว่าเป็นข้อบกพร่องใน LESS แต่ฉันไม่คิดว่ามันจะเป็น แต่ดูเหมือนว่าฉันจะใช้การรีเซ็ตตัวนับแบบเรียกซ้ำอย่างสร้างสรรค์เพื่อให้ได้ผลลัพธ์ตามที่ต้องการ สิ่งนี้ช่วยให้คุณบรรลุสิ่งที่คุณต้องการได้ (ใช้โค้ดตัวอย่างของฉัน):

// 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");

นี่คือเอาต์พุต CSS:

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

หมายเหตุ: ฉันเชื่อว่าคุณไม่ได้เปลี่ยนแปลงค่าส่วนกลางที่นี่อย่างเคร่งครัด แต่เป็นการตั้งค่าท้องถิ่นใหม่ด้วยการเรียกแต่ละครั้งเป็น .someSelector ไม่ว่าจะเกิดจากพฤติกรรมแบบรถบั๊กกี้หรือไม่นั้นยังเป็นที่น่าสงสัย แต่ถ้าเป็นเช่นนั้น วิธีแก้ไขปัญหานี้อาจหายไปในอนาคต หากต้องการความคิดเห็นเพิ่มเติมเกี่ยวกับข้อจำกัดของวิธีนี้ ดูการสนทนาที่นี่

person ScottS    schedule 25.11.2013
comment
ยังไงก็ตาม ฉันเพิ่งจำได้ว่ามีข้อบกพร่อง/ปัญหาน้อยที่สามารถนำมาใช้ในทางที่ผิดเพื่อเลียนแบบตัวนับและการกำหนดตัวแปรใหม่ ดูส่วนสำคัญนี้ แต่นี่ไม่ใช่แค่การแฮ็กที่น่าสงสัยเท่านั้น ฉันหวังว่าปัญหาจะได้รับการแก้ไขในที่สุด - person seven-phases-max; 25.11.2013
comment
@seven-phases-max: ฉันไม่เห็นด้วยว่ามันเป็นข้อบกพร่องในส่วนสำคัญของคุณ. มีการกำหนดขอบเขตมิกซ์ในระดับโลกรายการเดียวใน .inc() ซึ่งตั้งค่าตัวแปรโลคัลเป็น @counter ซ้ำ ๆ ในการเรียกแต่ละครั้ง (จริงๆ แล้วไม่ได้เปลี่ยนตัวแปรตัวนับโกลบอล) โดยพื้นฐานแล้ว มันคือการติดตามการนับอย่างต่อเนื่อง แต่ให้บริการตัวแปรภายในเครื่อง ซึ่งเป็นสิ่งที่จำเป็นสำหรับการแก้ปัญหาที่นี่ ฉันได้ดัดแปลงทั้งโค้ดนี้และคำถามอื่นเพื่อใช้งานสิ่งนี้ - person ScottS; 26.11.2013
comment
ไม่ว่าจะด้วยวิธีใด แม้ว่าสิ่งนี้จะถือว่าเป็นปัญหา ก็แทบจะเป็นไปไม่ได้เลยที่จะแก้ไขหากไม่มีการปรับโครงสร้างคอมไพเลอร์หลักใหม่ ดังนั้นพฤติกรรมนี้แทบจะไม่เปลี่ยนแปลงในเร็วๆ นี้ ดังนั้นฉันคิดว่ามันค่อนข้างปลอดภัยที่จะใช้ หากไม่มีวิธีแก้ไขปัญหาแฮ็กน้อยกว่านี้แน่นอน - person seven-phases-max; 26.11.2013
comment
ยังไงก็ตาม ในกรณีที่สังเกตว่าคุณไม่จำเป็นต้องเปลี่ยน .inc() เองเพื่อใช้ค่าตัวนับใหม่ ดูรูปแบบอื่น วิธีนี้ทำให้สามารถแยกการใช้งานออกเป็นไฟล์น้อยลง . ฉันยังได้แสดงความคิดเห็นเกี่ยวกับประเด็นที่เกี่ยวข้องด้วย (ดูเหมือนว่าจะสมบูรณ์มากกว่าที่ฉันเขียนไว้ข้างต้น) - person seven-phases-max; 26.11.2013
comment
ยังไงก็ตาม เคล็ดลับนี้อาจจะไม่ทำงานใน Less 1.7.0 (ปรากฎว่าสิ่งนี้เป็นไปตาม #1291 ปัญหาซึ่งได้รับการแก้ไขเมื่อเร็วๆ นี้) หรืออาจจะเป็นเช่นนั้น ฉันไม่แน่ใจว่าต้องมีการทดสอบเพิ่มเติม... - person seven-phases-max; 21.02.2014
comment
- อัปเดต: มันจะทำงานได้บางส่วน ตัวนับจะเพิ่มขึ้นเมื่อมีการอัพเดตภายในขอบเขตส่วนกลางเท่านั้น - person seven-phases-max; 21.02.2014