暑假實習的時候帶個人師傅,告訴我要注重基礎,底層實現原理。才能在突飛猛進的技術行業站住腳跟,以不變應萬變,萬丈高樓平地起,因此咱們應該不斷的去學習,去交流。交流,不該該僅僅停留在技術方面,更多的應該是在思惟方式。語言只是一種工具,編程的思想纔是核心。咱們只有在明白了編程的思想以後,才能去創造屬於本身的東西,隨意切換。授之以魚不如授之以漁。在咱們的時代應該是去創造而不是模仿。回到學校以後,我開始我學習的新旅程;讀一本好書亦如交一個有趣的朋友。最近讀了一本《CSS揭祕》,裏面有不少有意思的CSS技巧,有時間有興趣的朋友能夠去讀讀這本書,讀完以後咱們能夠一塊兒交流,學習,一塊兒解答你個人迷惑知識點,期待和你的交流。讀完這本書的時候我也對書中的知識點進行了總結概括:css
本文全部連接均來自《CSS揭祕》,內容基本都來自原書html
歡迎交流sunseekerscss3
爲何說能使用html/css解決的問題就不要使用JS呢?兩個字,由於簡單。簡單就意味着更快的開發速度,更小的維護成本,同時每每具備更好的體驗;下面我介紹哪些或許你不知道css小技巧。git
你還在用多個元素層層包裹來模擬多重邊框嗎?不,我在用僞元素實現,哈哈。可是她們都須要咱們添加額外的元素,或者大量的代碼來污染咱們的結構github
解決方案:box-shadow,outline編程
- box-shadow: 向框添加一個或多個陰影;
inset : 默認陰影在邊框外。
使用inset後,陰影在邊框內(即便是透明邊框),背景之上內容之下。瀏覽器offset-x,offset-y :
這是頭兩個 length 值,用來設置陰影偏移量。offset-x 設置水平偏移量,若是是負值則陰影位於元素左邊。 offset-y 設置垂直偏移量,若是是負值則陰影位於元素上面。可用單位請查看 length 。
若是二者都是0,那麼陰影位於元素後面。這時若是設置了 blur-radius 或 spread-radius 則有模糊效果。ideblur-radius : 這是第三個 length 值。值越大,模糊面積越大,陰影就越大越淡。 不能爲負值。默認爲0,此時陰影邊緣銳利。wordpress
spread-radius : 這是第四個 length 值。取正值時,陰影擴大;取負值時,陰影.收縮。默認爲0,此時陰影與元素一樣大。函數
color:邊框的 color 。若是沒有指定,則由瀏覽器決定——一般是color的值,不過目前Safari取透明。
若是你只須要兩層,那就能夠設置一層常規的邊框,再加上outline(描邊)屬性來產生內外層邊框;
例如咱們常見的:
outline: 是用來設置一個或多個單獨的輪廓屬性的簡寫屬性 , 例如 outline-style, outline-width 和 outline-color;輪廓不佔據空間,它們被描繪於內容之上
outline-offset: 一個元素邊緣或邊框之間的間隙;
有時候咱們想把一副圖案應用爲邊框,而不是背景?你或許會想到border-image,可是行不通,border-image他的原理基本上就是九宮格伸縮法,把圖片切割成九塊,而後把她們應用到元素邊框相應的邊和角
border-image的工做原理:
效果圖如上所示:
解決方案:css漸變和背景的擴展,在背景圖之上在加一層純色實色背景,給兩層背景指定不一樣的background-clip;
漸變是能夠和背景圖片一塊兒使用的,並且背景圖片的預發和平時的寫法是同樣的。並且寫在前面的優先級會比較高,會蓋在後面的圖片上面
有沒有辦法只讓容器的形狀傾斜而保持其內容不變呢?或許你會想到嵌套兩層元素,外層skew(),對內容在應用一次反相skew變形,從而抵消變形的效果。可是意味着咱們不得不使用一層額外的HTML元素包裹內容.有些累贅
解決方案:僞元素,把樣式應用到僞元素上,對僞元素進行變形,再把僞元素定位+層級放到到住宿元素下面
光說不練,假把式試一試
在網頁中咱們常常見到梯形形狀的標籤頁,常見的技巧都是比較雜亂,或者說難以維護的,那他們是如何實現的呢?
解決方案: 三維世界中旋轉一個矩形,因爲透視關係,咱們在二維圖像上看到一個梯形,再結合平行四邊實現的方法便能實現
perspective: 觀察者與z=0平面的距離;
對元素使用了3D變形以後,其內部的變形效應是"不可逆轉的",和2D變形不一樣(2D變形內部的逆向變形能夠抵消外部的變形效應);
爲了讓他的尺寸更好掌握,咱們能夠爲他指定transform-origin:bottom;也可用scale()對他在進行美觀操做;
img src='img/tix.png'/>餅圖在網頁中的運用極爲常見,好比簡單的統計表,進度指示器,若是咱們不用圖像處理器,和JavaScript,那要如何去實踐呢?
解決方案:僞元素,變形屬性和css漸變實現
1.把這個元素設置爲一個圓形;
2.用一個簡單線性漸變來把圖像的有半部分設爲其餘顏色
3.用僞元素覆蓋到這個元素的漸變區域上面去(看起來這個元素和第一步效果同樣),經過旋轉來決定漏出多大扇區;
4.選擇任意角度
若是咱們想要看到一個靜態的不一樣比率的餅狀圖哪有如何解決呢?
解決方案: 很簡單,咱們只需將上面用到的那個動畫處於暫停狀態就行了
animation-play-state: paused;
animation-delay: 設置爲負;負的動畫延時,讓動畫一開始就直接跳至設置的時間點。即負負得正;
margin:0 auto;所產生的左右外邊距實際上都等於視口寬度的一半減去內容寬度的一半;
所以咱們可使用margin:0 calc(50%-width/2);
若是你以爲還有疑慮的話:試一試
一個具備塊級樣式的頁腳,當頁面內容足夠長時他一切正常,可是當頁面比較短時,就會出現問題;頁腳就不能像咱們指望中那樣緊貼在視口的最底部,而是在內容的下方
解決方案:flex彈性佈局
- flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲0 1 auto。後兩個屬性可選。
flex-grow:定義項目的放大比例。默認0,不放大。1等分剩餘空間
flex-shrink:項目的縮小比例默認爲1,若是空間不足,等比縮小
flex-basis:項目佔據主軸空間
給過渡和動畫加上緩動效果是一種流行的表現手法,可讓界面顯得更加生動和真實,可是在現實世界中,物體從a到b點的移動每每不是 徹底勻速的,所以咱們須要對動畫效果加以調整,使得更加逼真
解決方案:咱們能夠用animation-timing-function的調速函數和反向版本,模擬現實世界的速度變化css的transform只對塊級元素有用
若是是反反覆覆的循環函數,咱們也能夠用可用animation-direction來反轉循環的周期函數;
animation-direction:reverse;反轉每個循環週期;
animation-direction:alternate;反轉第偶數循環週期;
animation-direction:alternate-reverse;反轉第奇循環週期;
首先介紹一下animation-timing-function
animation-timing-function:屬性定義CSS動畫在每一動畫週期中執行的節奏。可能值爲一或多個;(ease-in,ease-out,ease-in-out,linear,steps(),cubic-bezier());
cubic-bezier()函數,容許咱們指定自定義調速函數;cubic-bezier(x1,y1,x2,y2);(x1,y1)表示第一個-P1控制錨點的座標,(x2,y2),表示第二個-P2;曲線的片斷分別固定在(0,0)-P0起點,(1,1)-P4終點;
咱們須要關注的是 P1 和 P2 兩點的取值,而其中 X 軸的取值範圍是 0 到 1,當取值超出範圍時 cubic-bezier 將失效;Y 軸的取值沒有規定,固然也毋須過大。
把控制錨點的水平座標和垂直座標互換,就能夠獲得任何調速函數的反向版本
steps():是一個階躍函數,用於把整個操做領域切分爲相同大小的間隔,每一個間隔都是相等的。
steps 第一個參數指定了時間函數中的間隔數量(必須是正整數);第二個參數可選,接受 start 和 end 兩個值,指定在每一個間隔的起點或是終點發生階躍變化,默認爲 end。
彈跳動畫,球體自由落體運動,在降低的過程當中勻加速咱們可用ease-out;彈起方向是勻減速咱們可用ease-in;
動手看效果吧!試一試
當一個元素沿着環形進行移動的同時,咱們但願它能保存本身本來的的朝向。那咱們該如何去實現呢?或許你已經有了你的方法啦!但個人方法可能會比你的更加優化
咱們能夠用前面介紹的嵌套的兩層相互抵消,用內層的變形來抵消外層變形的效果;即兩層的旋轉方向相反;
動手看效果吧!試一試
可是這樣還不是特別理想,若是隻用一個元素那要怎麼去實現呢?
transform-origin只是一個語法糖,實際上你老是能夠用translate()來代替;變形函數並非孤立存在;以下圖可證明:
這個原理我目前還不是特別可以理解,但你能夠試試
試一試
解決方案::checked僞類,這個僞類只有在複選框被勾選時纔會匹配,不管是由用戶交互觸發,仍是有腳本觸發
當< label > 元素與複選框關聯以後,能夠起到觸發開關的做用
label 不是複選框那樣的替換元素,咱們能夠爲他添加生成性內容(僞元素),並基於複選框的狀態來爲其設置樣式,而後把真正的複選框隱藏起來(但不能把它從tab鍵切換焦點的隊列中徹底刪除),再生成性內容美化一番,用來頂替原來的複選框!
可替換元素就是瀏覽器根據元素的標籤和屬性,來決定元素的具體顯示內容
- 例如瀏覽器會根據標籤的src屬性的值來讀取圖片信息並顯示出來,而若是查看(x)html代碼,則看不到圖片的實際內容;又例如根據< input >標籤的type屬性來決定是顯示輸入框,仍是單選按鈕等。