帶你玩轉 ui 框架 ——scoped及樣式穿透問題詳解

前言

在我們前端的開發中經常會使用到各種 ui 框架 下面這兩個是比較火的,也是我常用的兩個ui框架。
在這里插入圖片描述

在這里插入圖片描述

問題描述

但是在使用框架的時候難免會遇到需要改變組件中的一些樣式,當然如果我們所有頁面的組件樣式都是統一的話,我們可以進行全局設置樣式,但是如果我們僅僅在一個頁面中需要個性化的樣式設置,我們平常會下面這樣操作:

<style lang="less" scoped>
#main {width: 100%;height: 90%;
}
.ivu-form .ivu-form-item-label {color: #fff;
}
.ivu-table th {height: 60px !important;
}
.ivu-table td {height: 45px !important;
}
.conLeft {width: 78%;height: 100%;padding: 10px;position: relative;img {width: 100%;height: 100%;}.smaBox {cursor: pointer;position: absolute;width: 40px;height: 40px;}
}
</style>

不難看出我們上面的很多類名就是我們組件中自帶的,我們只有通過這些類名去更改我們當前頁面組件呈現的樣式,但是因為我們在當前頁面中去編寫的樣式只想讓其應用在當前的頁面中,所以我們在style中去添加了scoped屬性,關于scoped屬性的講解我們放到下面去講解;

先回到我們上面的代碼中,看似沒有任何問題我們去通過類名改變組件的樣式,但是他不會生效,就是因為scoped屬性導致的問題,在我們的Vue項目中scoped屬性真的很好用,為我們避免了組件之間的樣式覆蓋,使我們定的樣式不會造成全局的污染!

解決辦法 - 樣式穿透即可

首先我們要搞明白添加上scoped屬性后發生了什么,如果您著急解決問題可以直接看我們這個小節的問題解決,如果您想知其然知其所以然,那么您現在可以先去看文章的下一小節——scoped屬性的原理。

使用樣式穿透去解決 scoped 帶來的問題,樣式穿透有四種形式:
不太推薦第一種寫法,不同瀏覽器的展示形式不一樣,容易出問題,2、3、4這幾種都是有預處理器(less, scss, sass)的寫法,推薦大家使用第二、三種,

  1. stylus的樣式穿透 使用 >>>
  2. /deep/
  3. ::v-deep
  4. 去掉scoped
    將scoped屬性去掉。雖然很方便 但是失去了樣式的保護,我們就需要用原始的方法保護該組件的樣式作用域,可通過后臺選擇器等等方式實現樣式的保護,使其不受污染。好像更麻煩了。

在這里插入圖片描述
上面我通過使用第二種方式 輕松實現了

scoped屬性的原理

為了使樣式私有化(模塊化),不對全局造成污染,可以在style標簽上添加scoped屬性以表示它的只屬于當下的模塊,這是一個非常好的舉措

我們可能只了解他的作用就是為了讓當前組中的style中的樣式,僅僅對當前組件生效,對原理可能不太懂,那下面小編就帶大家梳理一下scoped的原理。

scoped的用法
<template><div class="box">歡迎您的光臨</div>
</template><style lang="less" scoped>.box{background-color:green;}
</style>
  • 從上面的代碼中我們可以看出我們的scoped屬性就是直接寫到我們的style標簽當中,使用就是這么簡單
設置scoped屬性后發生了什么

設置上了scoped 實際上我們是將代碼通過 PostCss 進行了轉換,下面我們進行一下對比

PostCss是一個樣式處理工具,它通過自定義的插件和工具生態體系來重新定義css,有興趣的同學可以去了解一下關于PostCss中的一些常用插件,讓你的css更哇塞

轉換前:

<template><div class="box">歡迎您的光臨</div>
</template><style lang="less" scoped>.box{background-color:green;}
</style>

轉換后:


<template><div class="box" data-v-21aa888a>歡迎您的光臨</div>
</template><style>.example[data-v-21aa888a] {color: red;}
</style>
  • 上面對比后大家應該就懂了是怎么回事了吧,其實說白了加上scoped后vue編譯過程中會生成一個唯一的data-xxx標志,樣式后面會跟上該標志,以避免污染全局樣式
  • 在父組件中設置了scoped中的樣式 如果該組件中有子組件 那子組件的根元素中也會繼承父組件中生成的style的唯一標識
慎用scoped

