在Magento 2中定位/排序CSS文件的正确方法是什么?


14

Magento 2 DevDoc中,它说

要包含CSS文件,请在布局文件的<head>部分中添加<css src =“ <path> / <file>” media =“ print | <option>” />块。

但是,它没有说明如何影响CSS文件的顺序。如果我们以自定义主题的方式将CSS文件添加到具有父主题的自定义主题中,则结果是文件被添加到<head>部分的顶部,并且在其下面添加了许多其他CSS文件,这意味着它们的优先级是相当高的低,我们不能轻易地从父主题或扩展中覆盖规则。

Magento 1中存在类似的问题,并且有变通办法。有些比较干净,有些则少一些。
在Magento 2的<head>底部订购自定义主题的CSS文件的最佳方法是什么-如果可能,请遵守自定义主题的Magento 2布局准则。

Answers:


14

Magento2没有内置的机制,因此我决定将其作为编写我的第一个Magento2扩展的机会。该Quickshiftin \ Assetorderer扩展现在在GitHub上可用!

一旦安装了扩展程序,就可以在CSS XML标记中指定订单属性。

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

您还可以在布局XML文件(例如)中使用order属性default_head_blocks.xml。您未指定顺序的任何css标记都将被视为顺序为1。


非常感谢。您的扩展程序对我有用。但是在di.xml中遇到两个问题,在Quickshiftin \ Assetorderer \ View \ Asset \ File类中遇到一个问题。
Pankaj Pareek

@PankajPareek,您好,这是个好消息,也有个坏消息。您是否有机会在GitHub上进行详细说明并可能提出请求请求?使扩展对每个人都有用会很高兴!
quickshiftin

@quickshiftin此扩展在v2.0中有效,但在v2.1.1中无效。但是,我偶然发现在v2.1.1中不再需要它,因为在添加order="1"文件时,它会正确排序。只要添加额外的属性,属性是什么都没有关系。要使其生效,您可以将其更改为,data-order="1"并且仍然可以使用。
thdoan

还为js文件订购工作。
Jalpesh Patel's

@quickshiftin你更新你的模块的M2.2.2
PЯINCƏ

7

您可以将media属性添加到css元素。这会将其添加到头部所有包含的CSS的末尾。

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

如果我先要怎么办?
TheBlackBenzKid

这仍将在主要的magento 2核心CSS文件之前加载自定义CSS :(
Jonathan Marzullo

从M2.2.1开始,它是唯一对我有用的解决方案。向<css>节点添加'order =“ X”'会引发错误,因为不允许此属性。
炸药

2

在这里详细回答了有关magento如何渲染css以及如何在后台进行排序的问题。

我在这里需要提到的一些额外要点是:

  1. 如果要在style-m.css和之后呈现自定义的css文件stlyle-l.css,则需要定义如下的css文件:

    <css src="Magento_Theme:css/path/file.css" media="all" />
  2. 如果要在style-m.css和之前加载自定义css文件 stlyle-l.css,则需要在布局xml文件中包含default_head_blocks.xmlcss文件,style-m.css并在和上方添加自定义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在布局xml文件中使用或任何其他属性以及CSS定义。这样,您将获得一个异常,该异常指示架构验证失败。


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(但当然您的方法仍然比这更好)或使用LESS实现供应商前缀类。但这仍然增加了不必要的开销和复杂性。为什么在CSS的简单顺序更改中可以添加数百个或更多规则呢?因此,我仍在寻找在Magento方面解决此问题的好方法...
Jey DWork 2015年

此外,在涉及其他资源时,CSS定位可能会变得更加重要,因为变通方法可能会变得更加难看。
杰伊·德沃克(Jey DWork),2015年

6
那不是答案
Ahmad Alfy '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.