【问题标题】::first-child styles not beeing applied in Vue Component:first-child 样式未在 Vue 组件中应用
【发布时间】:2020-09-13 06:30:17
【问题描述】:

问题:

通常第一个<User> 应该有margin-left: 0px 并且应该与其他元素左对齐,但这不起作用,如下面的屏幕截图所示。有人知道如何正确解决此问题吗?

sidebar.scss代码:

.user {
  margin-left: -8px;

  &:first-child {
    margin-left: 0;
  }
}

Sidebar.vue代码

<template>
  <section class="sidebar">
    <slot></slot>
  </section>
</template>

<script>
  export default {
    name: "Sidebar"
  }
</script>

<style scoped lang="scss">
  @import 'sidebar';
</style>

Profile.vue代码

<template>
  <main>
    <Sidebar>
      <Header text="Members" :button="{text: 'Edit'}" hasBorder="true"></Header>
      <User img="..."></User>
      <User img="..."></User>
      <User img="..."></User>
      <User img="..."></User>
      <Button color="grey" isRounded="true" isIconOnly="true"></Button>
    </Sidebar>
  </main>
</template>

User.vue代码:

<template>
  <div class="user">
    <img v-if="this.img" :src="this.img" :alt="this.name">
    <div v-if="!this.img"></div>
    <h6 v-if="this.name">{{this.name}}</h6>
    <slot></slot>
  </div>
</template>

【问题讨论】:

  • @YomS。不,不幸的是没有。反正我在编译的代码中看不到样式。

标签: css vue.js sass scope


【解决方案1】:

使用::v-deep 更改scoped css。

我已经回答了这个问题,但我有一个旧的和更具描述性的答案,这可能有助于您了解https://stackoverflow.com/a/56698470/7358308的用法

https://vue-loader.vuejs.org/guide/scoped-css.html#deep-selectors

注意:不要使用/deep/,因为它已被弃用,而且&gt;&gt;&gt; 组合器也无法正常工作,因为您正在使用sass 预处理器

::v-deep {
  .user {
    margin-left: -8px;

    &:first-child {
     margin-left: 0;
   }
  }

}

【讨论】:

  • 不幸的是不起作用。 margin-left:-8px 工作很艰难,所以我认为范围不应该受到影响。奇怪的是除了伪元素之外一切都在工作
  • 您是否尝试过应用任何其他样式,例如 background 或任何主要区别 style,似乎需要最低限度的可重现示例
  • 是的,同样的问题。 background: red 继续编译到所有 .user 元素。如果我尝试将background: blue 添加到:first-child,它将无法再次工作。
【解决方案2】:

不太确定这是否是这里的问题,但请注意:first-child 不会仅通过类名来选择第一次出现,而是通过父元素中的标记。换句话说:您不能使用类名将:first-child 应用于。相反,使用更语义化的东西,例如

<ul class="users">
  <li class="user"></li> <!-- there is your component -->
  <li class="user"></li>
  <li class="user"></li>
</ul>

【讨论】:

  • 是的,我认为这是问题所在。我想得太复杂了哈哈。我将:first-child 更改为:first-of-type,它起作用了。谢谢你:)
【解决方案3】:

范围样式在父组件和子组件之间不共享。您有多种选择:

  1. 通过从父样式部分中删除作用域属性来使样式全局化。

  2. 将样式导入目标组件(用户)。

  3. 在作用域样式中使用深度组合器。

    &gt;&gt;&gt;.user { ... }

/deep/ .user {
  ...
}

::v-deep .user {
  ...
}

【讨论】:

  • 不幸的是没有工作。将样式应用于.user 很奇怪。只有伪元素的样式被忽略
猜你喜欢
  • 2020-12-27
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
相关资源
最近更新 更多