Làm thế nào để bạn ghi đè LESS trong một chủ đề tùy chỉnh?


34

Tôi đã dành phần tốt hơn trong tuần này để cố gắng tìm một hướng dẫn rõ ràng về cách tạo đúng chủ đề tùy chỉnh và mở rộng LESS / CSS tồn tại mà không phải sao chép toàn bộ magento-blankchủ đề.

Tài liệu chính thức cung cấp những điều cơ bản về ghi đè các biến, nhưng điều đó có hạn sử dụng. Các hướng dẫn hiện có, như Sonassi's chẳng hạn, dường như dựa trên phiên bản beta của Magento 2.

Đến từ Magento 1, có một chút về quá trình học hỏi để tìm ra cách LESS hoạt động và cách Magento thu thập tất cả các tệp vào CSS. Phải mất một thời gian tôi mới tìm hiểu các hướng dẫn và nhận được câu trả lời rõ ràng về những tập tin cần sửa đổi và khi nào và tôi nghĩ tôi sẽ chia sẻ những gì tôi tìm thấy để người dùng trong tương lai (và tôi trong tương lai) có thể bắt đầu nhanh chóng khi sử dụng LESS trong Magento 2.

Câu trả lời:


58

Lưu ý 1: Điều này sẽ luôn cho rằng bạn đang gia hạn magento-blank.

Lưu ý 2: <theme-dir>app/design/frontend/Vendor/theme/

Khái niệm cơ bản: Thay đổi biến cơ sở

(đối với tl; dr, bỏ qua kết luận)

Hầu hết các hướng dẫn tôi tìm thấy chỉ bao gồm bước này trong chủ đề với LESS, vì vậy tôi sẽ cố gắng để ngắn gọn. Magento 2 có một bộ Biến cơ sở xác định các khía cạnh thường được sử dụng của một chủ đề. Màu sắc, phông chữ, kiểu tiêu đề trang, v.v được xác định trong các biến này.

Trong <magento-root>/lib/web/css/source/lib/variables/bạn sẽ tìm thấy một số tệp LESS được đặt tên trực quan. Trong mỗi trong số này, bạn có thể tìm thấy các giá trị được gán cho các biến cho nhiều yếu tố phổ biến trong Magento 2.

Để thay đổi bất kỳ biến nào trong số này, chỉ cần tạo một tệp trong <theme-dir>/web/css/source/_theme.less. Thí dụ:

@newPrimary: #1980fe;
@primary__color: @newPrimary;


@link__color: @newPrimary;
@link__visited__color: lighten(@link__color, 10%);

Về mặt kỹ thuật, bạn có thể đặt bất kỳ CSS hoặc LESS nào vào đây và nó sẽ áp dụng thành công cho trang web của bạn (nhưng không làm điều này). Tôi sẽ giải thích làm thế nào điều này hoạt động trong một khoảnh khắc.

Thêm tệp CSS mới

Bạn có thể thêm CSS mới vào đầu tất cả các trang mẫu của bạn.

Tạo <theme-dir>/Magento_Theme/layout/default_head_blocks.xml:

<?xml version="1.0"?>
    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <head>
            <css src="css/myStyle.css" />
        </head>
    </page>

Và sau đó, bạn tạo một tệp bằng CSS hoặc LESS mới của mình:

<theme-dir>/web/css/myStyle.less. Bạn có thể viết LESS hoặc CSS tại đây.

Ghi đè các kiểu hiện có

Tôi thấy rằng Magento 2 LESS không dễ dàng thay thế bằng cách thêm một tệp CSS mới. Và đây là nơi tôi bắt đầu bị lạc, và tôi sẽ giải thích làm thế nào Magento 2 tìm thấy các tệp LESS của nó.

Theo mặc định, Magento 2 sẽ bao gồm (và cuối cùng quay lại) các tệp này:

<Magento_Blank_theme_dir>/web/css/styles-m.less //Mobile Styles
<Magento_Blank_theme_dir>/web/css/styles-l.less //Desktop enhancements
<Magento_Blank_theme_dir>/web/css/print.less //Print Styles

Các tệp này bao gồm (nhập) các tệp LESS khác, thường bao gồm nhiều tệp LESS hơn. Và đây là nơi mà các hướng dẫn khác trở nên vô ích với tôi và tôi sẽ giải thích những gì tôi tìm thấy, tốt nhất có thể.

Ma thuật nguồn / lib

Trong styles-m.less, có dòng : @import 'source/lib/_responsive.less';. Bạn sẽ nhận thấy rằng không có source/libthư mục trong magento-blankchủ đề. Rõ ràng là phong cách Magento 2 cuối cùng đã quay trở lại <magento-root>/lib/web/css/. Nó ở đó bạn tìm thấy source/lib/_responsive.less.

Các biến bạn sử dụng _theme.lesscó sẵn do một source/libtệp được nhập trong magento-blankchủ đề. Lưu ý: _theme.less là một tệp trống trong các chủ đề mặc định. Tiếp tục đọc để tìm hiểu lý do tại sao điều này là quan trọng cần lưu ý.

"Tự động bao gồm" tập tin LESS

