2013-03-07 21 views
6

Bắt hiểu thấu với LESS ở đây nhưng một điều vẫn còn chưa rõ ràng.LESS CSS - Thay đổi giá trị biến cho màu chủ đề tùy thuộc vào loại cơ thể

Cho phép nói rằng tôi có nhiều chủ đề màu cho trang web của mình, được kiểm soát bởi một lớp trên thẻ nội dung. Từ đây tôi có thể xác định lại các màu sắc khác nhau cho từng phần tử trong mỗi chủ đề. Đủ dễ dàng nhưng khá tốn thời gian nếu tôi có nhiều yếu tố để thay đổi ... và rất nhiều chủ đề. Mỗi khi tôi thêm một chủ đề mới, tôi cần phải viết lại tất cả các bộ chọn, với các giá trị màu khác nhau.

Tôi dựa làm việc cho đến nay trên một bài tôi thấy tôi: LESS.css variable depending on class

... Tuy nhiên nó vẫn có vẻ quá phức tạp cho những gì tôi muốn làm ở chỗ tôi vẫn phải viết ra tất cả các selectors và bao gồm mixin trước khi thả vào cùng một CSS với biến màu.

tôi đã tạo ra một CODEPEN HERE

Tôi đánh giá cao nó nếu có ai có thời gian để có một cái nhìn ít và tư vấn cho tôi làm thế nào tôi có thể tiếp cận này khác nhau hoặc làm thế nào tôi có thể sắp xếp quá trình này.

Rất cám ơn cho bất cứ ai giúp ra :)

+1

Có lý do bạn muốn "chủ đề" của bạn cho tất cả được trong cùng một tập tin CSS? Nó có vẻ như nó sẽ là một địa ngục đơn giản hơn rất nhiều để chỉ sử dụng các tấm phong cách thay thế với một chủ đề cho mỗi tập tin. – cimmanon

+0

Xin chào cimmanon. Nếu tôi chỉ sử dụng CSS tôi sẽ đi xuống tuyến đường đó. Tôi chỉ nghĩ rằng có thể có một cách dễ dàng để thay đổi giá trị biến thực tế sau khi nó được khai báo, có nghĩa là tôi chỉ thực sự cần một vài dòng ít hơn để nói những màu biến mới nằm trong ".theme- 2 "và mọi thứ sau đó sẽ thay đổi màu sắc kết hợp với các giá trị biến mới này. Cảm ơn lời đề nghị của bạn mặc dù. – user1814828

+0

Tôi hiểu những gì bạn muốn, nhưng bạn chưa trả lời câu hỏi của tôi. Tạo 1 chủ đề cho mỗi tệp sẽ là cách đơn giản nhất để tìm hiểu và cho phép người dùng tránh tải xuống kiểu họ không cần vì họ sẽ không bao giờ sử dụng bất kỳ thứ gì khác ngoài chủ đề đã chọn (hoặc mặc định) của họ. Nếu mỗi trang có chủ đề riêng của nó (ví dụ: các chủ đề không thể định cấu hình được), thì việc chuyển sang các trang tính riêng lẻ không có ý nghĩa gì nhiều. – cimmanon

Trả lời

14

Giả sử bạn ở lại với mong muốn chủ đề đó trong vòng một style sheet (và không nhiều sheet như cimmanon lưu ý trong các ý kiến), và giả sử bạn đang sử dụng LESS 1.3. 2+, sau đó mã sau hoạt động để giảm số lượng trùng lặp bằng cách thiết lập vòng lặp thông qua các lớp cần thay đổi chủ đề. Lưu ý rằng điều này không hoạt động trên Codepen (nó đang ném một lỗi uncaught throw #, có lẽ vì chúng đang chạy phiên bản cũ hơn của LESS), nhưng bạn có thể thấy nó biên dịch chính xác bằng cách đặt mã vào LESS's compiler.

ÍT (dựa ra mã Codepen của bạn với chủ đề gia tăng đối với bản demo)

////////////////////////////////////////////////////// 
// CONSTANTS 

@lightColour: #fff; 
@darkColour: #000; 
@lightBg: #fff; 
@darkBg: #000; 
@numberOfThemes: 3; //controls theme loop 

////////////////////////////////////////////////////// 
// MIXINS 

//Theme Definitions by parametric mixin numbers (1), (2), etc. 
.themeDefs(1) { 
    @lightColour: #f00; 
    @darkColour: #fff; 
    @lightBg: #f00; 
    @darkBg: #fff; 
} 

.themeDefs(2) { 
    //inverse of 1 
    @lightColour: #fff; 
    @darkColour: #f00; 
    @lightBg: #fff; 
    @darkBg: #f00; 
} 

.themeDefs(3) { 
    @lightColour: #cfc; 
    @darkColour: #363; 
    @lightBg: #cfc; 
    @darkBg: #363; 
} 


.curvy { 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px; 
    border-radius: 5px; 
} 

////////////////////////////////////////////////////// 
// GENERAL STYLING 

* {padding: 0;margin: 0;} 
html {text-align: center;} 
h2 {padding: 20px 0;} 

.box { 
    .curvy; 
    color: @lightColour; 
    background: @darkBg; 
    display:inline-block; width:10%; padding:20px 5%; margin:0 1% 20px 1%; 
} 

////////////////////////////////////////////////////// 
// THEME BUILDING 

.buildThemes(@index) when (@index < @numberOfThemes + 1) { 

    [email protected]{index} { 
     .themeDefs(@index); 
     color: @lightColour; 
     background: @darkBg; 

     .box { 
     color: @darkColour; 
     background: @lightBg; 
     } 
    } 
    .buildThemes(@index + 1); 
} 
//stop loop 
.buildThemes(@index) {} 
//start theme building loop 
.buildThemes(1); 

CSS Output (chỉ hiển thị các chủ đề css lặp cho ngắn gọn)

.theme-1 { 
    color: #ff0000; 
    background: #ffffff; 
} 
.theme-1 .box { 
    color: #ffffff; 
    background: #ff0000; 
} 
.theme-2 { 
    color: #ffffff; 
    background: #ff0000; 
} 
.theme-2 .box { 
    color: #ff0000; 
    background: #ffffff; 
} 
.theme-3 { 
    color: #ccffcc; 
    background: #336633; 
} 
.theme-3 .box { 
    color: #336633; 
    background: #ccffcc; 
} 
+0

Cảm ơn rất nhiều vì ScottS này. Tôi sẽ thử với phiên bản LESS đúng. Đoạn mã này sẽ rất tiện dụng cho tôi trong tương lai, đặc biệt là đối với các vùng nhỏ hơn của CSS. Tôi nghĩ rằng nó sẽ là một trường hợp lấy cả ý kiến ​​của bạn và cimmanon trên tàu trong tương lai và quyết định giải pháp tốt nhất cho nhiệm vụ nhất định. Cảm ơn cả hai câu trả lời của bạn. – user1814828

+0

Phiên bản ít hơn của tôi là 2.2.0 nhưng nó không hoạt động. Tôi gặp lỗi trên: .buildThemes (@index) khi (@index <@numberOfThemes + 1) –

+0

Viết tốt là: .buildThemes (@index) khi (@index <(@numberOfThemes + 1)) –

Các vấn đề liên quan