日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

CSS魔法!如何將任意CSS類型轉換為數值?

來源: 責編: 時間:2023-10-16 17:08:45 320觀看
導讀在 CSS 中有各式各樣的類型值,例如 1rem、10vw、100cqw等等,這些相對值給與了 CSS 強大的適應能力。但有時候,我們還需要知道這些相對值所對應的真實值,也就是px值,比如在移動端,我們經常會設置這樣的根字號::root{ font-si

Qho28資訊網——每日最新資訊28at.com

在 CSS 中有各式各樣的類型值,例如 1rem、10vw、100cqw等等,這些相對值給與了 CSS 強大的適應能力。但有時候,我們還需要知道這些相對值所對應的真實值,也就是px值,比如在移動端,我們經常會設置這樣的根字號:Qho28資訊網——每日最新資訊28at.com

:root{  font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));}p{  font-size: 2rem;}

那么,p此時的真實px值應該是多少呢?Qho28資訊網——每日最新資訊28at.com

在以往,我們只能通過 JS去獲取,但是現在,僅僅憑 CSS也能做到,一起了解一下吧!Qho28資訊網——每日最新資訊28at.com

一、CSS 三角函數

從理論上來講,將一個長度除以1px就應該得到具體的數值,相當于將這個長度以1px被分成了多少份。Qho28資訊網——每日最新資訊28at.com

2rem / 1px

但是,大家可能都知道,calc在進行除法運算時,除數是不能帶單位的。Qho28資訊網——每日最新資訊28at.com

calc(2rem / 1px) /*不合法*/

不排除瀏覽器以后會支持。Qho28資訊網——每日最新資訊28at.com

不過現在終于迎來了轉機,在 Chrome 111中,CSS 新增了一系列三角函數。Qho28資訊網——每日最新資訊28at.com

  • sin()[1]:正弦
  • cos()[2]:余弦
  • tan()[3]:正切
  • asin()[4]:反正弦
  • acos()[5]:反余弦
  • atan()[6]:反正切
  • atan2()[7]:反正切

這里我們不聊三角函數的作用,只是作為一個橋梁中轉一下。Qho28資訊網——每日最新資訊28at.com

關于「正切函數」,這里簡單回顧一下高中數學Qho28資訊網——每日最新資訊28at.com

在「直角三角形」中,其中一個銳角的「對邊」和「臨邊」的比值就是這個角的「正切值」,「反正切」就是通過兩條直角邊反向去求出該角的「弧度值」,示意如下:Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

這些函數本身沒什么特別的,業界通用,但有一個非常例外,那就是atan2,它和atan作用是一樣的,都是反正切函數。唯一的區別是,atan2支持兩個值Qho28資訊網——每日最新資訊28at.com

前端中的 atan 就是數學中的 arctan。Qho28資訊網——每日最新資訊28at.com

atan2(y, x)

例如:Qho28資訊網——每日最新資訊28at.com

transform: rotate(atan2(3, 2));/*等同于*/transform: rotate(atan(1.5));

看似好像沒啥意義,直接用tan不就好了?Qho28資訊網——每日最新資訊28at.com

transform: rotate(atan2(3/2));

和JS不同的是,CSS 中還能「支持單位」,如下:Qho28資訊網——每日最新資訊28at.com

transform: rotate(atan2(1rem, 20px));/*等同于?*/

這就不得了了,如果此時的1rem是16px,那么瀏覽器會根據1rem的真實長度和20px做對比,相當于讓兩個帶單位的長度做除法運算。Qho28資訊網——每日最新資訊28at.com

/*等同于*/transform: rotate(atan(.8)); /* 16px / 20px */

也就是說,y/x的值可以得到兩個CSS長度之間的真實比值,而無需額外轉換。Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

然后,通過正切函數tan將括號里面的值解析出來。Qho28資訊網——每日最新資訊28at.com

tan(atan2(1rem, 20px)) /*.8*/

這一點其實在 JS 中也可以驗證一下,只是 CSS 可以帶單位的值。Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

如果將后面的值設置為1px,就相當于把任意長度按照1px進行切分,也就得到了任意長度的px數值,如下:Qho28資訊網——每日最新資訊28at.com

tan(atan2(1rem, 1px)) /*16*/

有了這個不帶單位的絕對值,我們就可以做很多事情了,下面舉幾個例子。Qho28資訊網——每日最新資訊28at.com

二、CSS 獲取當前字號

回到文章開頭的問題,如何通過 CSS 獲取當前字號呢?Qho28資訊網——每日最新資訊28at.com

