vue中style scope深度訪問方式

背景:
vue-cli3.0項目中需要修改element-ui collapse collapse-item 的樣式(背景色等),template簡單如下:

  <el-collapse class="my-collapse">
      <el-collapse-item title="分類1" name="1" class="plugins-collapse-item">
        <span>分類1</span>
      </el-collapse-item>
      <el-collapse-item title="分類2" name="2">
       <span>分類2</span>
      </el-collapse-item>
    </el-collapse>

試了scoped局部樣式,完全不生效。

<style lang="scss" scoped>
 .el-collapse-item {
    .el-collapse-item__header {
      background: #262720;
      color: #ffffff;
      height: 24px;
      line-height: 24px;
      font-size: 12px;
      border-bottom: 1px solid #4b4c44;
      display: flex;
      flex-direction: row-reverse;
      justify-content: flex-end;
      .el-collapse-item__arrow {
        margin: 0;
        margin-right: 5px;
      }
    }
    .el-collapse-item__wrap {
      background: #262720;
      border-bottom: 1px solid #4b4c44;
      color: #ffffff;
      .el-collapse-item__content {
        color: #ffffff;
        padding-bottom: 0;
        line-height: 18px;
      }
    }
  }
</style>

去掉scoped,寫在全局樣式里,生效了!

<style lang="scss">
///上述代碼
</style>

第一次試全局樣式?jīng)]生效,找到原因:沒寫父類class .el-collapse-item,層級加載順序出了問題,樣式被覆蓋了。

雖然全局樣式可以解決,但是不想寫在全局樣式里,怎么辦呢?找到了Deep Selectors,可以在父組件中修改子組件的樣式,那咱就來嘗個鮮吧。

  • 在css中,使用 >>>
<style >
 .el-collapse-item >>> .el-collapse-item__header {
  background: #262720;
  color: #ffffff;
  height: 24px;
  line-height: 24px;
  font-size: 12px;
  border-bottom: 1px solid #4b4c44;
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
}

.el-collapse-item >>> .el-collapse-item__wrap {
  background: #262720;
  border-bottom: 1px solid #4b4c44;
  color: #ffffff;
} 
</style>
  • 在無法正確解析>>>的預(yù)處理器中(例如sass)使用 /deep/ or ::v-deep
.el-collapse-item {
    ::v-deep .el-collapse-item__header {
      background: #262720;
      color: #ffffff;
      height: 24px;
      line-height: 24px;
      font-size: 12px;
      border-bottom: 1px solid #4b4c44;
      display: flex;
      flex-direction: row-reverse;
      justify-content: flex-end;
      .el-collapse-item__arrow {
        margin: 0;
        margin-right: 5px;
      }
    }
    ::v-deep .el-collapse-item__wrap {
      background: #262720;
      border-bottom: 1px solid #4b4c44;
      color: #ffffff;
      .el-collapse-item__content {
        color: #ffffff;
        padding-bottom: 0;
        line-height: 18px;
      }
    }
  }

編譯后的結(jié)果:


/deep/ or ::v-deep

實現(xiàn)邏輯在插件component-compiler-utils里,附上component-compiler-utils解析scope的源碼:

scope解析

參考:
vue中style scope深度訪問新方式(::v-deep)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容