Sử dụng đường dẫn tài sản Rails 3.1 để sử dụng có điều kiện css nhất định


166

Tôi đang trong quá trình xây dựng ứng dụng Rails solo đầu tiên của mình bằng Rails 3.1.rc5. Vấn đề của tôi là tôi muốn trang web của mình hiển thị các tệp CSS khác nhau một cách có điều kiện. Tôi đang sử dụng Blueprint CSS và tôi đang cố gắng để sprockets / rails hiển thị screen.csshầu hết thời gian, print.csschỉ khi in và ie.csschỉ khi trang web được truy cập từ Internet Explorer.

Thật không may, *= require_treelệnh mặc định trong application.csstệp kê khai bao gồm mọi thứ trong assets/stylesheetsthư mục và dẫn đến một mớ lộn xộn CSS khó chịu. Cách giải quyết hiện tại của tôi là một loại phương pháp vũ phu trong đó tôi chỉ định mọi thứ riêng lẻ:

Trong application.css:

*= require_self
*= require home.css
...
*= require blueprint/screen.css

Trong bảng định kiểu của tôi một phần (haml):

<!--[if lt IE 9]
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
![endif]-->
= stylesheet_link_tag "application"
= stylesheet_link_tag 'blueprint/print', media: 'print'
<!--[if lt IE8]]
= stylesheet_link_tag 'blueprint/ie'
![endif]-->
= javascript_include_tag "application"

Điều này hoạt động nhưng nó không đặc biệt đẹp. Tôi đã thực hiện một vài giờ tìm kiếm để thậm chí đi xa đến mức này nhưng tôi hy vọng rằng có một cách dễ dàng hơn để làm điều đó mà tôi vừa bỏ lỡ. Nếu tôi thậm chí có thể chọn lọc kết xuất một số thư mục nhất định (không bao gồm các thư mục con), nó sẽ làm cho toàn bộ quá trình trở nên cứng nhắc hơn rất nhiều.

Cảm ơn!

Câu trả lời:


223

Tôi đã phát hiện ra một cách để làm cho nó bớt cứng nhắc và bằng chứng trong tương lai bằng cách vẫn sử dụng đường dẫn tài sản nhưng có các bảng định kiểu được nhóm lại. Nó không đơn giản hơn giải pháp của bạn, nhưng giải pháp này cho phép bạn tự động thêm các bảng định kiểu mới mà không phải chỉnh sửa lại toàn bộ cấu trúc.

Những gì bạn muốn làm là sử dụng các tệp kê khai riêng biệt để phá vỡ mọi thứ. Trước tiên, bạn phải sắp xếp lại app/assets/stylesheetsthư mục của bạn :

app/assets/stylesheets
+-- all
    +-- your_base_stylesheet.css
+-- print
    +-- blueprint
        +-- print.css
    +-- your_print_stylesheet.css
+-- ie
    +-- blueprint
        + ie.css
    +-- your_ie_hacks.css
+-- application-all.css
+-- application-print.css
+-- application-ie.css

Sau đó, bạn chỉnh sửa ba tệp kê khai:

/**
 * application-all.css
 *
 *= require_self
 *= require_tree ./all
 */

/**
 * application-print.css
 *
 *= require_self
 *= require_tree ./print
 */

/**
 * application-ie.css
 *
 *= require_self
 *= require_tree ./ie
 */

Tiếp theo bạn cập nhật tệp bố cục ứng dụng của mình:

<%= stylesheet_link_tag "application-all", :media => "all" %>
<%= stylesheet_link_tag "application-print", :media => "print" %>

<!--[if lte IE 8]>
    <%= stylesheet_link_tag "application-ie", :media => "all" %>
<![endif]-->

Cuối cùng, đừng quên đưa các tệp kê khai mới này vào cấu hình / môi trường / sản xuất.rb:

config.assets.precompile += %w( application-all.css application-print.css application-ie.css )

Cập nhật:

Như Max đã chỉ ra, nếu bạn theo cấu trúc này, bạn phải chú ý đến các tham chiếu hình ảnh. Bạn có một vài lựa chọn:

  1. Di chuyển hình ảnh theo cùng một mẫu
    • Lưu ý rằng điều này chỉ hoạt động nếu hình ảnh không được chia sẻ
    • Tôi hy vọng đây sẽ không phải là khởi đầu cho hầu hết vì nó làm phức tạp mọi thứ quá nhiều
  2. Đủ điều kiện đường dẫn hình ảnh:
    • background: url('/assets/image.png');
  3. Sử dụng trình trợ giúp SASS:
    • background: image-url('image.png');

1
Mặc dù đây là một tổ chức tốt đẹp của các tệp, tôi tin rằng nó vẫn giải quyết được vấn đề thiết yếu giống như cách mà câu hỏi tự làm.
semperos

@semperos, bạn chính xác rằng hình dạng của giải pháp về cơ bản là giống nhau nhưng đề xuất của tôi vẫn cho phép chúng tôi sử dụng đường dẫn tài sản cho toàn bộ biểu định kiểu. Tôi không chắc chắn nếu có một cách khác để chọn lọc bao gồm một phần của các kiểu trừ khi nó nằm trên một biểu định kiểu riêng biệt. Ít nhất theo cách này, chúng tôi biên dịch thành một số ít các tệp CSS.
gcastro

5
Một cái gì đó như thế này trong hướng dẫn Rails Asset Pipeline thực sự sẽ tốt. cảm ơn
Bashar Abdullah

3
Mặc dù có một .csshình ảnh xác thực : nếu bạn làm theo cấu trúc này và sử dụng các tệp đơn giản thì tất cả hình ảnh của bạn sẽ bị hỏng. Eg background: url('image.png')sẽ được dịch sang đường dẫn /assets/all/image.png(nhớ tất cả trong đường dẫn). Thay vào đó, nó hoạt động : background: url('/assets/image.png). Nếu có một giải pháp dễ dàng hơn cho điều này xin vui lòng gửi nó. Khác với việc sử dụng SASS có các phương thức trợ giúp có thể giải quyết đường dẫn chính xác.
Tối đa

1
@ExiRe, vâng. Bất kỳ biểu định kiểu hoặc tệp / tệp kê khai nào không tuân theo mẫu chuẩn cần được thêm vào mảng tiền biên dịch (xem: guide.rubyonrails.org/asset_pipeline.html#precompiling-assets )
gcastro

10

Đã đến vấn đề này ngày hôm nay.

Cuối cùng, việc đặt tất cả các bảng định kiểu cụ thể của IE vào lib / nội dung / biểu định kiểu và tạo một tệp kê khai cho mỗi phiên bản IE. Sau đó, trong application.rb thêm chúng vào danh sách những thứ cần biên dịch trước:

config.assets.precompile += ["ie9.css", "ie7.css", "ie8.css", "ie.css"]

Và trong bố cục của bạn, có điều kiện bao gồm các tệp kê khai đó và bạn tốt để đi!


2

Đó là một cách khá gọn gàng để làm điều đó. Tôi sử dụng các lớp có điều kiện trên html hoặc Modernizr. Xem bài viết này cho một đại diện tốt về những gì làm những gì. Modernizr-vs-cond condition-class-on-html

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.