根據上一節的原理,只要通過tan() 和 atan2()就可以將任意長度轉換為數值了。Qho28資訊網——每日最新資訊28at.com

:root{  font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));}body{  --px-font: tan(atan2(1rem, 1px));}

這樣--px-font就得到了真實的px數值。Qho28資訊網——每日最新資訊28at.com

然后,我們還可以借助 CSS計數器,將這個數字渲染到頁面。Qho28資訊網——每日最新資訊28at.com

body::after{  counter-reset: font var(--px-font);  content: "當前根字號:" counter(font);}

結果...效果如下:Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

好像不太對?貌似是瀏覽器的 bug,這種情況下忽略了tan(atan2(1rem, 1px))中的1rem單位。Qho28資訊網——每日最新資訊28at.com

要修復這個問題其實很容易,需要通過@property定義一個CSS變量,類型為長度,然后將需要計算的值賦給這個變量,如下:Qho28資訊網——每日最新資訊28at.com

@property --font {  syntax: "<length>";  initial-value: 1px;  inherits: false;}:root{  font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));}body::after{  --font: 1rem; /*定義好的CSS變量*/  --px-font: tan(atan2(var(--font), 1px));  counter-reset: font var(--px-font);  content: "當前根字號:" counter(font);}

這樣就正常了,在改變屏幕尺寸時會自動渲染出當前字號。Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

你也可以訪問在線鏈接Qho28資訊網——每日最新資訊28at.com

  • CSS font-size (juejin.cn)[8]
  • CSS font-size (codepen.io)[9]

三、實時顯示容器尺寸

CSS容器查詢中出現了幾個新的尺寸單位。這里只介紹下面兩種。Qho28資訊網——每日最新資訊28at.com

關于容器查詢,可以參考這篇文章:介紹2022最期待且已正式支持的CSS container容器查詢 ? 張鑫旭-鑫空間-鑫生活 (zhangxinxu.com),本文并不涉及具體容器查詢語句。Qho28資訊網——每日最新資訊28at.com

  • 「cqw」 容器查詢寬度(Container Query Width)占比?!?cqw等于容器寬度的1%」。假設容器寬度是1000px,則此時1cqw對應的計算值就是10px。
  • 「cqh」 容器查詢高度(Container Query Height)占比。「1cqh等于容器高度的1%」。

利用前面的技巧,可以將cqw、cqh這些單位轉換為具體的px值。Qho28資訊網——每日最新資訊28at.com

假設有這樣一個容器。Qho28資訊網——每日最新資訊28at.com

