LESS có tính năng “mở rộng” không?


93

SASS có một tính năng được gọi là @extendcho phép một bộ chọn kế thừa các thuộc tính của một bộ chọn khác, nhưng không sao chép các thuộc tính (như mixin).

LESS có tính năng này không?


Để làm rõ, các tài liệu tham khảo câu hỏi khác KHÔNG hỏi điều tương tự. Câu hỏi này rất đơn giản: "LESS có tính năng mở rộng không?". Câu hỏi còn lại là hỏi một điều gì đó đòi hỏi nhiều suy nghĩ hơn về quyết định tạo kiểu.
jonschlinkert

... để thêm vào nhận xét cuối cùng của tôi, câu hỏi khác bao gồm thẻ "coding-style" hỗ trợ thêm cho quan điểm của tôi.
jonschlinkert

Câu trả lời:


156

Có, Less.js được giới thiệu extendtrong v1.4.0 .

:extend()

Thay vì triển khai @extendcú pháp at-rule ( ) được sử dụng bởi SASS và Stylus, LESS đã triển khai cú pháp lớp giả, điều này mang lại cho việc triển khai của LESS sự linh hoạt có thể áp dụng trực tiếp cho chính bộ chọn hoặc bên trong một câu lệnh. Vì vậy, cả hai điều này sẽ hoạt động:

.sidenav:extend(.nav) {...}

hoặc là

.sidenav {
    &:extend(.nav);
    ...
}

Ngoài ra, bạn cũng có thể sử dụng lệnh allnày để mở rộng các lớp "lồng nhau":

.sidenav:extend(.nav all){};

Và bạn có thể thêm danh sách các lớp được phân tách bằng dấu phẩy mà bạn muốn mở rộng:

.global-nav {
    &:extend(.navbar, .nav all, .navbar-fixed-top all, .navbar-inverse);
    height: 70px;
}

Khi mở rộng các bộ chọn lồng nhau, bạn sẽ nhận thấy sự khác biệt:

bộ chọn lồng nhau .selector1selector2:

.selector1 {
  property1: a;
   .selector2 {
    property2: b;
   }
}

Bây giờ .selector3:extend(.selector1 .selector2){};đầu ra:

.selector1 {
  property1: a;
}
.selector1 .selector2,
.selector3 {
  property2: b;
}

, .selector3:extend(.selector1 all){};kết quả đầu ra:

.selector1,
.selector3 {
  property1: a;
}
.selector1 .selector2,
.selector3 .selector2 {
  property2: b;
}

, .selector3:extend(.selector2){};kết quả đầu ra

.selector1 {
  property1: a;
}
.selector1 .selector2 {
  property2: b;
}

và cuối cùng .selector3:extend(.selector2 all){};:

.selector1 {
  property1: a;
}
.selector1 .selector2,
.selector1 .selector3 {
  property2: b;
}

15
"Cú pháp của LESS" trung thành "hơn với CSS truyền thống so với @extendcú pháp at-rule ( ) được triển khai bởi SASS và Stylus, cú pháp này thường được dành riêng để đưa ra các hướng dẫn hoặc chỉ thị cho trình phân tích cú pháp CSS trong trình duyệt." <- điều này có nghĩa là gì? Có mùi như tiếp thị nói.
cimmanon


2
@cimmanon Tôi đoán bạn nói đúng, tôi không cố ý nói như vậy. Nhưng có rất nhiều tranh cãi về cú pháp của Less, dường như bởi vì mọi người mong đợi Less sử dụng cú pháp tương tự như SASS. Nhưng trong CSS, bộ chọn pseuso được sử dụng cho các quy tắc đối sánh mẫu để xác định quy tắc kiểu nào áp dụng cho các phần tử trong cây tài liệu, trong khi quy tắc at được sử dụng cho các chỉ thị "cấp cao hơn" (như tôi đã đề cập). Vì vậy, có lẽ tôi nên chỉnh sửa câu trả lời để cung cấp chi tiết đó? Hay đó là một câu hỏi khác: "Tại sao LESS lại chọn cú pháp bộ chọn giả?"
jonschlinkert

4
bạn thực sự cần cập nhật các tài liệu hướng dẫn ít trực tuyến, tôi không thể nhìn thấy bất cứ điều gì về: extend () và nó đã có tốt để biết trước
Joshua Bambrick

2
Tài liệu, cũng như mã, được cộng đồng duy trì. Những loại gợi ý sẽ là tuyệt vời để có trên repo thực tế và yêu cầu pull luôn được chào đón ;-)
jonschlinkert

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.