PM說(shuō)要實(shí)現(xiàn)一個(gè)一鍵設(shè)置主題的功能,作為技術(shù),你能想到的實(shí)現(xiàn)方式有哪些呢?1. 什么是主題樣式?
相信大家對(duì)網(wǎng)頁(yè)的主題樣式功能肯定不陌生。對(duì)于一些站點(diǎn),在基礎(chǔ)樣式上,開(kāi)發(fā)者還會(huì)為用戶提供多種主題樣式以供選擇。
下面就是一個(gè)主題樣式功能:用戶可以在右側(cè)選擇自己喜歡的主題色,從而得到一個(gè)“個(gè)性”的頁(yè)面。
還有時(shí)候,我們開(kāi)發(fā)了一個(gè)系統(tǒng)用來(lái)售賣(mài),采購(gòu)我們系統(tǒng)的客戶可能有多個(gè)。也許其中一個(gè)客戶很喜歡我們當(dāng)前的深色色系主題,但是另一個(gè)系統(tǒng)的采購(gòu)方希望我們能為它們定制一套新的樣式。他們希望買(mǎi)來(lái)的系統(tǒng)能貼合它們自己的品牌調(diào)性,變?yōu)闇\色的。這其實(shí)也是一種主題樣式的需求。
在上面的討論里,除了“主題”外,我們又引出了一個(gè)概念——個(gè)性化。經(jīng)常,我們說(shuō)到主題時(shí),還會(huì)有一種說(shuō)法叫做:個(gè)性化主題。這兩者在英文中分別有兩個(gè)對(duì)應(yīng)的詞: Theming 與 Customisation。
當(dāng)我們說(shuō)主題(Theming)與個(gè)性化定制(Customisation)的時(shí)候,很多時(shí)候其實(shí)并沒(méi)有區(qū)分兩者。但實(shí)際上,兩者還是有一些微妙的區(qū)別的。
1.1. 主題 Theming 與個(gè)性化定制 Customisation 的區(qū)別我們說(shuō)的主題(Theming)與個(gè)性化定制(Customisation)的時(shí)候,還是有一些微妙的區(qū)別的。
主題:由開(kāi)發(fā)者定義主要表現(xiàn)在:
系統(tǒng)的輸入是由開(kāi)發(fā)者定義的
一般來(lái)說(shuō)具有有限的種類(lèi)
具有已知的規(guī)則與常量
例如,我們常見(jiàn)的一些應(yīng)用會(huì)提供夜間主題、閱讀模式,這些也算是主題(Theming)的范疇。
個(gè)性化定制:由用戶定義特點(diǎn)表現(xiàn)在:
系統(tǒng)的輸入是由用戶來(lái)提供
一般具有無(wú)限種可能
規(guī)則更靈活,用戶“為所欲為”
可以看到,“個(gè)性化”其實(shí)更強(qiáng)調(diào)了用戶對(duì)系統(tǒng)的的影響力。
很多時(shí)候,我們談到“主題”與“個(gè)性化定制”時(shí),也許并沒(méi)有一個(gè)明確的邊界。從上面的描述也可以看出,兩者似乎是處于天平的兩端,區(qū)別主要在于開(kāi)發(fā)者對(duì)規(guī)則的控制力度以及所能實(shí)現(xiàn)的差異化的粒度。
而我們更多的是在兩點(diǎn)之間找到一個(gè)平衡點(diǎn)。
1.2. 對(duì)實(shí)現(xiàn)“主題功能”的建議我們已經(jīng)對(duì)主題樣式有了初步的了解,如果你也在產(chǎn)品中遇到了主題樣式的相關(guān)需求,不妨先看看以下幾點(diǎn)建議:
盡可能避免這個(gè)功能。因?yàn)楹芏鄷r(shí)候這可能只是個(gè)偽需求。
KISS原則(Keep It Simple, Stupid!)。盡可能降低其復(fù)雜性。
盡量只去改變外觀,而不要改動(dòng)元素盒模型(box-model)。
嚴(yán)格控制你的規(guī)則,避免預(yù)期外的差異。
把它作為一個(gè)錦上添花的功能來(lái)向上促銷(xiāo)(up-sell)。
2. 實(shí)現(xiàn)“主題樣式”的方式 2.1. 方式一:Theme LayerOverriding default style with additional CSS.
這應(yīng)該是實(shí)現(xiàn)主題功能的一種最常用的手段了。首先,我們的站點(diǎn)會(huì)有一個(gè)最初的基礎(chǔ)樣式(或者叫默認(rèn)樣式);然后通過(guò)添加一些后續(xù)的額外的CSS來(lái)覆蓋與重新定義部分樣式。
具體實(shí)現(xiàn)首先,我們引入基礎(chǔ)的樣式 components.* 文件
@import "components.tabs"; @import "components.buttons"
其中 components.tabs 文件內(nèi)容如下
.tab { margin: 0; padding: 0; background-color: gray; }
然后,假設(shè)我們的某個(gè)主題的樣式文件存放于 theme.* 文件:
對(duì)應(yīng)于 components.tabs,theme.tabs 文件內(nèi)容如下
.tab { background-color: red; }
因此,我們只需要引入主題樣式文件即可
@import "components.tabs"; @import "components.buttons" @import "theme.tabs";
這樣當(dāng)前的樣式就變?yōu)榱?/p>
.tab { margin: 0; padding: 0; /* background-color: gray; */ background-color: red; }優(yōu)點(diǎn)
實(shí)現(xiàn)方式簡(jiǎn)單
可以實(shí)現(xiàn)將主題應(yīng)用與所有元素
缺點(diǎn)過(guò)多的冗余代碼
許多的CSS其實(shí)是無(wú)用的,浪費(fèi)了帶寬
把樣式文件切分到許多文件中,更加瑣碎
2.2. 方式二:Stateful ThemingStyling a UI based on a state or condition.
該方式可以實(shí)現(xiàn)基于條件選擇不同的主題皮膚,并允許用戶在客戶端隨時(shí)切換主題。非常適合需要客戶端樣式切換功能,或者需要對(duì)站點(diǎn)某一部分(區(qū)域)進(jìn)行獨(dú)立樣式設(shè)置的場(chǎng)景。
具體實(shí)現(xiàn)還是類(lèi)似上一節(jié)中 Tab 的這個(gè)例子,我們可以將 Tab 部分的 (S)CSS 改為如下形式:
.tab { background-color: gray; .t-red & { background-color: red; } .t-blue & { background-color: blue; } }
這里我們把.t-red與.t-blue稱(chēng)為 Tab 元素的上下文環(huán)境(context)。Tab 元素會(huì)根據(jù) context 的不同展示出不同的樣式。
最后我們給body元素加上這個(gè)開(kāi)關(guān)
此時(shí) Tab 的顏色為紅色。
當(dāng)我們將t-red改為t-blue時(shí),Tab 就變?yōu)榱怂{(lán)色主題。
進(jìn)一步的,我們可以創(chuàng)建一些 (S)CSS 的 util class(工具類(lèi))來(lái)專(zhuān)門(mén)控制一些 CSS 屬性,幫助我們更好地控制主題。例如我們使用如下的.u-color-current類(lèi)來(lái)控制不同主題下的字體顏色
.u-color-current { .t-red & { color: red; } .t-blue & { color: blue; } }
這樣,當(dāng)我們?cè)诓煌黝}上下文環(huán)境下使用.u-color-current時(shí),就可以控制元素展示出不同主題的字體顏色
...
上面這段代碼會(huì)控制元素字體顏色為紅色主題時(shí)的顏色。
優(yōu)點(diǎn)將許多主題放在了同一處代碼中
非常適合主題切換的功能
非常適合站點(diǎn)局部的主題化
可以實(shí)現(xiàn)將主題應(yīng)用于所有元素
缺點(diǎn)有時(shí)有點(diǎn)也是缺點(diǎn),將許多主題混雜在了同一塊代碼中
可能會(huì)存在冗余
2.3. 方式三:Config ThemingInvoking a theme based on settings.
這種方式其實(shí)是在開(kāi)發(fā)側(cè)來(lái)實(shí)現(xiàn)主題樣式的區(qū)分與切換的?;诓煌呐渲茫浜弦恍╅_(kāi)發(fā)的自動(dòng)化工具,我們可以在開(kāi)發(fā)時(shí)期根據(jù)配置文件,編譯生成不同主題的 CSS 文件。
它一般會(huì)結(jié)合使用一些 CSS 預(yù)處理器,可以對(duì)不同的 UI 元素進(jìn)行主題分離,并且向客戶端直接提供主題樣式下最終的 CSS。
具體實(shí)現(xiàn)我們還是以 Sass 為例:
首先會(huì)有一份 Sass 的配置文件,例如settings.config.scss,在這份配置中定義當(dāng)前的主題值以及一些其他變量
$theme: red;
然后對(duì)于一個(gè) Tab 組件,我們這么來(lái)寫(xiě)它的 Sass 文件
.tab { margin: 0; padding: 0; @if ($theme == red) { background-color: red; } @else { background-color: gray; } }
這時(shí),我們?cè)谄渲耙胂鄳?yīng)的配置文件后
@import "settings.config"; @import "components.tabs";
Tab 組件就會(huì)呈現(xiàn)出紅色主題。
當(dāng)然,我們也可以把我們的settings.config.scss做的更健壯與易擴(kuò)展一些
$config: ( theme: red, env: dev, ) // 從$config中獲取相應(yīng)的配置變量 @function config($key) { @return map-get($config, $key); }
與之前相比,這時(shí)候使用起來(lái)只需要進(jìn)行一些小的修改,將直接使用theme變量改為調(diào)用config方法
.tab { margin: 0; padding: 0; @if (config(theme) == red) { background-color: red; } @else { background-color: gray; } }優(yōu)點(diǎn)
訪問(wèn)網(wǎng)站時(shí),只會(huì)傳輸所需的 CSS,節(jié)省帶寬
將主題的控制位置放在了一個(gè)地方(例如上例中的settings.config.scss文件)
可以實(shí)現(xiàn)將主題應(yīng)用于所有元素
缺點(diǎn)在 Sass 中會(huì)有非常多邏輯代碼
只支持有限數(shù)量的主題
主題相關(guān)的信息會(huì)遍布代碼庫(kù)中
添加一個(gè)新主題會(huì)非常費(fèi)勁
2.4. 方式四:Theme PalettesHolding entire themes in a palette file.
這種方式有些類(lèi)似于我們繪圖時(shí),預(yù)設(shè)了一個(gè)調(diào)色板(palette),然后使用的顏色都從其中取出一樣。
在實(shí)現(xiàn)主題功能時(shí),我們也會(huì)有一個(gè)類(lèi)似的“調(diào)色板”,其中定義了主題所需要的各種屬性值,之后再將這些信息注入到項(xiàng)目中。
當(dāng)你經(jīng)常需要為客戶端提供完全的定制化主題,并且經(jīng)常希望更新或添加主題時(shí),這種模式會(huì)是一個(gè)不錯(cuò)的選擇。
具體實(shí)現(xiàn)在方式三中,我們?cè)谝粋€(gè)獨(dú)立的配置文件中設(shè)置了一些“環(huán)境”變量,來(lái)標(biāo)示當(dāng)前所處的主題。而在方式四中,我們會(huì)更進(jìn)一步,抽取出一個(gè)專(zhuān)門(mén)的 palette 文件,用于存放不同主題的變量信息。
例如,現(xiàn)在我們有一個(gè)settings.palette.red.scss文件
$color: red; $color-tabs-background: $color-red;
然后我們的components.tabs.scss文件內(nèi)容如下
.tabs { margin: 0; padding: 0; backgroung-color: $color-tabs-background; }
這時(shí)候,我們只需要引入這兩個(gè)文件即可
@import "settings.palette.red"; @import "components.tabs";
可以看到,components.tabs.scss中并沒(méi)有關(guān)于主題的邏輯判斷,我們只需要專(zhuān)注于編輯樣式,剩下就是選擇所需的主題調(diào)色板(palette)即可。
優(yōu)點(diǎn)編譯出來(lái)的樣式代碼無(wú)冗余
非常適合做一些定制化主題,例如一個(gè)公司采購(gòu)了你們的系統(tǒng),你可以很方便實(shí)現(xiàn)一個(gè)該公司的主題
可以從一個(gè)文件中完全重制出你需要的主題樣式
缺點(diǎn)由于主要通過(guò)設(shè)定不同變量,所以代碼確定后,能實(shí)現(xiàn)的修改范圍會(huì)是有限的
2.5. 方式五:用戶定制化 User CustomisationLetting users style their own UIs.
這種模式一般會(huì)提供一個(gè)個(gè)性化配置與管理界面,讓用戶能自己定義頁(yè)面的展示樣式。
“用戶定制化”在社交媒體產(chǎn)品、SaaS 平臺(tái)或者是 Brandable Software 中最為常見(jiàn)。
具體實(shí)現(xiàn)要實(shí)現(xiàn)定制化,可以結(jié)合方式二中提到的 util class。
首先,頁(yè)面中支持自定義的元素會(huì)被預(yù)先添加 util class,例如 Tab 元素中的u-user-color-background
此時(shí),u-user-color-background還并未定義任何樣式。而當(dāng)用戶輸入了一個(gè)背景色時(shí),我們會(huì)創(chuàng)建一個(gè)標(biāo)簽,并將 hex 值注入其中
這時(shí)用戶就得到了一個(gè)紅色的 Tab。
Twitter 就是使用這種方式來(lái)實(shí)現(xiàn)用戶定制化的界面樣式的:
優(yōu)點(diǎn)不需要開(kāi)發(fā)人員的輸入信息(是用戶定義的)
允許用戶擁有自己“獨(dú)一無(wú)二”的站點(diǎn)
非常實(shí)用
缺點(diǎn)不需要開(kāi)發(fā)人員的輸入信息也意味著你需要處理更多的“不可控”情況
會(huì)有許多的冗余
會(huì)浪費(fèi) CSS 的帶寬
失去部分 CSS 的瀏覽器緩存能力
3. 如何選擇方案?最后來(lái)聊聊方案的選擇。
在第二部分我們已經(jīng)了解了五種實(shí)現(xiàn)方式(或者說(shuō)4?種方法,因?yàn)榈谖宸N其實(shí)更偏個(gè)性化定制一些),那么面對(duì)產(chǎn)品需求,我們應(yīng)該如何選擇呢?
這里有一個(gè)不是非常嚴(yán)謹(jǐn)?shù)姆绞娇梢詤⒖?。你可以通過(guò)嘗試問(wèn)自己下面這幾個(gè)問(wèn)題來(lái)做出決定:
是你還是用戶誰(shuí)來(lái)確定樣式?
用戶:選擇【方式五】User Customisation
主題是否會(huì)在客戶端中被切換?
是:選擇【方式二】Stateful Theming 或【方式五】User Customisation
是否有主題能讓用戶切換?
是:選擇【方式二】Stateful Theming
你是希望網(wǎng)站的某些部分需要有不同么?
是:選擇【方式二】Stateful Theming
是否有預(yù)設(shè)的主題讓客戶端來(lái)選擇?
是:選擇【方式三】Config Theming
是否是類(lèi)似“貼牌”這類(lèi)場(chǎng)景?
是:選擇【方式一】Theme Layer 或【方式四】Theme Palettes
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/117051.html
摘要:當(dāng)然,也可自己寫(xiě)一個(gè)轉(zhuǎn)換函數(shù),按照一定規(guī)則便行為編碼的字節(jié),如下例中國(guó)結(jié)果中國(guó)結(jié)果結(jié)果通過(guò)簡(jiǎn)單的函數(shù),就可以完成編碼到編碼的轉(zhuǎn)換,進(jìn)而完成寬字節(jié)字符到編碼的轉(zhuǎn)換。 前端開(kāi)發(fā)過(guò)程中會(huì)接觸各種各樣的編碼,比較常見(jiàn)的主要是 UTF-8 和 HTML 實(shí)體編碼,但是 web 前端的世界卻不止這兩種編碼,而且編碼的選擇也會(huì)造成一定的問(wèn)題,如前后端開(kāi)發(fā)過(guò)程中不同編碼的兼容、多字節(jié)編碼可能會(huì)造成的 ...
摘要:前言最近搭建的項(xiàng)目想引入并實(shí)現(xiàn)樣式局部作用域化,但是在網(wǎng)上找了很多方法試過(guò)了都不行,最后打到解決方法,在此記下這慘痛的歷程。 微信公眾號(hào):愛(ài)寫(xiě)bugger的阿拉斯加如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問(wèn)題。 1. 前言 最近搭建的 react 項(xiàng)目想引入 less ,并實(shí)現(xiàn)樣式局部作用域化,但是在網(wǎng)上找了很多方法試過(guò)了都不行,最后打到解決方法,在此記下這慘痛的歷程。 2. cr...
摘要:由于年提出,這基于她在雅虎的工作。但是這很難做到解決的問(wèn)題樣式全局性造成的樣式?jīng)_突問(wèn)題多人協(xié)作的命名問(wèn)題解決層疊問(wèn)題,使的優(yōu)先級(jí)保持相對(duì)扁平的模塊化,使更具有復(fù)用的能力于年由提出,當(dāng)時(shí)他在雅虎工作。 編寫(xiě)CSS會(huì)遇到什么問(wèn)題? 其實(shí)CSS很好寫(xiě),只要知道css語(yǔ)法,你就可以寫(xiě)出來(lái),通過(guò)各種學(xué)習(xí),你也可以做出一個(gè)很美麗的頁(yè)面。對(duì)能熟練編寫(xiě)網(wǎng)頁(yè)的人來(lái)說(shuō),可以很簡(jiǎn)單的將設(shè)計(jì)圖變成網(wǎng)頁(yè)。但是在...
閱讀 2552·2021-09-08 09:45
閱讀 3449·2021-09-08 09:45
閱讀 3154·2019-08-30 15:54
閱讀 3410·2019-08-26 13:54
閱讀 1480·2019-08-26 13:26
閱讀 1438·2019-08-26 13:23
閱讀 975·2019-08-23 17:57
閱讀 2235·2019-08-23 17:14