Який правильний спосіб розміщення / впорядкування CSS-файлів у Magento 2?


14

У Magento 2 DevDoc сказано

Щоб включити файл CSS, додайте в файл розмітки файл <css src = "<шлях> / <файл>" медіа = "друк | <опція>" />.

Однак це не говорить про те, як ми можемо впливати на порядок файлів CSS. І якщо ми додаємо файли CSS таким чином у користувальницьку тему, яка має батьківську тему, результат полягає в тому, що файли додаються досить у верхній частині розділу <head> з великою кількістю інших файлів CSS під ними, тобто їх пріоритет досить низький, і ми не можемо легко замінити правила з батьківської теми чи розширень.

У Magento 1 були подібні проблеми, і були вирішені проблеми. Деякі були більш чистими, інші меншими.
Який найкращий спосіб замовити CSS-файл спеціальної теми внизу <head> в Magento 2 - якщо можливо, дотримуючись інструкцій щодо макета Magento 2 для користувацьких тем?

Відповіді:


14

Magento2 не має вбудованого механізму для цього, тому я вирішив розглядати це як можливість написати своє перше розширення Magento2. Розширення Quickshiftin \ Assetorderer тепер доступне на GitHub!

Після встановлення розширення ви можете вказати атрибут замовлення у своїх тегах css XML.

<head>
  <css src="css/page/home.css" order="100"/>
</head>

Ви також можете використовувати атрибут замовлення в макеті XML-файлів, таких як default_head_blocks.xml. Будь-які теги css, для яких не вказано замовлення , трактуються так, ніби вони мають порядок 1.


Велике дякую. Ваше розширення працювало на мене. Але зіткнулися з двома проблемами: один у di.xml та один у Quickshiftin \ Assetorderer \ View \ Asset \ File class.
Панкай Парік

Привіт @PankajPareek, це хороші новини і погані. Будь-який шанс ви можете розробити на GitHub і, можливо, надіслати запит на тягнення? Було б непогано зробити розширення корисним для всіх!
швидкий потік

@quickshiftin Це розширення працювало в v2.0, але не v2.1.1. Однак я випадково виявив, що він більше не потрібен у v2.1.1, оскільки коли я додаю order="1"файл, впорядковується правильно. Не має значення, який атрибут, якщо ви додаєте додатковий атрибут. Щоб зробити його перевіреним, ви можете змінити його, data-order="1"і він все ще працюватиме.
thoan

замовити роботу і для js-файлу.
Jalpesh Patel

@quickshiftin Ви оновили свій модуль для M2.2.2
PЯINCƏ

7

Ви можете додати mediaатрибут до елемента css. Це додасть це до кінця всіх включених CSS в голові.

<head>
    <css src="css/styles.css" media="all" />
</head>

Що робити, якщо я хочу цього спочатку?
TheBlackBenzKid

Це все ще завантажить користувальницький CSS перед основними файлами CSS magento 2 :(
Джонатан Марзулло

Станом на M2.2.1 це єдине рішення, яке працювало для мене. Додавання 'order = "X"' до вузла <css> припускає помилку, оскільки цей атрибут заборонений.
Диноміт

2

Тут я детально відповів про те, як магенто видає css та як відбувається замовлення поза сценою.

Деякі додаткові моменти, які мені тут потрібно зазначити:

  1. Якщо ви хочете надати свій спеціальний файл css після style-m.cssі stlyle-l.css, вам потрібно визначити свій файл css, як показано нижче:

    <css src="Magento_Theme:css/path/file.css" media="all" />
  2. Якщо ви хочете завантажити свій власний файл css до style-m.cssі stlyle-l.css, тоді вам потрібно включити ваш файл css через файл xml-макета default_head_blocks.xmlта додати свій власний файл css вище style-m.cssта stlyle-l.css.

  3. Властивості CSS є кінцевими та добре визначені у схемі компонування. Відповідно до схеми компонування, ви можете використовувати наступні властивості у вашому файлі css.

    Файл: vendor/magento/framework/View/Layout/etc/head.xsd

    <xs:complexType name="linkType">
        <xs:attribute name="src" type="xs:string" use="required"/>
        <xs:attribute name="defer" type="xs:string"/>
        <xs:attribute name="ie_condition" type="xs:string"/>
        <xs:attribute name="charset" type="xs:string"/>
        <xs:attribute name="hreflang" type="xs:string"/>
        <xs:attribute name="media" type="xs:string"/>
        <xs:attribute name="rel" type="xs:string"/>
        <xs:attribute name="rev" type="xs:string"/>
        <xs:attribute name="sizes" type="xs:string"/>
        <xs:attribute name="target" type="xs:string"/>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="src_type" type="xs:string"/>
    </xs:complexType>
    

    Це просто означає, що ви не можете використовувати orderабо будь-які інші властивості поряд із визначенням css у своєму файлі xml-файлу. Тим самим ви отримаєте виняток, який вказує на помилку перевірки схеми.


1

Ви можете зробити свої правила CSS більш-менш важливими, ніж основні правила CSS, додавши або видаливши додаткові батьківські селектори.
Наприклад, давайте подивимося в ядрі зразкове правило CSS:

.cart.table-wrapper .item .col.item {
    padding: 20px 8px 20px 0;
}

Ви можете зробити своє власне правило важливішим, додавши, наприклад, батьківський селектор:

body .cart.table-wrapper .item .col.item {
    padding: 10px 8px 20px 0;
}

або

body .cart.table-wrapper .item td.col.item {
    padding: 10px 8px 20px 0;
}

Ви можете зробити своє власне правило менш важливим, видаливши батьківський селектор, наприклад:

.item td.col.item {
    padding: 30px 8px 20px 0;
}

3
Звичайно, і я також міг би просто примхнути !important(але, звичайно, ваш підхід все-таки кращий за це) або застосувати клас префіксу постачальника з МЕНШЕ. Однак це додає зайвих витрат і складності. Чому префіксація сотень і більше правил, коли проста зміна порядку CSS це зробить? Тож я все ще шукаю хорошого способу вирішити це з боку Magento ...
Jey DWork

Крім того, якщо мова йде про інші ресурси, ніж CSS, позиціонування може набути ще більшого значення, оскільки обхідні шляхи можуть бути ще більш неприємними.
Jey DWork

6
Це не відповідь
Ахмад Альфі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.