eb中使用一些圖案做為背景圖案是一種時常可見的,早期一般都是通過圖片來完成。直至CSS一些新特性更趨成熟和穩(wěn)定的時候,會通過CSS的相關(guān)技術(shù),比如CSS的漸變屬性配合background-size之類的來做一些復雜而又美觀的Web圖案,運用于background-image之中。
而其中最為出名的是@Lea寫的CSS3 Patterns,并且@Lea在其《CSS Secrets》一書中特別介紹了CSS如何實現(xiàn)復雜背景圖案。雖然CSS Patterns實現(xiàn)的圖案是令人感到驚艷與好奇,但其擴展性以及適配性還是有一定的限制。因此有同學將CSS Patterns換成了SVG Patterns(也就是使用SVG相關(guān)的特性實現(xiàn)了CSS Patterns相同的效果)。當然,除此之外,還有很多工具能幫助我們來實現(xiàn)CSS圖案的效果,其中有的工具可以生成代碼,而有的工具會生成圖片。
隨著前端技術(shù)不斷的革新,不久前看到一個生成Web圖片的組件:<css-doodle /> —— 使用CSS繪制圖案的Web組件!
這是一個非常強大的Web組件,初次看到,你會覺得她非常的神奇和強大。至于為什么?你要是花日間閱讀完后面的內(nèi)容,你就知道其中的原委了。為了讓大家對其有初次的感覺,先上一個使用<css-doodle />組件創(chuàng)作的圖案效果,如下:
是不是有點蠢蠢欲動的感覺。如果是的話,跟著下面的節(jié)奏繼續(xù)往下閱讀。
什么是<css-doodle />
<css-doodle />是一個Web組件。其基于Shadow DOM V1和Custom Elements V1來構(gòu)建的。該組件可以幫助輕松的使用Custom Elements、Shadow DOM和CSS Grid創(chuàng)建任何你想要的圖案(CSS 圖案)。創(chuàng)建出來的圖案你可以運用于Web頁面中。
當你看到Custom Elements、Shadow DOM和CSS Grid的時候,你一定會心卻,這些東西瀏覽器能支持。事實上你的擔憂是正常的,因為該組件到目前為止只在最新的Chrome和Safari瀏覽器上可以正常的運行。如果你想運用于其他的瀏覽器上,你需要相關(guān)的Polyfilling。
簡單點說:
該組件通過其內(nèi)部的規(guī)則(純CSS)會生成一系列的div構(gòu)建的CSS Grid。你可以使用CSS輕松地操作這些div(單元格,每個div就是一個單元格)來生成圖案。生成的圖案既可以是靜態(tài)的,也可以是動態(tài)的。而其限制僅限于CSS本身的限制。
開始使用<css-doodle />
使用<css-doodle />組件創(chuàng)建圖案很簡單,當然有一個前提是你對其相關(guān)的API和使用方法有所了解。這里先來看怎么在你的項目中使用該組件。
使用<css-doodle />組件有兩種方法,第一種是比較原始的方法,就是在你的HTML文件中引入該組件所需要的JS和CSS文件。最簡單的方法就是直接引用cdnjs:
[xml] view plain copy
<script src="https://cdnjs.cloudflare.com/ajax/libs/css-doodle/0.3.0/css-doodle.min.js"></script>
這個script你可以在</head>或</body>結(jié)束標簽前調(diào)用。然后在任何你想要的地方調(diào)用:
[xml] view plain copy
<css-doodle> /* 繪制圖案的代碼放在這里 */
</css-doodle>
如果你不想使用cdnjs提供的在線資源,你也可以將css-doodle-0.3.0.min.js文件下載到你本地的項目中,通過相對路徑來引用下載的文件。
除此之外,也可以通過npm的方式將<css-doodle />安裝到你的項目中,然后通過import的方式將其引入到你的項目中。比如說在Vue項目中,你可以先執(zhí)行:
npm install css-doodle
或者使用yarn來安裝:
yarn add css-doodle
然后在你想要使用<css-doodle />的地方先import,比如在App.vue文件中:
[python] view plain copy
import CSSDoodle from 'css-doodle'
然后你就可以在<template>中引用,比如:
這時在你的頁面中看到的效果如下:
這個時候,你和我可以一樣,對<css-doodle></css-doodle>中代碼一無所知,但正是這里面的一些代碼生成了上圖這樣的效果。這個時候你通過瀏覽器開發(fā)者工具查看代碼的時候,你會看到生成的代碼如下圖所示:
基本語法
<css-doodle />的語法是基于CSS的,這一點需要特別記住 —— 一切能用于Web的CSS,都可以用于此處!。除此之外,他還提供了一些額外的實用函數(shù)和簡寫的屬性。這些函數(shù)和屬性可以在其官網(wǎng)中查閱。
有關(guān)于<css-doodle />提供的函數(shù)和屬性,在本文章中不做一一介紹,如果你想使用該組件來創(chuàng)作一些有意思的Web圖案,那非常有必要花一定的時間去閱讀官方文檔。并嘗試自己寫寫Demo。你會很快就能掌握這些規(guī)則和使用姿勢!
先看一個簡單示例
使用<css-doodle />其后臺運行機制是使用CSS Grid布局創(chuàng)建一個網(wǎng)格系統(tǒng)。其實創(chuàng)建一個簡單的網(wǎng)格是<css-doodle />最為簡單的一個示例。比如說,我們創(chuàng)建一個5 x 8(五行八列)的網(wǎng)格,并且這個網(wǎng)格的width和其父容器的寬度相同(即100%),高度為瀏覽器屏幕高度的五分之一。那么我們就可以這樣寫代碼:
你將看到的效果如下:
特別注意:如果你的瀏覽器看不到任何的效果,請確認你使用的是最新版本的Chrome或Safari瀏覽器!后續(xù)的示例不再做相關(guān)的提示!
為了幫助沒時間閱讀官方文檔的同學能看懂上面的代碼,這里簡單的做一下說明:
再來看一個復雜的示例
上面看到的效果是一個簡單的示例效果,使用了一些最基本的樣式規(guī)則寫了一個五行八列的網(wǎng)格。其實我們還可以利用<css-doodle />提供的一些函數(shù)和一些其他的CSS樣式規(guī)則,制作一些復雜的效果,而且還可以是帶有動效的。比如下面這個示例:
對應(yīng)的效果如下:
效果是不是很炫,很酷!
正如你所見,在上面這個示例中,還使用了@keyframe來聲明動畫,并且還使用了CSS自定義屬性。再次驗證,只要是瀏覽器支持的CSS屬性都可能用于<css-doodle />。
帶有交互效果的案例
上面的示例,使用@keyframes可以做一個帶有動畫的效果。除此之外,還有更神奇的效果,那就是使用<css-doodle />的JavaScript API還可以實現(xiàn)現(xiàn)有交互效果的圖案。比如下面這個示例:
當我們鼠標懸浮在上面的時,圖標會旋轉(zhuǎn),這依舊采用的是@keyframes做的一個簡單動畫。除此之外,你點擊屏幕時,整個圖案會更新。
實現(xiàn)這樣的效果很簡單,就只是簡單的加了下面這么幾行JavaScript代碼:
[php] view plain copy
const myDoodle=document.querySelector('.my-doodle'); myDoodle.addEventListener('click', ()=> { myDoodle.update(); });
使用了一個.update()函數(shù),當你在屏幕單擊時,整個組件會使用給定的樣式重新刷新。
上面看到的是不同方式實現(xiàn)的一些圖案效果。除些之外,你可以發(fā)動你的大腦和創(chuàng)意,制作一些其他更有意思的圖案效果。如果你感興趣的話,可以看看@yuanchuan在Codepen整理的有關(guān)于<css-doodle />組件制作的一些圖案效果。
總結(jié)
這篇文章主要科普了一下<css-doodle />組件。簡單的回顧一下,該組件是一個Web組件,主要是基于Shadow DOM V1 和 Custom Elements V1 來構(gòu)建的。而其背后運行的原理是使用CSS Grid和純CSS規(guī)則制作的一些圖案。除了CSS自帶的規(guī)則之外,該組件還封裝了一些函數(shù)和屬性,能讓你快速制作一些圖案。另外還你還可以使用Unicode字符創(chuàng)建一些字符圖案。
當你閱讀到這里的時候,我想你對<css-doodle />組件有所了解,如果你動手了,或許你創(chuàng)作出一些與眾不同的圖案效果。希望你能在下面的評論中分享您的作品。如果你有其他的想法,也歡迎在下面的評論中分享。最后,該文章要是對您有所幫助的話,歡迎各位爺打個賞,鼓勵我繼續(xù)創(chuàng)作一些優(yōu)質(zhì)的教程。(^_^)
Web領(lǐng)域的一些基本概念。
Web(World Wide Web)叫全球廣域網(wǎng),俗稱萬維網(wǎng)(www)。
W3C(World Wide Web Consortium)叫萬維網(wǎng)聯(lián)盟,是國際最著名的標準化組織,制定了web標準。
一個網(wǎng)頁包含了html元素 Css JavaScript,Html元素決定了網(wǎng)頁結(jié)構(gòu),Css進行了修飾美化,JavaScript控制了交互行為和動態(tài)效果。
web標準包含了下面三個方面:
Html不是一種編程語言,而是描述性的標記語言,主要作用是定義內(nèi)容的結(jié)構(gòu)。
2014年10月萬維網(wǎng)聯(lián)盟(W3C)完成了HTML5標準制定,是目前最新的HTM版本。
HTML5的出世,標志著web進入一個富客戶端(具有很強的交互性和體驗的客戶端程序)時代,像APP網(wǎng)頁,小程序都是HTML5的應(yīng)用場景。
Html5新特性:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"> <!--字符集-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="Author" content="">
<meta name="Keywords" content="關(guān)鍵詞" />
<meta name="Description" content="頁面描述" />
<title>頁面標題</title>
</head>
<body>
</body>
</html>
viewport用戶網(wǎng)頁的可視區(qū)域,一個針對移動網(wǎng)頁優(yōu)化的頁面 viewport meta 標簽如下:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
head區(qū)域元素:
meta title style link script base。
body區(qū)域元素:
塊級元素:每個元素都是獨占一行
行內(nèi)元素:元素在同一行水平排列
inline-block:元素可以排列在同一行顯示,并且可以設(shè)置一些塊元素屬性
通過Css:display:inline-block 改變元素。
很多元素都自帶了默認樣式,不同瀏覽器下默認樣式表現(xiàn)不一致,為了統(tǒng)一或者滿足一些需求我們需求將所有默認樣式清空,這種處理方式又稱為 Css Reset,比如:
*{
margin: 0;
padding: 0;
}
另外一種方案使用normalize.css,它將不同瀏覽器下的默認樣式進行了統(tǒng)一,
https://github.com/necolas/normalize.css
html中的單位是像素px
絕對單位
相對單位
屬性:字體、行高、顏色、大小、背景、邊框、滾動、換行、修飾屬性(粗體、斜體、下劃線)
p{
font-size: 20px; /*字體大小*/
line-height: 30px; /*行高*/
font-family: PingFang SC; /*字體類型:顯示PingFang SC,沒有就顯示默認*/
font-style: italic ; /*italic表示斜體,normal表示不傾斜*/
font-weight: bold; /*粗體或?qū)懀?00|500|600)*/
font-variant: small-caps; /*小寫變大寫*/
}
行高(line-height)
一般約定行高、字號都是偶數(shù),這樣保證它們的差一定偶數(shù)除2得到整數(shù),如下圖所示:
line-height
文本垂直居中
對于單行文本可以設(shè)置行高=盒子高度。
對于多行元素的垂直對齊,我們可以使用vertical-align: middle屬性,不過vertical-align 僅適用inline、inline-block 和 table-cell 元素。
vertical-align
vertical-align: baseline;
vertical-align: sub;
vertical-align: super;
vertical-align: text-top;
vertical-align: text-bottom;
vertical-align: middle;
vertical-align: top;
vertical-align: bottom;
/* 指定長度值 */
vertical-align: 10em;
vertical-align: 4px;
/* 使用百分比 */
vertical-align: 20%;
/* 全局值 */
vertical-align: inherit;
vertical-align: initial;
vertical-align: revert;
vertical-align: unset;
內(nèi)容溢出處理
filter:gray()
理解優(yōu)先級很重要,有助于我們排查一些問題。瀏覽器將優(yōu)先級分為兩部分:HTML的行內(nèi)樣式和選擇器的樣式。
行內(nèi)樣式
行內(nèi)樣式是直接作用在元素,它的優(yōu)先級高于選擇器樣式,使用!important可以提高樣式表的優(yōu)先級。
<div style="font-size:16px">
</div>
選擇器樣式
<style type="text/css">
p{
font-size: 16px;
}
</style>
<link rel="stylesheet" href="style/app.css">
優(yōu)先級規(guī)則如下:
優(yōu)先級
我們通過下圖這種標記方式,就可以判斷出選擇器的優(yōu)先級。
優(yōu)先級
兩條經(jīng)驗法則
由多個基礎(chǔ)選擇器組合成的復雜選擇器。
多個基礎(chǔ)選擇器連起來(中間沒有空格)組成一個復合選擇器(如:ul.nav)。復合選擇器選中的元素將匹配其全部基礎(chǔ)選擇器,.box.nav 可以選中 class="box nav" ,但是不能選中 class="box"。
用于選中某種特定狀態(tài)的元素,優(yōu)先級(0,1,0)。
:nth-child(an+b)
更多參考:https://developer.mozilla.org/zh-CN/docs/Web/CSS
偽元素選擇器可以向HTML標記中未定義的地方插入內(nèi)容,優(yōu)先級(0,0,1)。
屬性選擇器用于根據(jù)HTML屬性進行匹配元素,優(yōu)先級(0,1,0)。
本文要點回顧,歡迎留言交流。
些一行代碼大多數(shù)會是CSS規(guī)則中的一個聲明。在某些情況下,選擇器可能不只是一個簡單的元素;在其他情況下,我會添加額外的聲明作為建議以獲得更好的體驗,因此使它們不再嚴格意義上是一行代碼——對于這些情況我提前道歉。
這些一行代碼中的一些更多是個人選擇,并不適用于所有網(wǎng)站(并非每個人都使用表格或表單)。我會簡要描述每一個,它們的作用(附帶示例圖片),以及為什么我喜歡使用它們。請注意,示例圖片可能會在前面例子的基礎(chǔ)上進行構(gòu)建。
以下是這些一行代碼的作用概述:
限制視口內(nèi)的內(nèi)容寬度
body {
max-width: clamp(320px, 90%, 1000px);
/* 額外建議 */
margin: auto;
}
添加這個一行代碼將使內(nèi)容大小占據(jù)視口的90%,將其寬度限制在320到1000像素之間(可以隨意更新最小和最大值)。
這個改變將自動使您的內(nèi)容看起來更好看。它將不再是一個龐大的文本塊,而是看起來更有結(jié)構(gòu)和組織。如果你還給body添加margin: auto;,內(nèi)容將在頁面上居中。兩行代碼讓內(nèi)容看起來好多了。
并排比較變化。左側(cè)(之前):一大塊文本。右側(cè)(之后):兩側(cè)有內(nèi)邊距的文本。仍然很大但有更多空間。
對齊和包含的文本比一大堆文本看起來更好
增加文本大小
body {
font-size: 1.25rem;
}
讓我們面對現(xiàn)實:瀏覽器默認的16px字體大小是小的。雖然這可能是基于我變老的個人觀點
一個快速的解決方案是增加body中的字體大小。由于級聯(lián)和瀏覽器使用的em單位,網(wǎng)頁上的所有文本將自動增大。
并排比較。左側(cè)(之前):帶有文本的列。右側(cè)(之后):帶有更大字體的文本列。
更大的文本大小使閱讀更容易。
增加行間距
body {
line-height: 1.5;
}
另一個提高可讀性和打破可怕的文本墻的偏好是增加段落和內(nèi)容中行與行之間的間距。我們可以輕松地用line-height屬性做到這一點。
并排比較。左側(cè)(之前):帶有文本的列。右側(cè)(之后):帶有文本的列(間距更大)。
行間的空間打破了文本墻和白色的河流。
這個選擇(與前兩個一起)將顯著增加我們頁面的垂直大小,但我向你保證文本將更易讀,對所有用戶更友好。
限制圖片大小
img {
max-width: 100%;
}
圖片的大小應(yīng)該大致與它們將占據(jù)的空間相當,但有時我們會遇到真正長的圖片,導致內(nèi)容移位并創(chuàng)建水平滾動。
避免這種情況的一種方法是設(shè)置最大寬度為100%。雖然這不是一個萬無一失的解決方案(邊距和內(nèi)邊距可能影響寬度),但在大多數(shù)情況下它都能工作。
并排比較。左側(cè)(之前):圖片溢出內(nèi)容大小導致出現(xiàn)滾動條。右側(cè)(之后):圖片調(diào)整到內(nèi)容大小。
防止水平滾動并使圖片與文本更好地流動
限制內(nèi)容中文本的寬度
p {
max-width: 65ch;
}
避免可怕的文本墻和空白河流的另一種策略是應(yīng)用這種樣式,即使與body中的最大寬度結(jié)合使用。這可能看起來不必要,有時甚至很奇怪,因為段落會比其他元素更窄。但我喜歡這種對比和較短的行。
60ch或65ch的值在過去對我很有效,但你可以使用不同的值并調(diào)整最大寬度以滿足你的需求。在你的網(wǎng)頁上玩耍和探索它的外觀。
并排比較。左側(cè)(之前):文本占據(jù)整個寬度。右側(cè)(之后):文本占據(jù)大部分寬度。
將較大的文本塊分成較小的塊以提高可讀性
以更平衡的方式包裹標題
h1, h2, h3, h4, h5, h6 {
text-wrap: balance;
}
標題是網(wǎng)頁結(jié)構(gòu)的重要部分,但由于它們的大小較大和內(nèi)容較短,可能看起來很奇怪。特別是當它們占據(jù)多于一行時。一個有幫助的解決方案是使用text-wrap來平衡標題。
雖然balance似乎是text-wrap最流行的值,但它不是唯一的。我們也可以使用pretty,如果需要的話,它會將額外的一個詞移到最后一行,而不是平衡所有內(nèi)容。不幸的是,pretty目前還沒有廣泛的支持。
并排比較。左側(cè)(之前):一個標題占據(jù)兩行,第二行只有1個詞。右側(cè)(之后):標題占據(jù)寬度相似的兩行。
平衡的換行可以改善可見性和可讀性
表單控件顏色與頁面樣式匹配
body {
accent-color: #080; /* 使用你喜歡的顏色 */
}
另一個小變化,雖然沒有顯著影響,但能讓東西看起來更好。直到最近,我們還不能用CSS樣式化原生表單控件,只能使用瀏覽器顯示。但情況已經(jīng)改變。
開發(fā)一個完整的組件可能很麻煩,但使用這個一行代碼可以設(shè)置一個更接近網(wǎng)站其他部分和設(shè)計系統(tǒng)的顏色,這是可能的,而且很簡單。
并排比較。左側(cè)(之前):表單控件是默認的藍色。右側(cè)(之后):表單控件顏色與標題和鏈接顏色匹配(綠色)。
正是這些小細節(jié)(和顏色)讓頁面融為一體
易于跟隨的表格行
:is(tbody, table) > tr:nth-child(odd) {
background: #0001; /* 或者對于深色主題使用 #fff1 */
}
我們必須使用表格來顯示數(shù)據(jù),而不是用于布局。但默認情況下表格很丑,我們不希望數(shù)據(jù)看起來很丑。特別是,有一件事有助于組織數(shù)據(jù)并使其更易讀,那就是有一個帶有交替深淺行的斑馬表格。
上面顯示的一行代碼使得實現(xiàn)這種樣式變得容易。它可以簡化為只有tr而不考慮tbody或table父元素,但這也會應(yīng)用到表格頭部,這可能不是我們想要的。這是一個品味問題。
并排比較。左側(cè)(之前):所有表格行都是白色的。右側(cè)(之后):偶數(shù)表格行略微深色。
更容易水平跟隨數(shù)據(jù)(按行)
表格單元格和標題的間距
td, th {
padding: 0.5em; /* 或 0.5em 1em... 或任何不為0的值 */
}
讓表格更易訪問和更易讀的最后一個變化是通過給表格單元格和標題添加內(nèi)邊距來稍微間隔內(nèi)容。默認情況下,大多數(shù)瀏覽器沒有任何內(nèi)邊距,不同單元格的文本相互接觸,使得區(qū)分一個單元格開始和另一個結(jié)束變得混亂。
我們可以更改內(nèi)邊距值以調(diào)整到我們喜歡的大小。然而,避免過度以防止不必要的滾動或太多空白空間。
并排比較。左側(cè)(之前):表格單元格文本內(nèi)容完全在一起。右側(cè)(之后):表格單元格內(nèi)容明顯與其他表格單元格分開。
更容易水平和垂直跟蹤數(shù)據(jù)
減少動畫和移動
@media (prefers-reduced-motion) {
*, *::before, *::after {
animation-duration: 0s !important;
/* 額外建議 */
transition: none !important;
scroll-behavior: auto !important;
}
}
好吧,好吧。這段代碼遠不止一行。它有一個一行版本(通過將動畫持續(xù)時間設(shè)置為零秒來移除動畫),但網(wǎng)頁上還有其他使元素移動的東西。
通過在prefers-reduced-motion媒體查詢中設(shè)置這些聲明,我們將尊重用戶選擇減少移動的意愿。這種方法有些激進,因為它移除了所有移動,這可能不一定是用戶的意圖 - 它是"減少移動"而不是"無移動"。如果適當?shù)脑挘覀內(nèi)匀豢梢愿鶕?jù)具體情況保留移動。
并排比較。左側(cè)(之前):一個圖像在網(wǎng)頁上移動。右側(cè)(之后):圖像是靜態(tài)的。
沒有動畫?沒問題!
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。