望收藏了我寫的文章的你同時(shí)可以關(guān)注一下“小海前端”,因?yàn)檫@些文章都是連載的,并且是經(jīng)過我系統(tǒng)的歸納過的。
【技術(shù)等級(jí)】初級(jí)
【承接文章】《CSS實(shí)現(xiàn)圖片精靈,原來要這樣使用背景屬性,前端設(shè)計(jì)師必備知識(shí)》
本文小海老師為大家講解利用CSS處理HTML中的列表,也就是CSS有關(guān)列表的屬性。本文屬于前端開發(fā)的初級(jí)教程,適合于剛剛開始接觸CSS技術(shù)的學(xué)習(xí)者。
列表屬性是指可以對(duì)HTML中的<ol></ol>標(biāo)記對(duì)和<ul></ul>標(biāo)記對(duì)進(jìn)行樣式設(shè)置的屬性。這一組CSS屬性包括以下三個(gè):
list-style-type
list-style-image
list-style-position
一、設(shè)置列表的項(xiàng)目符號(hào)或編號(hào):
CSS技術(shù)使用 list-style-type 設(shè)置列表的項(xiàng)目符號(hào)或編號(hào)
在HTML中,主要操作的列表有兩種:
無序列表:用<ul></ul>標(biāo)記對(duì)實(shí)現(xiàn)。無序列表項(xiàng)中左側(cè)的標(biāo)識(shí)我們把它稱為“項(xiàng)目符號(hào)”。
有序列表:用<ol></ol>標(biāo)記對(duì)實(shí)現(xiàn)。有序列表項(xiàng)中左側(cè)的標(biāo)識(shí)我們把它稱為“編號(hào)”。
有序列表與無序列表
CSS技術(shù)利用 list-style-type 屬性來設(shè)置HTML列表左側(cè)標(biāo)識(shí)的樣式。并且在CSS看來,<ul></ul>和<ol></ol>兩個(gè)標(biāo)記對(duì)不再進(jìn)行有序和無序的區(qū)分,使用list-style-type屬性設(shè)置為哪個(gè)取值,就是對(duì)應(yīng)的哪種列表。
該屬性包括以下幾種取值:
none,列表項(xiàng)無標(biāo)記。
disc,默認(rèn)值,標(biāo)記為實(shí)心圓。
circle,標(biāo)記為空心圓。
square,標(biāo)記為實(shí)心方塊。
decimal,標(biāo)記為數(shù)字。
decimal-leading-zero,標(biāo)記為0開頭的數(shù)字(01、02、03 等)。
lower-roman,標(biāo)記為小寫羅馬數(shù)字(i、ii、iii等)。
upper-roman,標(biāo)記為大寫羅馬數(shù)字(I、II、III等)。
lower-alpha,標(biāo)記為小寫英文字母(a、b、c等)。
upper-alpha,標(biāo)記為大寫英文字母(A、B、C等)。
二、使用自定義圖片來代替項(xiàng)目符號(hào)和編號(hào):
CSS技術(shù)利用 list-style-image 屬性來設(shè)置列表左側(cè)的標(biāo)識(shí)為指定的圖片
CSS技術(shù)利用 list-style-image 屬性來設(shè)置列表左側(cè)的標(biāo)識(shí)為指定的圖片。
格式:list-style-image:url(Image_URL);
例如:ul{list-style-image:url(../images/01.jpg);}
三、設(shè)置列表中列表項(xiàng)的縮進(jìn):
CSS技術(shù)利用 list-style-position 屬性來設(shè)置列表項(xiàng)的縮進(jìn)
CSS技術(shù)利用 list-style-position 屬性來設(shè)置列表項(xiàng)的縮進(jìn)。
該屬性包括以下兩種取值:
loutside,默認(rèn)值,列表項(xiàng)不縮進(jìn)。
linside,列表項(xiàng)縮進(jìn)。
這個(gè)屬性使用在列表項(xiàng)<li></li>標(biāo)記對(duì)上的,不能用在<ol></ol>或<ul></ul>之上。
下一篇文章中,小海老師會(huì)繼續(xù)為大家向下講解CSS屬性,下一次我們講解CSS中最為重要的一組屬性:定位屬性。這是CSS中非常常用的一組屬性,希望大家千萬不要錯(cuò)過!
如果大家希望得到更加全面的關(guān)于HTML和CSS技術(shù)講解的內(nèi)容,可以私信我,我會(huì)免費(fèi)將小海老師自己編寫的HTML和CSS的PDF教材發(fā)給你,幫助你在前端開發(fā)的道路上闊步前行。
在頭條上發(fā)表的這些文章都是從前端開發(fā)的基礎(chǔ)開始一步一步講起的。我非常希望能有更多的前端開發(fā)初學(xué)者通過我寫的文章,逐步學(xué)到一定的知識(shí),甚至慢慢有了入門的感覺。這些文章都是我這幾年教學(xué)過程中的經(jīng)驗(yàn),每寫一篇時(shí)我都盡量把握好措辭,用簡單易懂的語言描述,同時(shí)精心設(shè)計(jì)版面,讓版面更加豐富,激發(fā)閱讀興趣。所以,每一篇文章可能篇幅不長,但是都要耗費(fèi)小海老師很久的時(shí)間。
希望收藏了我寫的文章的你同時(shí)可以關(guān)注一下“小海前端”,因?yàn)檫@些文章都是連載的,并且是經(jīng)過我系統(tǒng)的歸納過的。
關(guān)注“小海前端”,我會(huì)繼續(xù)為大家奉上更加深入的前端開發(fā)文章,也希望更多的初學(xué)者跟著學(xué)下去,我們共同將前端開發(fā)的路努力堅(jiān)持的走下去。
面幾篇文章我們聊了如何解析HTML標(biāo)簽,這篇文章我們聊一下解析CSS的模塊——css。
npm install css
css模塊提供了一個(gè)解析css內(nèi)容的方法parse,它返回css內(nèi)容的抽象語法樹(AST)。
圖1
圖1執(zhí)行結(jié)果如下:
圖2
parse方法還可以傳入第二個(gè)參數(shù),這個(gè)參數(shù)是個(gè)對(duì)象,它有兩個(gè)屬性,其中一個(gè)屬性是source,代表css文件的路徑,如果參數(shù)中存在source屬性,在parse方法返回的抽象語法樹結(jié)果中或者在解析報(bào)錯(cuò)時(shí)的信息中都會(huì)帶上文件的路徑。另外一個(gè)屬性是silent,如果設(shè)置了這個(gè)屬性,即使在解析中出錯(cuò),parse方法也不會(huì)拋出錯(cuò)誤。
圖3
stringify方法的第一個(gè)參數(shù)是css內(nèi)容的抽象語法樹對(duì)象,返回的結(jié)果是css內(nèi)容,此方法的作用和parse正好相反,如下圖所示。
圖4
stringify方法的第二個(gè)參數(shù)也是一個(gè)對(duì)象,對(duì)象屬性有indent、compress、sourcemap、inputSourcemaps。
indent代表輸出的css內(nèi)容的縮進(jìn),默認(rèn)是兩個(gè)空格。利用這個(gè)屬性就可以做一個(gè)css格式化工具。
圖5
compress表示css的內(nèi)容是否需要被壓縮,壓縮時(shí)會(huì)移除所有的空格和注釋。
圖6
sourcemap用于生成css的sourceMap。
圖7
圖7紅色區(qū)域中sourceMap的json串的原理是什么?不了解的同學(xué)可以參考作者之前的一篇文章《深度解析前端代碼打包過程中是如何生成sourceMap的?》,我相信一定難不倒聰明的你,這里就不再熬述了。
inputSourcemaps表示在生成sourcemap時(shí)可以讀取已存在的sourcemap引用,默認(rèn)是true。因?yàn)橛行┐虬玫腸ss文件中已經(jīng)存在了sourcemap的引用,所以在解析時(shí)這個(gè)模塊會(huì)自動(dòng)讀取map信息。
在作者看來,AST是前端皇冠上的明珠,就像發(fā)動(dòng)機(jī)之于飛機(jī),石油之于工業(yè)。有了AST,前端的頁面可以在瀏覽器上渲染出來,有了AST,就可以自由的開發(fā)自己的框架。它即很重要,卻也很難掌握,所以這個(gè)知識(shí)點(diǎn)放在以后講。
本文主要分享了一個(gè)css的解析模塊,那它到底有什么用呢?我們平常用的語法校驗(yàn)、格式校驗(yàn)、sourcemap等都和它相關(guān),所以如果需要開發(fā)一個(gè)和css相關(guān)的node工具,就可以考慮使用這個(gè)模塊。
喜歡我的文章就關(guān)注我吧,有問題可以發(fā)表評(píng)論,我們一起學(xué)習(xí),共同成長!
前端界面顯示的速度一般要求是:60fps
10ms中處理的流程為:
javascript > style > layout > paint > composite
如果JS的操作影響到了界面樣式的變化,則有上面的處理流程
如果style的操作影響到布局,則會(huì)進(jìn)入layout,反之亦然;style改了transform屬性,在blink和edge瀏覽器里面不需要layout和paint
避免head標(biāo)簽JS堵塞
異步加載JS: HTML5 的script 屬性 defer
JS寫在body后面
Tips: 可能有時(shí)候JS庫,還沒加載完就要執(zhí)行了,可能會(huì)報(bào)錯(cuò)
減少 head 中的 CSS 資源
CSS 會(huì)影響到 layout ,寫在Body里面會(huì)界面閃爍,但寫在Head里面如果太多會(huì)影響渲染
不要寫太多base64,雖然很方便,但會(huì)改變文件大小
如果CSS文件沒有達(dá)到三位數(shù)的大小,可以直接寫到Html界面中,因?yàn)槿绻褂猛怄湗邮剑瑒t可能會(huì)花費(fèi)更多時(shí)間,如DNS解析,建立鏈接,下載等
優(yōu)化圖片,使用響應(yīng)式圖片,圖片的srcset 屬性,會(huì)有兼容問題
<img srcset='photo_w350.jpg 1x photo_w640.jpg 2x' src='phtot_w350.jpg' alt=''>
使用picture按需加載,需要寫在HTML中,如果使用JS來調(diào)用,則無效
<picture>
<source srcset='baner_w1000.jpg' media="(min-width:801px)"> # source 還有其它的優(yōu)化屬性,不過會(huì)有兼容問題: type='image/webp'
<source srcset='baner_w800.jpg' media="(max-width:800px)">
<img src='baner_w800.jpg' alt=''> # picture 必需有 img 標(biāo)簽,只有img標(biāo)簽才會(huì)觸發(fā)onload事件; picture 與 source 都不觸發(fā) layout
</picture>
判斷瀏覽器是否支持:
var supportSrcset = 'srcset' in document.createElement('img');
var surportPicture = 'HTMLPictureElement' in window;
延遲加載
<picture>
<source data-srcset="photo_w350.jpg 1x, photo_w640.jpg 2x">
<img data-src="photo_w350.jpg" src="about:blank" alt=""> # src 寫為此值不會(huì)報(bào)錯(cuò),也對(duì)瀏覽器友好
</picture>
監(jiān)聽Scroll事件
showImage(leftSpace = 500){
var scrollTop = $window.scrollTop(), $containers = this.$imgContainers, scrollPosition = $window.scrollTop() + $window.height();
for(var i = 0; i < $containers.length; i++){
//如果快要滑到圖片的位置了
var $container = $containers.eq(i);
if($container.offset().top - scrollPosition < leftSpace) {
this.ensureImgSrc($container);
}
}
}
ensureImgSrc($container) {
var $source = $container.find("source");
if($source.length && !$source.attr("srcset")){
$source.attr("srcset", $source.data("srcset"));
}
var $img = $container.find("img:not(.loading)");
if($img.length && $img.attr("src").indexOf("http://") < 0){
$img.attr("src", $img.data("src"));
this.shownCount++;
}
}
init(){
//初始化
var leftSpace = 0;
this.showImage(leftSpace);
//滑動(dòng)
$window.on("scroll", this, this.throttleShow);
}
ensureImgSrc($container){
//如果全部顯示,off掉window.scroll
if(this.shownCount >= this.allCount){
$window.off("scroll", this.throttleShow);
}
}
指定圖片尺寸,避免 reflow
作用
第一個(gè)是把200變成304,避免資源重新傳輸,
第二個(gè)是讓瀏覽器直接從緩存取,連http請求都不用了,這樣對(duì)于第二次訪問頁面是極為有利的。
開啟壓縮 gzip
server {
gzip on;
gzip_types text/plain application/javascript application/x-javascript text/html text/css text/xml text/javascript
}
緩存 Cache-Control
location ~* \.(jpg|gif|png|webp) {
expires 30d;
}
location ~* \.(css|js) {
expires 1d;
}
此方法會(huì)在返回的請求響應(yīng)頭中添加 Cache-Control: max-age=604800 , 且 max-age 的優(yōu)先級(jí)會(huì)大于 last-modified
開啟 nginx last-modified 字段,在響應(yīng)頭中: last-modified 字段接收nginx的數(shù)據(jù),在請求頭中: If-Modified-Since 字段返回給nginx
這個(gè)辦法得查手冊
使用etag,在響應(yīng)頭中是: Etag 字段 ,在請求頭中會(huì)記錄在 If-None-Match 字段
server {
etag on;
}
DNS預(yù)讀取
<link rel="dns-prefection" > # 在Head標(biāo)簽中添加相應(yīng)的域名,由于它是并行的,不會(huì)堵塞頁面渲染
HTML優(yōu)化
刪除注釋、縮進(jìn),除了 pre 或 code 這樣的標(biāo)簽不能刪除,其它的都可以
代碼優(yōu)化
例如說html別嵌套太多層,否則加重頁面layout的壓力
CSS的選擇器別寫太復(fù)雜,不然匹配的計(jì)算量會(huì)比較大
JS的濫用閉包,閉包會(huì)加深作用域鏈,加長變量查找的時(shí)間
代替圖片 或 LocalStorage、 Offline Storage
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。