Một vài hướng dẫn tôi thấy đã nhấn mạnh rằng bạn có thể tạo <theme-dir>/web/css/_styles.lessvì Magento tự động tìm và bao gồm tệp đó. Tôi thấy đây là một lời khuyên tồi.

Nếu bạn tạo <theme-dir>/web/css/_styles.less, trang web của bạn sẽ bị hỏng. theme-frontend-blank/web/css/styles-m.lessnhập khẩu _styles.less, lần lượt nhập thêm 3 tệp .less, mỗi tệp nhập nhiều tệp .less hơn.

Nếu bạn tạo một _styles.less, bạn đang ghi đè nó. Bằng cách ghi đè _styles.less, bạn đang ghi đè tất cả các tệp mà nó nhập và tất cả các tệp mà các tệp đó nhập, v.v.

Lưu ý về _theme.less: Tệp này trống trong các chủ đề mặc định và do đó an toàn chỉ cần tạo và bắt đầu thêm vào nếu bạn đang dựa trên chủ đề của mình theo mặc định. Tuy nhiên, nếu bạn đang mở rộng một chủ đề đã mở rộng mặc định, cơ hội_theme.lessđã được sử dụng. Tạo ra một lần nữa sẽ ghi đè lên nó.

@Magento_import huyền diệu

Trong styles-m.lessbạn sẽ thấy một vài dòng nhận xét:

//@magento_import 'source/_module.less'; // Theme modules
//@magento_import 'source/_widgets.less'; // Theme widgets

Những dòng này không thực sự nhận xét ra! Magento 2 có xử lý đặc biệt cho các dòng bắt đầu với //@magento_import. Những dòng này chỉ có thể được bao gồm trong các tập tin tại <theme-dir>/web/css.

Các dòng trên hướng dẫn Magento 2 bao gồm bất kỳ tệp nào trong chủ đề theo mẫu đã cho. Vì vậy, các dòng trên sẽ tự động bao gồm:

'<theme-dir>/Magento_Catalog/web/css/source/_widgets.less';
'<theme-dir>/Magento_Catalog/web/css/source/_module.less';

'<theme-dir>/Magento_Cms/web/css/source/_widgets.less';
'<theme-dir>/Magento_Cms/web/css/source/_module.less';

'<theme-dir>/Magento_Reports/web/css/source/_widgets.less';
'<theme-dir>/Magento_Reports/web/css/source/_module.less';
...and so on

Thêm các tập tin tên _widgets.less_module.less sẽ được tự động phát hiện và bao gồm, ngay cả khi một module mới hoặc một module mà chưa có tập tin đó.

Xin lưu ý rằng Magento-Blank bao gồm các tệp đó cho hầu hết các Mô-đun và nếu bạn muốn sử dụng phương pháp này, bạn sẽ cần sao chép-dán bản gốc (trừ khi bạn đang viết lại hoàn toàn).

Phần kết luận

(Đọc: không sử dụng _styles.less).

Khi bạn đang tìm cách thay đổi CSS của một phần tử, bạn muốn làm tốt nhất có thể để tìm tệp nào được định nghĩa theo kiểu. Đôi khi, tất cả những gì bạn cần làm là thay đổi một biến _theme.less. Hầu hết các lần, tôi nghi ngờ, bạn chỉ cần sao chép-dán _module.lesshoặc _widgets.lessvào chủ đề của bạn và thực hiện các thay đổi.

Nếu bạn đã tạo một mô-đun mới hoặc có các thành phần HTML mới, bạn có thể cần tạo tệp LESS và bao gồm nó một cách riêng biệt trong <head>mỗi trang.

Trong trường hợp phức tạp, bạn có thể cần phải tạo mới @importhoặc @magento_import. Bạn muốn tìm đứa trẻ thấp nhất có ý nghĩa cho những gì bạn đang làm, vì vậy bạn không sao chép một loạt các tệp không cần thiết hoặc thêm @importcác dòng khó hiểu dường như không dẫn đến đâu.


1
Hoàn thành tốt, tôi cũng đồng ý rằng nên bao gồm một tệp CSS riêng trong đầu khi xây dựng các phần tử của riêng bạn (miễn là chúng không được tải trên tất cả các trang). Tôi không phải là người hâm mộ các chủ đề Magento thêm tất cả các kiểu vào mỗi trang.
Ben Crook

1
Giống như câu trả lời chi tiết. Chỉ cần một lời cảnh báo rằng nếu bạn sử dụng các hướng dẫn // @magento_import thì không thể sử dụng trình biên dịch ít bên thứ ba như được bao gồm trong gulp, điều mà nhiều người trong chúng ta đang làm để tăng tốc độ.
Robert Egginton

Giải thích tuyệt vời! Triệu cảm ơn vì điều đó. Tôi đang dùng Magento 2.1.0 và tôi phải xóa var/view_preprocessed/css/frontend/VENDOR/THEME/loca_LE/css/*để css được tạo lại
Alexandru Bangală

Chào! Tôi thử thêm mã mới của mình vào lớp mới này cho _extends.less cho ứng dụng / thiết kế / frontend / Vendor / theme / css / source. Nhưng điều này không hoạt động. Vui lòng giúp đỡ magento.stackexchange.com/questions/151940/ trộm
Sylon

6
Xin vui lòng gặp gỡ_extend.less
Stevie G
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.