.box{  display: grid;  place-content: center;  width: 200px;  height: 200px;  background-color: #fff;}

為了使容器尺寸生效,必須聲明容器類型。Qho28資訊網——每日最新資訊28at.com

.box{  /**/  container-type: size;}

然后用同樣的技巧,在偽元素中通過計數器將寬高渲染出來。Qho28資訊網——每日最新資訊28at.com

.box::before{  --w: 100cqw;  --h: 100cqh;  --px-width: tan(atan2(var(--w), 1px));  --px-height: tan(atan2(var(--h), 1px));  counter-reset: w var(--px-width) h var(--px-height);  content: counter(w) " x " counter(h);}

別忘了修復 bug。Qho28資訊網——每日最新資訊28at.com

@property --w {  syntax: "<length>";  initial-value: 100px;  inherits: false;}@property --h {  syntax: "<length>";  initial-value: 100px;  inherits: false;}

效果如下,完全沒有任何 JS。Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

你也可以訪問在線鏈接Qho28資訊網——每日最新資訊28at.com

  • CSS resize (juejin.cn)[10]
  • CSS resize (codepen.io)[11]

四、自適應文本的頭像

下面看一個自適應文本的頭像,當文本較多時,會自動縮放,讓文本可以完整展示,如下Qho28資訊網——每日最新資訊28at.com

Qho28資訊網——每日最新資訊28at.com

原理其實是通過容器尺寸的映射關系來動態設置文本大小,關鍵實現如下:Qho28資訊網——每日最新資訊28at.com

.avator-container span {  font-size: calc( 24px - 10cqw );}

但是,通過文字大小來縮放有一個限制,在PC上,一般會有最小字號限制(通常是12號),所以更好的方式應該是通過scale來實現。Qho28資訊網——每日最新資訊28at.com

現在,我們可以通過上面的技巧,將容器尺寸轉換成scale能夠識別的數值,通過文本寬度和容器尺寸的比值來確實縮放比例,關鍵實現如下:Qho28資訊網——每日最新資訊28at.com

.avator-container span {  --w: 100cqw;  --scale: tan(atan2(30px, var(--w)));  transform: scale(var(--scale));}

這樣就得到了完全自適應尺寸的文本頭像了。Qho28資訊網——每日最新資訊28at.com

完整代碼可以訪問在線鏈接Qho28資訊網——每日最新資訊28at.com

  • CSS auto text avator (juejin.cn)[12]
  • CSS avator auto scale (codepen.io)[13]

五、總結一下

以上就是本文的全部內容了,介紹了一個非常巧妙并且有用的 CSS 小技巧,下面總結一下Qho28資訊網——每日最新資訊28at.com

  • CSS 有很多類型的尺寸,這些尺寸給與了 CSS 強大的適應能力。
  • 從理論上講,將一個長度除以 1px 就可以得到具體的數值,但是calc不支持。
  • CSS 反正切函數 atan2(y,x) 支持兩個參數,并且還支持帶CSS單位。
  • 通過 tan(atan2(y,x))可以得到y/x的比值,如果x是1px,可以得到y的實際px值。
  • 利用這個技巧,可以將任意類型值轉換為數值。
  • 純數值可以在各個地方都可以使用了,比如scale(var(--n)),如果需要 px,直接calc(var(--n) * 1px )。

參考資料:Qho28資訊網——每日最新資訊28at.com

[1]sin(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/sin。Qho28資訊網——每日最新資訊28at.com

[2]cos(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/cos。Qho28資訊網——每日最新資訊28at.com

[3]tan(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/tan。Qho28資訊網——每日最新資訊28at.com

[4]asin(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/asin。Qho28資訊網——每日最新資訊28at.com

[5]acos(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/acos。Qho28資訊網——每日最新資訊28at.com

[6]atan(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/atan。Qho28資訊網——每日最新資訊28at.com

[7]atan2(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/atan2。Qho28資訊網——每日最新資訊28at.com

[8]CSS font-size (juejin.cn): https://code.juejin.cn/pen/7289041195483791416。Qho28資訊網——每日最新資訊28at.com

[9]CSS font-size (codepen.io): https://codepen.io/xboxyan/pen/XWoObZX。Qho28資訊網——每日最新資訊28at.com

[10]CSS resize (juejin.cn): https://code.juejin.cn/pen/7289046442864279591。Qho28資訊網——每日最新資訊28at.com

[11]CSS resize (codepen.io): https://codepen.io/xboxyan/pen/MWZLYZz。Qho28資訊網——每日最新資訊28at.com

[12]CSS auto text avator (juejin.cn): https://code.juejin.cn/pen/7289095309752270906。Qho28資訊網——每日最新資訊28at.com

[13]CSS avator auto scale (codepen.io): https://codepen.io/xboxyan/pen/qBLLexW。Qho28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-13603-0.htmlCSS魔法!如何將任意CSS類型轉換為數值?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java設計原則與代碼重構:提高可維護性

下一篇: 為什么 HTTP/3 正在吞噬世界

標簽:
  • 熱門焦點
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • 共享單車的故事講到哪了?

    來源丨??素斀浥c共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 四年持續更迭堅持探索行業無人之境,HarmonyOS 4帶來五大升級多項創新

    除了華為每年新發布的旗艦手機系列,上億花粉更加期待鴻蒙系統每次的跨版本大更新。8月4日,HarmonyOS 4于HDC 2023正式發布,這也是該系統歷經四年的再
  • 蘋果公司要求三星和LG Display生產「無邊框」OLED iPhone顯示屏

    據 The Elec 報道,蘋果已要求其供應商為未來的 iPhone 型號開發「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發新的 OLED 顯示面
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
Top 主站蜘蛛池模板: 泽州县| 基隆市| 黄大仙区| 瑞丽市| 马龙县| 饶阳县| 金堂县| 曲阜市| 姜堰市| 小金县| 全州县| 合阳县| 阿拉善左旗| 咸丰县| 油尖旺区| 建德市| 乌什县| 鱼台县| 海阳市| 秦安县| 兰州市| 浦县| 新竹市| 龙胜| 赣榆县| 全州县| 禹州市| 长垣县| 宝坻区| 深圳市| 禹州市| 泾阳县| 贵州省| 望城县| 兴化市| 姜堰市| 莒南县| 苏州市| 班戈县| 孝昌县| 冷水江市|