摘要:庫(kù)通過在中插入標(biāo)簽在運(yùn)行時(shí)創(chuàng)建樣式。結(jié)論是一體化的樣式解決方案,用于彌合和之間的差距。零運(yùn)行時(shí)解決方案通過恢復(fù)工具來緩解一些缺點(diǎn),這些工具將討論提升到更有趣的水平。
Web開發(fā)是需要掌握多種技術(shù)。我們習(xí)慣于與多種語(yǔ)言密切合作。而且,隨著開發(fā)Web應(yīng)用程序變得越來越普遍和差別細(xì)微化,我們經(jīng)常尋找創(chuàng)造性的方法來彌合這些語(yǔ)言之間的差距,從而使我們的開發(fā)環(huán)境和工作流程更容易,更高效。
最常見的示例通常是使用模板語(yǔ)言時(shí)。例如,可以使用一種語(yǔ)言來生成更詳細(xì)的語(yǔ)言(通常是HTML)的代碼。這是前端框架的關(guān)鍵作用之一 -操作HTML。這個(gè)領(lǐng)域最出名的就是JSX,因?yàn)樗皇钦嬲哪0逭Z(yǔ)言;它是JavaScript的語(yǔ)法擴(kuò)展,它使得使用HTML非常簡(jiǎn)潔。
Web應(yīng)用程序經(jīng)歷了許多狀態(tài)組合,多帶帶管理狀態(tài)通常很有挑戰(zhàn)性。這就是為什么CSS有時(shí)會(huì)被淘汰的原因 - 即使通過不同的狀態(tài)和媒體查詢管理樣式同樣重要且同樣具有挑戰(zhàn)性。在這個(gè)由兩部分組成的系列中,我想將CSS放在聚光燈下,并探索彌合它與JavaScript之間的差距。在本系列中,我將假設(shè)您正在使用像webpack這樣的模塊解析器。因此,我將在我的示例中使用React,但相同或類似的原則適用于其他JavaScript框架,包括Vue。
CSS領(lǐng)域正朝著多個(gè)方向發(fā)展,因?yàn)橐鉀Q許多挑戰(zhàn)并且沒有“正確”的路徑。我一直在花費(fèi)大量精力嘗試各種方法,主要是在個(gè)人項(xiàng)目上,所以這個(gè)系列的目的只是告知,而不是給你解決方案。
CSS的挑戰(zhàn)在深入研究代碼之前,有必要解釋W(xué)eb應(yīng)用程序樣式化方面最顯著的挑戰(zhàn)。 我將在本系列中討論的是范圍,條件和動(dòng)態(tài)樣式以及可重用性。
作用域作用域定是眾所周知的CSS挑戰(zhàn),它的目的是編寫不會(huì)影響到組件外部的樣式,從而避免意外的副作用。 我們希望在不影響編碼體驗(yàn)的情況下實(shí)現(xiàn)功能。
條件和動(dòng)態(tài)樣式雖然前端應(yīng)用程序中的狀態(tài)開始變得越來越先進(jìn),但CSS仍然是靜態(tài)的。 我們只能有條件地應(yīng)用樣式集 - 如果按鈕是主要的,我們可能會(huì)應(yīng)用“primary”類并在多帶帶的CSS文件中定義它的樣式以應(yīng)用它在屏幕上的樣式。 有幾個(gè)預(yù)定義的按鈕變化是可管理的,但如果我們想要有各種按鈕,如為Twitter,F(xiàn)acebook,Pinterest定制的特定按鈕,可能還會(huì)有其他很多種? 我們真正想要做的只是傳遞顏色并使用CSS定義狀態(tài),如懸停,焦點(diǎn),禁用等。這稱為動(dòng)態(tài)樣式,因?yàn)槲覀儾辉僭陬A(yù)定義樣式之間切換 - 我們不知道接下來會(huì)發(fā)生什么。 可能會(huì)想到內(nèi)聯(lián)樣式來解決此問題,但它們不支持偽類,屬性選擇器,媒體查詢等。
可重用性重用規(guī)則集,媒體查詢等是我最近很少看到的一個(gè)主題,因?yàn)樗呀?jīng)被Sass和Less等預(yù)處理器解決了。 但是我仍然想在這個(gè)系列中再次提起它。
我將列出一些處理這些挑戰(zhàn)的技術(shù)以及它們?cè)诒鞠盗械膬蓚€(gè)部分中的局限性。 沒有任何技術(shù)優(yōu)于其他技術(shù),它們甚至不相互排斥; 您可以選擇一個(gè)或組合它們,具體取決于您的決定是否能改善您的項(xiàng)目質(zhì)量。
開始吧我們將使用名為Photo的示例組件演示不同的樣式技術(shù)。 我們將呈現(xiàn)可能具有圓角的響應(yīng)式圖像,同時(shí)將替代文本顯示為標(biāo)題。 它會(huì)像這樣使用:
在構(gòu)建實(shí)際組件之前,我們將抽象出srcSet屬性以保持示例代碼簡(jiǎn)潔。 那么,讓我們創(chuàng)建一個(gè)帶有兩個(gè)實(shí)用程序的utils.js文件,用于使用Cloudinary生成不同寬度的圖像:
import { Cloudinary } from "cloudinary-core" const cl = Cloudinary.new({ cloud_name: "demo", secure: true }) export const getSrc = ({ publicId, width }) => cl.url(publicId, { crop: "scale", width }) export const getSrcSet = ({ publicId, widths }) => widths .map(width => `${getSrc({ publicId, width })} ${width}w`) .join(", ")
我們?cè)O(shè)置Cloudinary實(shí)例以使用Cloudinary的演示云名稱,以及根據(jù)指定選項(xiàng)為圖像publicId生成URL的url方法。 我們只對(duì)修改此組件的寬度感興趣。
我們將分別將這些實(shí)用程序用于src和srcset屬性:
getSrc({ publicId: "balloons", width: 200 }) // => "https://res.cloudinary.com/demo/image/upload/c_scale,w_200/balloons" getSrcSet({ publicId: "balloons", widths: [200, 400] }) // => "https://res.cloudinary.com/demo/image/upload/c_scale,w_200/balloons 200w, https://res.cloudinary.com/demo/image/upload/c_scale,w_400/balloons 400w"
如果你不熟悉srcset和sizes屬性,我建議先閱讀一下有關(guān)響應(yīng)式圖像的內(nèi)容。 這樣,您可以更輕松地按照示例進(jìn)行操作。
CSS-in-JSCSS-in-JS是一種樣式方法,它將CSS模型抽象到組件級(jí)別,而不是文檔級(jí)別。 這個(gè)想法是CSS可以限定為特定組件 - 并且只限于該組件 - 以使這些特定樣式不與其他組件共享或泄露到其他組件,并且僅在需要時(shí)才調(diào)用。 CSS-in-JS庫(kù)通過在中插入標(biāo)簽在運(yùn)行時(shí)創(chuàng)建樣式。
使用這個(gè)概念的第一個(gè)庫(kù)是JSS。 以下是使用其語(yǔ)法的示例:
import React from "react" import injectSheet from "react-jss" import { getSrc, getSrcSet } from "./utils" const styles = { photo: { width: 200, "@media (min-width: 30rem)": { width: 400, }, borderRadius: props => (props.rounded ? "1rem" : 0), }, } const Photo = ({ classes, publicId, alt }) => ( ) Photo.defaultProps = { rounded: false, } export default injectSheet(styles)(Photo)
乍一看,樣式對(duì)象看起來像用對(duì)象表示法編寫的CSS,帶有附加功能,比如傳遞一個(gè)函數(shù)來設(shè)置基于props的值。 生成的類是唯一的,因此您永遠(yuǎn)不必?fù)?dān)心它們與其他樣式?jīng)_突。 換句話說,你可以自由的使用作用域! 這就是大多數(shù)CSS-in-JS庫(kù)的工作方式 - 當(dāng)然,我們將在功能和語(yǔ)法方面進(jìn)行一些改進(jìn)。
您可以通過屬性看到渲染圖像的寬度從200px開始,然后當(dāng)視口寬度變?yōu)橹辽?0rem時(shí),寬度增加到400px寬。 我們生成了額外的800寬度,以覆蓋更大的屏幕密度:
1x screens 使用 200 and 400
2x screens 使用 400 and 800
styled-components是另一個(gè)CSS-in-JS庫(kù),但是使用更熟悉的語(yǔ)法巧妙地使用模板文字而不是對(duì)象看起來更像CSS:
import React from "react" import styled, { css } from "styled-components" import { getSrc, getSrcSet } from "./utils" const mediaQuery = "(min-width: 30rem)" const roundedStyle = css` border-radius: 1rem; ` const Image = styled.img` width: 200px; @media ${mediaQuery} { width: 400px; } ${props => props.rounded && roundedStyle}; ` const Photo = ({ publicId, alt, rounded }) => ( ) Photo.defaultProps = { rounded: false, } export default Photo
我們經(jīng)常創(chuàng)建語(yǔ)義中性元素,如 我最喜歡這種語(yǔ)法的好處是它就像常規(guī)的CSS,減去插值。這意味著我們可以更輕松地遷移CSS代碼,并且我們可以使用現(xiàn)有的css知識(shí),而不必熟悉在對(duì)象語(yǔ)法中編寫CSS。 請(qǐng)注意,我們可以在我們的樣式中插入幾乎任何東西。此特定示例演示了如何將媒體查詢保存在變量中并在多個(gè)位置重用它。響應(yīng)式圖像是一個(gè)很好的用例,因?yàn)閟izes屬性基本上包含CSS,所以我們可以使用JavaScript來使代碼更簡(jiǎn)潔。 假設(shè)我們決定在視覺上隱藏字幕,但仍然可以讓屏幕閱讀器訪問它。我知道實(shí)現(xiàn)這一目標(biāo)的更好方法是使用alt屬性,但為了這個(gè)例子,讓我們使用不同的方式。我們可以使用一個(gè)名為polished的樣式mixin庫(kù) - 它適用于CSS-in-JS庫(kù),非常適合我們的示例。這個(gè)庫(kù)包含一個(gè)名為hideVisually的mixin,它正是我們想要的,我們可以通過插入它的返回值來使用它: 即使hideVisually輸出一個(gè)對(duì)象,樣式組件庫(kù)也知道如何將其作為樣式進(jìn)行插值。 CSS-in-JS庫(kù)具有許多高級(jí)功能,如主題,供應(yīng)商前綴甚至內(nèi)聯(lián)關(guān)鍵CSS,這使得完全停止編寫CSS文件變得容易。 此時(shí),您可以開始了解為什么CSS-in-JS成為一個(gè)誘人的概念。 CSS-in-JS的明顯缺點(diǎn)是它引入了一個(gè)運(yùn)行時(shí):需要通過JavaScript加載,解析和執(zhí)行樣式。 CSS-in-JS庫(kù)的作者正在添加各種智能優(yōu)化,如Babel插件,但仍然存在一些運(yùn)行時(shí)成本。 同樣重要的是要注意PostCSS沒有解析這些庫(kù),因?yàn)镻ostCSS不是設(shè)計(jì)用于運(yùn)行時(shí)的。許多人使用stylis作為結(jié)果,因?yàn)樗臁_@意味著我們遺憾的是無法使用PostCSS插件。 我要提到的最后一個(gè)缺點(diǎn)是工具。 CSS-in-JS正在以非常快的速度發(fā)展,文本編輯器擴(kuò)展,linters,代碼格式化等等需要追趕新功能以保持同等水平。例如,人們正在使用VS Code擴(kuò)展樣式組件來表示類似情感的CSS-in-JS庫(kù),即使它們并非都具有相同的功能。我甚至看到提議功能的API選擇受到保留語(yǔ)法突出顯示的目標(biāo)的影響! 有兩個(gè)新的CSS-in-JS庫(kù),Linaria和astroturf,它們通過將CSS提取到文件中來管理零運(yùn)行時(shí)。 它們的API類似于樣式組件,但它們的功能和目標(biāo)各不相同。 Linaria的目標(biāo)是通過內(nèi)置函數(shù)(如作用域,嵌套和供應(yīng)商前綴)來模仿CSS-in-JS庫(kù)的API,如樣式組件。 相反,astroturf是基于CSS模塊構(gòu)建的,具有有限的插值功能,并鼓勵(lì)使用CSS生態(tài)系統(tǒng)而不是使用JavaScript。 CSS-in-JS是一體化的樣式解決方案,用于彌合CSS和JavaScript之間的差距。 它們易于使用,并且包含有用的內(nèi)置優(yōu)化 - 但所有這些都需要付出代價(jià)。 最值得注意的是,通過使用CSS-in-JS,我們基本上從CSS生態(tài)系統(tǒng)中退出并使用JavaScript來解決我們的問題。 零運(yùn)行時(shí)解決方案通過恢復(fù)CSS工具來緩解一些缺點(diǎn),這些工具將CSS-in-JS討論提升到更有趣的水平。 與CSS-in-JS相比,預(yù)處理工具的實(shí)際限制是什么? 這將在本系列的下一部分中介紹。 創(chuàng)建了一個(gè)程序員交流微信群,大家進(jìn)群交流IT技術(shù) 如果已過期,可以添加博主微信號(hào)15706211347,拉你進(jìn)群 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/117042.htmlimport { hideVisually } from "polished"
const Caption = styled.figcaption`
${hideVisually()};
`
摘要:原文地址原文作者譯文出自掘金翻譯計(jì)劃譯者校對(duì)者統(tǒng)一樣式語(yǔ)言在過去幾年中,我們見證了的興起,尤其是在社區(qū)。根本上來說,純粹用于只是一個(gè)命名規(guī)范,它要求樣式的類名要遵守的模式。 原文地址:A Unified Styling Language 原文作者:Mark Dalgleish 譯文出自:掘金翻譯計(jì)劃 譯者:ZhangFe 校對(duì)者:JackGit,yifili09 統(tǒng)一樣式語(yǔ)言 在過...
摘要:小米直達(dá)服務(wù)探秘,如何保證移動(dòng)體驗(yàn)小米直達(dá)服務(wù)是小米推出的混合開發(fā)框架,它可以實(shí)現(xiàn)秒開,同時(shí)可以在瀏覽器短信微信等地方打開。本文即是小米直達(dá)服務(wù)體驗(yàn)保障方面的實(shí)踐分享,討論了目前移動(dòng)體驗(yàn)的瓶頸小米直達(dá)服務(wù)的機(jī)制與核心關(guān)鍵等內(nèi)容。 推薦 1. Node.js 8.5.0 發(fā)布 https://nodejs.org/en/blog/re... 已經(jīng)發(fā)布的 Node.js 8.5.0 版本中...
摘要:以戰(zhàn)爭(zhēng)與和平為藍(lán)本回顧了歷史,也給出了非常贊的觀察視角,程序員應(yīng)該務(wù)實(shí),而不是教條,更重要的是保持好奇心。初版于年前發(fā)布的,作者重寫整個(gè)倉(cāng)庫(kù)從到之后,最近發(fā)布了版本,新版最大變化是升級(jí)到。 showImg(https://segmentfault.com/img/remote/1460000009584813); 不知道大家是否注意到,社區(qū)中出現(xiàn)的 CSS 尤其是 CSS-IN-JS...
摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。它能夠?yàn)槲覀兲峁╊愃朴陬A(yù)處理器命名空間等多方面的輔助。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開發(fā)教程、工程實(shí)踐、深度閱讀、開源項(xiàng)目、巔峰人生等欄目。歡迎關(guān)注【前端之巔】微信公眾號(hào)(ID:f...
摘要:在整個(gè)年,看到發(fā)布版增加了許多功能,包括新的生命周期方法新的上下文指針事件延遲函數(shù)和。它在等待渲染異步響應(yīng)時(shí)數(shù)據(jù),是延遲函數(shù)背后用來管理組件的代碼分割的。發(fā)布自第版開始將近年后,于年發(fā)布。 前端發(fā)展發(fā)展迅速,非常的快。 本文將回顧2018年一些重要的前端新聞,事件和 JavaScript 趨勢(shì)。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(ht...
閱讀 1639·2019-08-30 15:54
閱讀 2387·2019-08-30 15:52
閱讀 2079·2019-08-29 15:33
閱讀 3050·2019-08-28 17:56
閱讀 3249·2019-08-26 13:54
閱讀 1684·2019-08-26 12:16
閱讀 2461·2019-08-26 11:51
閱讀 1658·2019-08-26 10:26