上面我們看到了scoped這個屬性很香,其實他隱藏了很多坑

  • 大家都知道css樣式有一個優先級的說法,scoped的這一操作,雖然達到了組件樣式模塊化的目的,但是會造成一種后果:每個樣式的權重加重了:理論上我們要去修改這個樣式,需要更高的權重去覆蓋這個樣式。這是增加復雜度的其中一個維度,所以如果要達到修改樣式的目的,就必須加重我們要修改樣式的權重(增加選擇器層級,ID選擇器,并列選擇器,impotant等)
  • 還有一種情況就是我們的兩個組件中均含有scoped 而且一個組件中包含了另一個組件,所以在Dom渲染的時候會在dom節點上加上很多唯一style的標識,有的是繼承的,有的是自己組件的,所以我們在修改樣式的時候還是會涉及到上面所說的權重問題,如果做不好可能會出現尷尬的問題就是自己的組件修改不了自己組件的樣式哈哈
  • 最后的問題就是我們上面拋出的問題,當我們設置此屬性后我們想要改變組件中的樣式是改變不了的,當然我們可以通過強大樣式穿透進行解決!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248673.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248673.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248673.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Npoi Web 項目中(XSSFWorkbook) 導出出現無法訪問已關閉的流

NPOI生產.xlsx文件件時&#xff0c;在使用book.Write(ms);后&#xff0c;會關閉流&#xff0c;這樣導致再次使用Respons輸出流的時候就出錯了。 造成關閉流的主要原因有時其實是跨域&#xff0c;同域是沒有問題的。 //新建類 重寫Npoi流方法 public class NpoiMemoryStream : M…

三分鐘帶你掌握 CSS3 的新屬性

文章目錄1. css3簡介2. css3邊框2.1 邊框圓角2.2 邊框陰影3. css3背景3.1背景圖大小3.2背景圖起始點4. css3文本效果4.1 文本陰影4.2 文本換行5. css3字體圖標6. css32D轉換7. css3 3D轉換8. css3 transition8.1 單項改變8.2 單項改多項改變9. css3 動畫1. css3簡介 CSS 用于控…

用 div 仿寫 input 和 textarea 功能

div仿寫input和textarea input不能換行&#xff0c;textarea也不能跟隨內容多少而增加高度。 contenteditable true; <div class"msg_content" contenteditable"true" placeholder在這里輸入您的留言或建議></div> .msg_content {box-sizing:…

Vue項目中如何設置動態的TDK

TDK是什么 TDK就是網站的標題&#xff08;title&#xff09;、描述&#xff08;description&#xff09;和關鍵詞&#xff08;keyword&#xff09; TDK在哪里 上面大佬對TDK的概念解釋的很全面&#xff0c;但是在網頁中的TDK在哪里呢&#xff0c;作為開發人員打開F12我們就…

[Pytorch]Pytorch的tensor變量類型轉換

原文&#xff1a;https://blog.csdn.net/hustchenze/article/details/79154139 Pytorch的數據類型為各式各樣的Tensor,Tensor可以理解為高維矩陣。與Numpy中的Array類似。Pytorch中的tensor又包括CPU上的數據類型和GPU上的數據類型&#xff0c;一般GPU上的Tensor是CPU上的Tenso…

PHP從零開始--基礎篇

一、 變量 1.1概念 變量是存儲數據的用的容器。 1.2定義變量 變量名的語法規則&#xff1a; 可以是數字、字母、下劃線&#xff0c;但是不能以數字開頭不能出現空格變量名是區分大小寫變量名不能是系統中的關鍵字行業約定的語法規范 駝峰命名法 比如 myname 定義成 myNam…

node

? Table of Contents 1. 全局對象2. 代碼執行優先級3. 模塊導入4. 模塊加載 4.1. 文件模塊優先級4.2. 文件夾加載優先級 4.2.1. 包&#xff08;文件夾&#xff09;下的入口文件優先級4.2.2. 包加載優先級5. 核心模塊的簡單使用 5.1. events1 全局對象 globalconsole.log(globa…

一個關于WCF調用遠程鏈接返回405錯誤不允許使用此方法的問題

最近在調試WCF的接口時一直返回“405不允許使用此方法”&#xff0c;這個問題困擾了大半天&#xff0c;網上查了各種辦法&#xff0c;但是每個人遇到的問題不同還是不能解決。 最后無意之中發現問題所在&#xff0c;記錄一下幫助后面的同學解決問題。 WCF遠程方法會配置屬性Web…

PHP從零開始--循環數組

