Styles in component for D3.js do not show in angular 2

前端 未结 6 1836
刺人心
刺人心 2020-11-27 03:52

I am using Angular 2 and D3.js. I want to show a red rectangle.

It only works if I put styles in the style.css file. Check this plunkr

When

6条回答
  •  感情败类
    2020-11-27 04:41

    View Encapsulation

    This is because of the view encapsulation in Angular 2. By default, all the HTML and CSS is transformed so that it's only applied locally. In other words, if you add this style in your component's CSS:

    h2 { color: red; }
    

    It will only affect h2 elements inside the component, not every h2 element in your whole app. You can read more about this mechanisms in Angular documentation on View Encapsulation.

    Why does it affect you?

    Angular transforms your styles but since the C3 graph is not yet drawn, it can't transform HTML/SVG too. Because of that, component styles won't match elements inside of C3 graph.

    What should I do?

    External stylesheet

    External stylesheets are not transformed by the View Encapsulation mechanisms, so effectively they will affect your C3 chart (and any other element for that matter).

    If you're using Angular CLI, adding external stylesheet is really simple. Edit your angular-cli.json file and inside of apps property find styles array. Add another stylesheet here:

    {
        …
        "apps": [
            {
                …
                "styles": [
                    "styles.scss",
                    "c3.scss" // <---- add this or any other file
                ],
            }
        ],
        …
    }
    

    In case you're not using Angular CLI, there must be some way to add external stylesheets. Probably the simplest one is adding another inside of in your index.html file.

    ViewEncapsulation.None

    Your first option is: Create a component with the chart (and only chart) and turn off View Encapsulation inside of it. It's a good idea to do that also because of obeying the Single Responsibility Principle. Your chart, by design, should be encapsulated in a separate component. Turning of View Encapsulation is as simple as adding another property to your @Component decorator:

    @Component({
        …
        encapsulation: ViewEncapsulation.None
    })
    

    /deep/ CSS selector

    If, for some reason, you don't want to do that, there's another possibility. You can try using /deep/ selector inside of your CSS which forces styles down into all child components views. Effectively, this breaks the encapsulation and should affect your C3 chart. So, for example, you can do that in your component's CSS file:

    /deep/ .c3-chart-arc path {
        stroke: white;
    }
    

    Either way, I recommend reading the aforementioned documentation on View Encapsulation in Angular 2 in order to understand why this happens and how it works. This feature is supposed to help you write code, not cause troubles :) This article might help you understand how it works: View Encapsulation on blog.thoughtram.io

提交回复
热议问题