angularjs 如何在Angular中更改before/after的样式?

p3rjfoxz  于 2023-09-30  发布在  Angular
关注(0)|答案(5)|浏览(197)

我正在尝试在CSS中使用before/after实现带有三角形的面包屑,如本教程所示:
http://css-tricks.com/triangle-breadcrumbs/
相关片段:

  1. <ul class="breadcrumb">
  2. <li><a href="#">Home</a></li>
  3. </ul>
  4. .breadcrumb li a {
  5. color: white;
  6. text-decoration: none;
  7. padding: 10px 0 10px 65px;
  8. background: hsla(34,85%,35%,1);
  9. position: relative;
  10. display: block;
  11. float: left;
  12. }
  13. .breadcrumb li a:after {
  14. content: " ";
  15. display: block;
  16. width: 0;
  17. height: 0;
  18. border-top: 50px solid transparent;
  19. border-bottom: 50px solid transparent;
  20. border-left: 30px solid hsla(34,85%,35%,1);
  21. position: absolute;
  22. top: 50%;
  23. margin-top: -50px;
  24. left: 100%;
  25. z-index: 2;
  26. }

但是,我将其用作定向流,类似于:
首页_分类>>子分类>>详细信息
此流程以突出显示Main_Category开始,其他2个部分为黑色,下面有一个您可以从中进行选择。在选择时,Sub_Category会高亮显示,并弹出另一个。
我的问题是如何改变之前/之后的边框颜色,如果他们是伪元素?所以从教程中,我认为可以在主要部分做到这一点:

  1. <li><a href="#" ng-style="background: {{color}}">Home</a></li>

但是我没有地方设置ng-style的before/after,三角形的颜色最终没有改变。

1mrurvl1

1mrurvl11#

如果我对你的问题理解正确的话,你想知道如何使用一个angular指令来动态地设置before/after伪标记的样式。
不要使用ng-style,而是使用ng-class来附加一个类,这个类将确定要使用哪个before/after伪类。

  1. <ul class="breadcrumb">
  2. <li><a href="#" ng-class="someBooleanInScope? 'color-0' : 'color-1'">Home</a></li>
  3. </ul>

在CSS中:

  1. .breadcrumb li a:after {
  2. content: " ";
  3. display: block;
  4. width: 0;
  5. height: 0;
  6. border-top: 50px solid transparent;
  7. border-bottom: 50px solid transparent;
  8. border-left: 30px solid hsla(34,85%,35%,1);
  9. position: absolute;
  10. top: 50%;
  11. margin-top: -50px;
  12. left: 100%;
  13. z-index: 2;
  14. }
  15. .breadcrumb li a.color-0:after {
  16. background: black;
  17. }
  18. .breadcrumb li a.color-1:after {
  19. background: blue;
  20. }
展开查看全部
s4chpxco

s4chpxco2#

其他答案不允许您基于控制器变量值设置元素的样式。这个答案就是!
使用@HostBinding来定义CSS变量,然后您可以在.scss文件中使用这些变量,从而非常容易地动态设置:before:after的样式。
.ts:

  1. size = 10
  2. padding = 2
  3. @HostBinding('attr.style')
  4. public get cssVars() {
  5. return `
  6. --switch-size: ${this.size};
  7. --switch-padding: ${this.padding};
  8. --switch-size-inner: ${this.size - this.padding * 2};
  9. `;
  10. }

.scss:

  1. .my-class:before {
  2. height: calc(var(--switch-size) * 1px);
  3. }

注意:有些人在使用这种方法时使用DomSanitizer,但我认为没有必要(没有它也能工作)-参见https://stackoverflow.com/a/64252610/1205871

展开查看全部
krcsximq

krcsximq3#

我会避免在这种情况下使用ng-style,你可能会发现使用ng-class并应用不同的类更容易,这将允许你将所有的CSS放在一个地方,而不是在HTML中覆盖。
只需将您的代码更改为:

  1. <li><a href="#" ng-class="{ 'breadcrumb-color': subCategory }">Home</a></li>

其中subCategory应该是一个布尔值,在单击时设置subCategory,然后它将添加breadcrumb-color作为类值,你应该得到这样的结果:

  1. <li><a href="#" class="breadcrumb-color">Home</a></li>

一些示例css,现在你可以设置之前和之后,你请:

  1. .breadcrumb-color li a {
  2. background: red;
  3. }
  4. .breadcrumb-color li a:after {
  5. background: red;
  6. }
展开查看全部
bcs8qyzn

bcs8qyzn4#

ng-class应该为你想做的事情工作。

  1. <li><a href="#" ng-style="ng-class="{beforeCSS: amIBeforeElement()}"">Home</a></li>

粗代码example

sauutmhj

sauutmhj5#

你可以在css中定义你的颜色

  1. .breadcrumb li a.main-category {
  2. background: hsla(34,85%,35%,1);
  3. }
  4. .breadcrumb li a.main-category:after {
  5. border-left-color: hsla(34,85%,35%,1);
  6. }
  7. .breadcrumb li a.sub-category {
  8. background: hsla(44,75%,45%,1);
  9. }
  10. .breadcrumb li a.sub-category:after {
  11. border-left-color: hsla(44,75%,45%,1);
  12. }
  13. /* ... and so on for other categories */

然后使用ngClass

  1. <ul class="breadcrumb">
  2. <li><a href="#" ng-class="{'main-category': isMainCategoryActive(), 'sub-category': isSubCategoryActive()}">Home</a></li>
  3. <!-- ... other breadcrumbs -->
  4. </ul>

在控制器中设置上述函数

  1. $scope.isMainCategoryActive = function() {
  2. // Your logic to determine if main category is active
  3. return true; // or false
  4. };
  5. $scope.isSubCategoryActive = function() {
  6. // Your logic to determine if sub category is active
  7. return false; // or true
  8. };
展开查看全部

相关问题