一、循環 1.1單層for循環 1.1.1基礎語法 for(初識變量;結束范圍;累加/累減){ 重復執行的代碼 } 1、 先初識化變量$i 2、 $i<100表達式進行判斷 3、 跳入循環&#xff0c;執行重復代碼 4、 累加或者累加 5、 再進行$i<100表達式判斷 6、 再跳入循環&#xff0c;執行重復…

Spring Cloud(F版)搭建高可用服務注冊中心

上一篇文章【Spring Cloud搭建注冊中心】成功搭建了一個Eureka Server服務注冊中心&#xff0c;不過相信細心的朋友都會發現&#xff0c;這個服務注冊中心是一個單節點服務注冊中心&#xff0c;萬一發生故障或者服務器宕機&#xff0c;那所有的服務可就不能使用了&#xff0c;這…

Python(60)_閉包

1 、閉包的概念 #-*-coding:utf-8-*- 1、閉包&#xff1a;內部函數調用外部函數的變量def outer():a 1def inner():print(a)print(inner.__closure__) outer() print(outer.__closure__) 2 閉包的使用 #-*-coding:utf-8-*- 1、閉包&#xff1a;內部函數調用外部函數的變量 …

PHP從零開始--錯誤處理函數

一、錯誤處理 1.1錯誤種類 1.1.1Notices 比如沒有定義變量確使用了會報notice錯誤&#xff0c;只是提醒注意&#xff0c;不影響后續代碼執行 1.1.2Warnings 這是警告錯誤&#xff0c;比如include引入一個并不存在的文件&#xff0c;不影響后續代碼執行 1.1.3Fatal Erro…

第四單元博客總結——暨OO課程總結

第四單元博客總結——暨OO課程總結 第四單元架構設計 第一次UML作業 簡單陳述 第一次作業較為簡單&#xff0c;只需要實現查詢功能&#xff0c;并在查詢的同時考慮到性能問題&#xff0c;即我簡單的將每一次查詢的結果以及遞歸的上層結果都存儲下來&#xff0c;使用一個Boolean…

兩列布局:6種方法

面試過程中總會文檔兩列布局&#xff0c;左邊等寬&#xff0c;右邊自適應幾種方法&#xff1f;以下提供6種為君解憂 <div id"wrap"><div id"left"></div><div id"right"></div> </div>需求就是左側定寬&…

PHP從零開始--數據庫

文章目錄一、 數據庫簡介1.1概念1.2命令行操作1.3連接數據庫1.4配置環境變量二、 數據庫的相關操作2.1顯示所有倉庫2.2創建倉庫2.3刪除倉庫2.4切換倉庫三、 數據表的相關操作3.1概念3.2顯示所有的數據表3.3創建數據表3.2修改字段名3.3查看表結構3.4添加字段3.5刪除字段3.6更改數…

常用SQL語句

將記錄的某一字段值設置為空&#xff08;null&#xff09;UPDATE 表名 SET 字段名NULL WHERE 條件字段名123; 更新整列為某個值UPDATE 表名 SET 字段名NULL 轉載于:https://www.cnblogs.com/zhcBlog/p/10254066.html

如何下載js類庫

https://bower.io/ 這個已經淘汰 https://learn.jquery.com/jquery-ui/environments/bower/ Web sites are made of lots of things — frameworks, libraries, assets, and utilities. Bower manages all these things for you. Keeping track of all these packages and mak…

Python 常用系統模塊整理

Python中的常用的系統模塊中部分函數等的整理 random: 隨機數sys: 系統相關os: 系統相關的subprocess: 執行新的進程multiprocessing: 進程相關threading: 線程相關pickle: 將對象轉換成二進制文件time: 時間datetime: 基本的日期和時間類型timeit: 準確測量小段代碼的執行時間…

PHP從零開始--字段修飾符數據操作SQL語言

文章目錄一、 字段修飾符1.1主鍵1.2自動增長1.3非空1.4默認值1.5外鍵二、 對數據的操作2.1增加數據2.2刪除數據2.3更新數據2.4查詢數據2.4.1查詢所有的數據2.4.2查詢指定字段2.4.3去除重復字段2.4.4where表達式詳解2.4.5分組查詢2.4.6排序三、 SQL語言3.1DML3.2DDL3.3DCL一、 字…

scrapy爬蟲框架windows下的安裝問題

windows操作系統python版本是3.6.0通過Anaconda命令conda install scrapy安裝scrapy,安裝過程中沒有問題。然后在命令行輸入命令準備新建項目時&#xff0c;輸入 scrapy startproject firstscrapy時出現了from cryptography.hazmat.bindings._openssl import ffi, libImportErr…