【问题标题】:CSS codes does not work in component CSS but works in style.css in AngularCSS 代码在组件 CSS 中不起作用,但在 Angular 中的 style.css 中起作用
【发布时间】:2020-02-20 19:07:35
【问题描述】:

我有一个使用角度嵌套复选框的文件。我创建了一个组件并将以下代码放入 ngOnInit() 正文中

    const mainUl = document.getElementById('siteDetail');
    mainUl.classList.add('ulClassStyle');
    const names = ['Laptops', 'TVs', 'Microphones'];
    const secondLi = document.createElement('li');
    secondLi.classList.add('liClassStyle');
    const secondSpan = document.createElement('span');
    secondSpan.classList.add('caret');
    const secondMaincheckbox = document.createElement('input');
    secondMaincheckbox.type = 'checkbox';
    secondMaincheckbox.id = 'secondOption';
    secondMaincheckbox.checked = true;
    const secondMainlbl = document.createElement('label');
    secondMainlbl.id = 'label';
    secondMainlbl.htmlFor = 'secondOption';
    secondMainlbl.classList.add('labelClassStyle');
    secondMainlbl.appendChild(document.createTextNode('Electronics'));
    secondSpan.appendChild(secondMainlbl);
    secondLi.appendChild(secondMaincheckbox);
    secondLi.appendChild(secondSpan);

    const secondSubUl = document.createElement('ul');
    secondSubUl.classList.add('ulClassStyle');

    for (let i = 0; i < names.length; i++) {
        const name = names[i];
        const secondSubLi = document.createElement('li');
        secondSubLi.classList.add('liClassStyle');
        const secondSubCheckbox = document.createElement('input');
        secondSubCheckbox.type = 'checkbox';
        secondSubCheckbox.name = 'name' + i;
        secondSubCheckbox.value = 'value';
        secondSubCheckbox.id = 'secondSubCheckboxid' + i;
        secondSubCheckbox.checked = true;
        secondSubCheckbox.onclick = function() { secondMyfunction(this); };
        secondSubCheckbox.classList.add('secondSubOption');
        secondSubLi.appendChild(secondSubCheckbox);
        secondSubLi.appendChild(document.createTextNode(name));
        secondSubUl.appendChild(secondSubLi);
        secondSubUl.classList.add('nested');
    }
    secondLi.appendChild(secondSubUl);
    mainUl.appendChild(secondLi);

    const secondCheckboxes = document.querySelectorAll('input.secondSubOption');
    const secondCheckall = document.getElementById('secondOption');
        secondCheckall.onclick = function() {
        for (let i = 0; i < secondCheckboxes.length; i++) {
            secondCheckboxes[i].checked = this.checked;
        }
    };

    function secondMyfunction(checkBox) {
        const secondCheckedCount = document.querySelectorAll('input.secondSubOption:checked').length;
        secondCheckall.checked = secondCheckedCount > 0;
        secondCheckall.indeterminate = secondCheckedCount > 0 && secondCheckedCount < secondCheckboxes.length;
    }

    const secondToggler = document.getElementsByClassName('caret');
    for (let i = 0; i < secondToggler.length; i++) {
        secondToggler[i].addEventListener('click', function() {
            this.parentElement.querySelector('.nested').classList.toggle('active');
            this.classList.toggle('caret-down');
        });
    }

然后我在 CSS 代码中写了这个:

body {
    color: #555;
    font-size: 1.25em;
    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
  }

  hr {
    margin: 50px 0;
  }

  .ulClassStyle
  {
      list-style: none;
  }

  .container {
    margin: 40px auto;
    max-width: 700px;
  }

  .liClassStyle {
    margin-top: 1em;
  }

  .labelClassStyle {
    font-weight: bold;
  }
  .nested {
    display: none;
  }

  .caret {
    cursor: pointer;
    user-select: none;
  }

  .caret::before {
    content: "\25B6";
    color: black;
    display: inline-block;
    margin-right: 6px;
  }

  .caret-down::before {
    transform: rotate(90deg);  
  }

  .active {
    display: block;
  }

如果我将这个 CSS 代码放在主 css 文件中:style.css,它可以正常工作,没有任何问题。但是,如果我为组件添加 CSS,它就不起作用。知道为什么会这样吗?!

【问题讨论】:

  • 向我们展示如何在组件中插入该 css 文件。也许那是问题
  • 您应该阅读角度渲染器并使用它。按照您的方式进行操作不是一个好习惯。
  • 我发现了一件有趣的事情:如果这些项目是静态项目,那么代码将应用于它们。但是,如果这些项目是在运行时添加的,则代码不会应用于它们。是这样的吗?!
  • 我认为@Component 中的这个styleUrls 有一些问题。如果要访问其中的 scss 变量。您最终可能会在每个组件中添加 css 依赖项。而且,如果您想在组件位于另一个组件中时添加特殊规则,则无论如何都需要以全局样式执行此操作。最后,我更喜欢将所有内容都放在样式文件夹中:medium.com/@osternaud_clem/…

标签: css angular angular-components


【解决方案1】:

我发现这个问题正在发生,因为我在运行时动态添加了这些元素。所以,必须在一般的style.css中添加或者写:

encapsulation: ViewEncapsulation.None

这将与使 css 通用

感谢指导。

【讨论】:

    【解决方案2】:

    如果您在 component.css 中编写样式将仅应用于该特定组件,那么 Angular 的工作方式应该是这样为了让您在此处设置全局样式,可以使用 encapsulation: ViewEncapsulation.None 但这将使该组件中的所有样式都全局化,并会影响其他组件以及其他仅将 ::ng-deep 用于特定样式,例如

     ::ng-deep .liClassStyle {
        margin-top: 1em;
      }
    

    所以你应该在style.css中使用应用于body等的样式,在component.css中使用与组件相关的样式

    【讨论】:

    • 我认为 ng-deep 设置为已弃用。
    【解决方案3】:

    在 style.css 不能这样工作的组件中将封装设置为 None >

    @Component({
      selector: 'app-search',
      templateUrl: './search.component.html',
      styleUrls: ['./search.component.scss'],
      encapsulation: ViewEncapsulation.None
    })
    

    【讨论】:

    • 它将使该组件的所有样式全局化,并影响其他组件
    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多