學習硬注重原理,才能在瞬息萬變技術行業站穩腳跟!
接著上一篇文章,今天把剩下的乾貨補全
7. 平行四邊形
有沒有辦法只讓容器的形狀傾斜而保持其內容不變呢?或許你會想到嵌套兩層元素,外層skew(),對內容在應用一次反相skew變形,從而抵消變形的效果。但是意味著我們不得不使用一層額外的HTML元素包裹內容.有些累贅
解決方案:偽元素,把樣式應用到偽元素上,對偽元素進行變形,再把偽元素定位+層級放到到住宿元素下面
光說不練,假把式試一試
8. 梯形標籤頁
在網頁中我們經常見到梯形形狀的標籤頁,常見的技巧都是比較雜亂,或者說難以維護的,那他們是如何實現的呢?
解決方案: 三維世界中旋轉一個矩形,由於透視關係,我們在二維圖像上看到一個梯形,再結合平行四邊實現的方法便能實現
perspective: 觀察者與z=0平面的距離;
對元素使用了3D變形之後,其內部的變形效應是"不可逆轉的",和2D變形不同(2D變形內部的逆向變形可以抵消外部的變形效應);
為了讓他的尺寸更好掌握,我們可以為他指定transform-origin:bottom;也可用scale()對他在進行美觀操作;
試一試
9. 簡單的餅圖
餅圖在網頁中的運用極為常見,比如簡單的統計表,進度指示器,如果我們不用圖像處理器,和JavaScript,那要如何去實踐呢?
解決方案:偽元素,變形屬性和css漸變實現
1.把這個元素設置為一個圓形;
2.用一個簡單線性漸變來把圖像的有半部分設為其他顏色
3.用偽元素覆蓋到這個元素的漸變區域上面去(看起來這個元素和第一步效果一樣),通過旋轉來決定漏出多大扇區;
4.transform屬性旋轉一定的角度
如果我們想要看到一個靜態的不同比率的餅狀圖哪有如何解決呢?
解決方案:很簡單,我們只需將上面用到的那個動畫處於暫停狀態就好了
animation-play-state: paused;
animation-delay: 設置為負;負的動畫延時,讓動畫一開始就直接跳至設置的時間點。即負負得正;
10. 自適應內部元素
如果不給一個元素指定具體的height,他就會自動適應其內容的高度,如果我們希望width也具有類似的行為該怎麼實現呢??
解決方案: css內部與外部尺寸模型:min-content
理解CSS3 max/min-content及fit-content等width值
min-content:寬度表示的並不是內部那個寬度小就是那個寬度,而是,採用內部元素最小寬度值最大的那個元素的寬度作為最終容器的寬度。
首先,我們要明白這裡的“最小寬度值”是什麼意思。替換元素,例如圖片的最小寬度值就是圖片呈現的寬度,對於文本元素,如果全部是中文,則最小寬度值就是一箇中文的寬度值;如果包含英文,因為默認英文單詞不換行,所以,最小寬度可能就是裡面最長的英文單詞的寬度。So,大家明白的說。
11. 滿幅的背景,定寬的內容
類似的佈局我們在網頁中經常遇見,通常是在頁腳和導航;如果我們只使用一個元素該如實現這個效果呢?
解決方案:calc()函數
margin:0 auto;所產生的左右外邊距實際上都等於視口寬度的一半減去內容寬度的一半;
因此我們可以使用 padding:0 calc(50%-width/2);
12. 垂直居中
在css中對元素進行水平居中垂直居中,我們在頁面佈局的時候會經常用到。相信每個人都有一套自己實現的方式;
我想介紹一下FlexBox的解決方案
display: flex;
align-items:垂直方向上的對齊方式;
justify-content:水平方向上的對齊方式;
試一試我推薦的方案吧!試一試
13. 緊貼底部的頁腳
一個具有塊級樣式的頁腳,當頁面內容足夠長時他一切正常,但是當頁面比較短時,就會出現問題;頁腳就不能像我們期望中那樣緊貼在視口的最底部,而是在內容的下方
解決方案:flex彈性佈局
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。後兩個屬性可選。
flex-grow:定義項目的放大比例。默認0,不放大。1等分剩餘空間
flex-shrink:項目的縮小比例默認為1,如果空間不足,等比縮小
flex-basis:項目佔據主軸空間
試一試
14. 緩動效果
給過渡和動畫加上緩動效果是一種流行的表現手法,可以讓界面顯得更加生動和真實,但是在現實世界中,物體從a到b點的移動往往不是 完全勻速的,因此我們需要對動畫效果加以調整,使得更加逼真
解決方案:我們可以用animation-timing-function的調速函數和反向版本,模擬現實世界的速度變化css的transform只對塊級元素有用
如果是反反覆覆的循環函數,我們也可以用可用animation-direction來反轉循環的週期函數;
animation-directon: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;
15. 逐幀動畫
有時候我們想要實現連續的動畫幀,動畫幀之間然不需要過渡的狀態。而我們在實現中往往會失敗?
解決方案:steps()會根據你指定的步數量,把整個動畫切分為多個針,而且整個動畫幀與幀之間硬切,不會有任何過渡效果
step-start和step-end是steps(1,start)和steps(1,end)的簡寫;
16. 沿環形平移的動
當一個元素沿著環形進行移動的同時,我們希望它能保存自己原本的的朝向。那我們該如何去實現呢?或許你已經有了你的方法啦!但我的方法可能會比你的更加優化
我們可以用前面介紹的嵌套的兩層相互抵消,用內層的變形來抵消外層變形的效果;即兩層的旋轉方向相反;
但是這樣還不是特別理想,如果只用一個元素那要怎麼去實現呢?
transform-origin只是一個語法糖,實際上你總是可以用translate()來代替;變形函數並不是孤立存在;如下圖可證實:
17. 自定義複選框
我們對於美得追求是永無止境的,但是複選框,單選框的樣式的樣式總是不如我們如意。雖然js能夠實現效果,但是代碼停臃腫。那我們有什麼去實現呢?
解決方案::checked偽類,這個偽類只有在複選框被勾選時才會匹配,不論是由用戶交互觸發,還是有腳本觸發
當< label > 元素與複選框關聯之後,可以起到觸發開關的作用
label 不是複選框那樣的替換元素,我們可以為他添加生成性內容(偽元素),並基於複選框的狀態來為其設置樣式,然後把真正的複選框隱藏起來(但不能把它從tab鍵切換焦點的隊列中完全刪除),再生成性內容美化一番,用來頂替原來的複選框!
可替換元素就是瀏覽器根據元素的標籤和屬性,來決定元素的具體顯示內容
閱讀更多 熱愛代碼勝過愛我自己 的文章