【问题标题】:Overwrite css class property for library component in Angular-5在 Angular-5 中覆盖库组件的 css 类属性
【发布时间】:2018-05-23 14:11:12
【问题描述】:

我的代码中有一个来自第三方库的 angular-5 下拉组件,该组件有自己的 CSS,由于它的默认行为,我无法更改它的 CSS(这里我试图减小下拉列表的宽度) ,我也尝试使用编写另一个 css 类和内联样式,但它不会改变宽度。

HTML 代码,我在其中控制了我的代码:(第 3 方下拉组件)

    <test-dropdown id="dropdown" label="Options Array"
              [selectedOption]="dropdownOptions[0]">
           <test-option *ngFor="let option of dropdownOptions"
              [option]="option" [disabled]="option.disabled">{{option.label}}  
           </test-option>
    </test-dropdown>

上面的下拉组件,在浏览器中运行应用程序后的样子,

    <test-dropdown _ngcontent-c4="" id="dropdown" label="default" ng-reflect-label="default">
  <div class="test-dropdown" ng-reflect-ng-class="[object Object]">
    <label>DropDown</label>
    <div>
      <button class="select">Select...</button>
      <div class="dropdown">
        <!--bindings={
  "ng-reflect-ng-for-of": "[object Object],[object Object"
  }-->
        <test-option _ngcontent-c4="" class="dropdown-btn-vp option ng-star-inserted" style="min-width: 120px"
                     ng-reflect-option="[object Object]">
          <button class="option">
            Option One
          </button>
        </test-option>
        <test-option _ngcontent-c4="" class="dropdown-btn-vp option ng-star-inserted" style="min-width: 120px"
                     ng-reflect-option="[object Object]">
          <button class="option">
            Option Two
          </button>
        </test-option>
        <!--bindings={}-->
      </div>
    </div>
  </div>
</test-dropdown>

简而言之,我想在类 test-dropdown->button.selecttest-dropdown->div.dropdown

上应用 css 样式

【问题讨论】:

    标签: angular css bootstrap-4 angular-ui-bootstrap angular5


    【解决方案1】:

    我使用::ng-deep pseudo-class selector,参考此文档https://blog.angular-university.io/angular-host-context 进行角度视图封装。

    下面的代码 sn-p 适用于我使用 ng-deep 覆盖 css 属性。 例如,在我的情况下,&lt;test-dropdown&gt; 是一个角度组件,它采用默认的 css 类 .dropdown,现在我想修改 min-width 属性,所以我使用 ng-deep 伪类选择器进行了修改,其他角度组件也一样.

    test-dropdown::ng-deep .dropdown {
      min-width: 20%;
    }
    
    test-button::ng-deep .test-button {
      padding: 6px 12px;
      font-size: 14px;
      line-height: 1.42857143;
      text-align: center;
      cursor: pointer;
      min-width: 20%;
    }
    
    test-date-picker::ng-deep .date {
      min-width: 100%;
      line-height: 1.42857143;
    }
    
    test-date-picker::ng-deep .date-picker {
      min-width: 100%;
      line-height: 1.42857143;
    }
    

    【讨论】:

    • Another question on SOF 解释了ng-deep 将如何被弃用。所以即使这个解决方案有效,我还是建议不要使用它。
    【解决方案2】:

    这个问题依赖于 CSS specificity :CSS 规则有一个顺序,如果你想应用你的样式,那么你应该使用正确的 CSS 规则。

    您还必须将此与Angular's view encapsulation 结合使用,以确保确实应用了您的样式。

    为此,有几种解决方案:

    1. 使用在组件的 CSS 文件中为下拉菜单提供的 ID
    2. 在浏览器中检查您的组件,并使用选择器将其定位到您的全局 CSS 文件中
    3. 使用 ngStyle 指令,或仅用于一个属性,[style.property]="'value'"

    编辑

    在您的情况下,您应该将您的样式添加到您的全局 CSS 文件 style.css(或它具有的任何扩展名)中。您的选择器将是:

    test-dropdown#dropdown div.test-dropdown div button.select {}
    

    【讨论】:

    • 感谢帮助,我在 Angular 视图封装中使用了 ::ng-deep pseudo-class selector
    • 附带说明,ng-deep 已被弃用,您应该避免使用它
    【解决方案3】:

    默认表单值很可能取自您网站的 CSS,而不太可能取自第 3 方库的样式。

    您能展示一下网站和您的 CSS 类代码吗?在 Chrome 的开发者模式中跟踪问题会更容易,并查看它从哪里获取样式。

    【讨论】:

    • 由于权限无法共享网站,css类代码被编译和缩小,角度组件位于node_modules文件夹中。我在这里唯一的控制是,有问题的第一个代码 sn-p 和自定义 css 类文件。一旦我为这个库安装了 npm 包,所有这些都出现了。
    • 如果没有看到代码,我只能建议您使用以下标签正确定义 CSS 样式:#option 和 #dropdown。然而,我怀疑你的风格被你的主题所推翻。使用 Chrome 的开发者模式 [F12] 检查页面,并尝试查看将哪种样式应用于按钮和下拉菜单。然后追逐这种风格在主题中的位置,然后改变它或否决它(使用上面答案中提到的 CSS 规则)。祝你好运。
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2021-11-27
    • 1970-01-01
    • 2022-01-14
    • 2020-05-11
    • 2018-02-27
    相关资源
    最近更新 更多