selector是基于DOM結構文檔內的靜態(tài)條件,而pseudo-class 是DOM之外的動態(tài)條件,比如 按鍵/鼠標做出動作時需要css樣式變化,就需要用pseudo-class表現.
例子很大,我放個鏈接
鏈接描述
就是一個統(tǒng)計復選框目前被選擇個數的問題。其中css我貼在下面:
body {
counter-reset: icecream;
}
input:checked {
counter-increment: icecream;
}
.total::after {
content: counter(icecream);
}
接下來是我學習過程中遇到的問題和我自己猜想的答案,因為實在找不到解釋,于是請教
代碼執(zhí)行結果:checkbox被選中后,計數器會自動增加。很奇怪為什么計數器可以被鼠標事件所影響?這又不是js.仔細分析以下流程:
'checked'與'counter-increment'做了因果連接,每當input:checked被觸發(fā)(即出現一個復選框被選擇事件)都會應用一次后面的{樣式},但此樣式并不是對目標元素的樣式渲染,它的內容是'計數器啟動'。.total::after {content: counter(icecream);}此句負責將計數器的結果顯示出來,且利用的是計數器每啟動一次,值會變化一次的功能。于是得到了一個連帶因果關系:復選框被選擇——觸發(fā)計數器——計數器值增加——content顯示的值變化。
取消一個復選框,計數器結果也會減少一次,why?? 按照計數器的原理,'counter-increment'每被觸發(fā)一次皆會使最終content:counter()結果+1,而一旦觸發(fā)'結果+1',以后不管怎樣都不會變回原來值了,除非你強行中途修改'步長=-1',讓它負增長,但這是不可能的。那怎樣解釋:選中復選框——計數器+1;取消復選框——計數器-1 ??
我想還是從原定義入手解釋,答案就在'pseudo-class是DOM之外的動態(tài)條件'這句話上。pseudo-class是一種獨立于DOM的動態(tài)存在,它并不改變DOM結構,它可以解釋為緩存:需要它生效,就觸發(fā)它,它就存在于緩存中了;不需要它生效,取消它,于是就在緩存中抹除它/回溯上一個動態(tài)狀態(tài)。
那么回頭來解釋本例:取消復選框相當于回溯前一個狀態(tài)(即未選中復選框時狀態(tài)),既然回到了'還沒選中復選框'的前狀態(tài),那么計時器也就還沒被觸發(fā),最后的計數器也就回到沒有+1的狀態(tài)。 也就是說,'取消復選框,計數器-1實質上是不存在也不可能的,實際發(fā)生的是回檔到前一個狀態(tài)而已。
以上是我自己問自己答的過程,不知道對不對,盼望高手指點~
嗨,這個跟偽類和偽元素沒有關系,counter-increment 跟其它 CSS 屬性一樣都是遵循層疊原則,瀏覽器根據這些原則生成 CSSOM 樹。counter() 只不過是說“我這里需要得到某個 counter 的層疊結果”而已。不必想象成 JS 而應該跟其它 CSS 屬性一樣思考。
如
<body style="color: red; font-size: 12px;">
<span style="color: blue">Text</span>
</body>
那么 span 得到的層疊結果是
span {
??color: blue;
}
body {
??color: red;
??font-size: 12px;
}
同樣,當使用 counter() 的時候,也是這么層疊收集來得到結果。所以當層疊下來沒有 counter-increment 的時候,自然就不會被收集到。
怎么理解都行,只要自己會用就好。
不過,一個更硬核的解釋是,與命令式的JS不同,CSS被設計為聲明式的,所以天生就支持響應式渲染。響應式渲染會追蹤每個變量(或者說狀態(tài)),并且在變量改變時自動刷新下游的依賴項。具體到CSS,它會追蹤每個元素是不是checked(而不是追蹤change事件),并且按照“是不是checked”自動刷新counter。
考慮background
input:checked {
background: black;
}
checked的時候背景會變黑,取消復選框就會變成原來的顏色,但是我并沒有寫input.style.background = 'xxx'呀?甚至連'xxx'是什么都不知道?如果能理解這個,也就能理解counter了。
所以,在概念上并不存在一個獨立的CSS緩存。相反,響應式渲染在設計上是完全不含任何狀態(tài)的,所有狀態(tài)都集中保存在dom里,CSS只是追蹤了dom狀態(tài)然后實時響應。如果講得再深入一點的話,響應式渲染解決的是老大難的狀態(tài)同步問題,所以在理念上是不會再引出一個新的狀態(tài)把水攪得更混的。當然,實現上可能用的是計數器-1,也可能是回檔到前一個狀態(tài),不過這應該不是我們需要關心的事。
不太清楚題主有沒有用過Vue或者React之類的框架。如果試一下的話,能對響應式渲染有更深入的理解。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。