能讓你受益匪淺的10個css使用技巧

點擊上方藍(lán)色字體,關(guān)注我啦~~
◆◆CSS技巧大雜燴◆◆
01?Safari 中z-index的層級問題
在Safari瀏覽器下(此Safari瀏覽器包括iOS的Safari,iPhone上的微信瀏覽器,以及Mac OS X系統(tǒng)的Safari瀏覽器),當(dāng)我們使用3D transform變換的時候,如果祖先元素沒有overflow:hidden/scroll/auto等限制,則會直接忽略自身和其他元素的z-index層疊順序設(shè)置,而直接使用真實世界的3D視角進(jìn)行渲染。例如下面的場景,圖中紅框里面的模塊,使用 3D transform變換,進(jìn)行旋轉(zhuǎn)動畫,但是在Safari瀏覽器下,忽略了二維碼遮罩層的z-index,結(jié)果使用了真實世界的3D視角進(jìn)行渲染。出現(xiàn)了重疊的bug:

解決方法:
- 父級,任意父級,非body級別,設(shè)置overflow:hidden可恢復(fù)和其他瀏覽器一樣的渲染。
- 以毒攻毒。有時候,頁面復(fù)雜,我們不能給父級設(shè)置overflow:hidden,那么可以將被影響的元素設(shè)置一個足夠大的translateZ值就可以,如translateZ(100px)。
正常處理文字上下居中的手段是讓元素height和line-height相等,但是安卓環(huán)境下當(dāng)字體大小<14px/0.7rem的時候會出現(xiàn)居中失效的情況。
解決方法:
判斷系統(tǒng)環(huán)境(安卓/IOS)分別作微調(diào);
font-size、height、width全部放大為2倍,利用transform進(jìn)行縮放
height: 1rem;
width: 2rem;
font-size: 0.5rem;
變成:
height: 2rem;
width: 4rem;
font-size: 1rem;
transform: scale(0.5);但由于放大之后占據(jù)空間,左右會留白,需要利用margin負(fù)值 margin: -0.35rem -0.45rem 0;調(diào)整
- 有解決方案是將rem改為px。
定義了一個動畫效果如下(sass代碼):
@keyframes official-featured_rotate {
10%,50%{
transform:rotateY(90deg);
}
60%,100%{
transform:rotateY(0deg);
}
}
&-rotate {
position: absolute;
width: rem(350/2);
height: rem(160/2);
transform-style:preserve-3d;
transform:translate3d(0,0,0);
&.ani_rotate {
animation:official-featured_rotate 5s linear 0s infinite;
animation-delay: 2s;
}
&__item {
width: rem(350/2);
height: rem(160/2);
position: absolute;
&:nth-child(1) {
transform: translateZ(rem(350/4));
}
&:nth-child(2) {
transform: rotateY(90deg) translate3d(0,0,rem(350/4));
}
}
}
這里是2個a標(biāo)簽,做90度的旋轉(zhuǎn)效果使得兩個a可以循環(huán)切換展示。這里2個的基本樣式是一致的,寬高也一樣。但是在安卓下(ios正常)只有打開頁面能看到的第一個a標(biāo)簽?zāi)苷LD(zhuǎn),能正常綁定事件。第二個a不能跳轉(zhuǎn),我就想那我通過點擊事件來跳轉(zhuǎn)可以不,結(jié)果綁定任何事件都不生效。
解決方法:
然后測試發(fā)現(xiàn),在旋轉(zhuǎn)過程中(只要未完全旋轉(zhuǎn)90度)點擊還是能一切正常的。于是把旋轉(zhuǎn)角度改為了89.99度,一切正常。動畫效果修改為:
@keyframes official-featured_rotate {
10%,50%{ ?
? ? ?transform:rotateY(-89.99deg); ?
? ?}
? ?60%,100%{ ?
? ? ?transform:rotateY(0deg); ?
? ?} ?
}后來查找了一下stackoverflow(https://stackoverflow.com/questions/23548612/cant-click-on-buttons-after-css-transform)。里面也是說了這個解決方法。
04使用currentColor來簡化css設(shè)置border-color、background-color等顏色的時候,可以使用currentColor[與當(dāng)前元素的字體顏色相同]來簡化css。
.div{
color: rgba(0,0,0,.85);
font-weight: 500;
text-align: left;
padding: 20px;
border: solid 1px currentColor;
}
05灰色濾鏡做樣式的disable
灰色圖可以直接加濾鏡,不用切多一張圖。如圖:
解決方法:
.coupon_style .disable {
-webkit-filter: grayscale(1);
}06?曲線陰影的實現(xiàn)- 多個陰影重疊,就是正常陰影+曲線陰影
- 正常情況下,有個矩形有正常的陰影,作為主投影,這時候再定義一個有一定弧度圓角的圓角矩形,然后放在正常矩形的下面,并露出一點點底部有弧度的陰影,這樣的話就可以形成曲線投影的效果。
效果:

代碼:

利用:before和:after,加上絕對定位的性質(zhì),可以形成一個矩形,這個時候結(jié)合CSS3的傾斜屬性skew和旋轉(zhuǎn)屬性rote。就可以形成一個有旋轉(zhuǎn)角度的平行四邊形,這個時候再和原來的矩形重疊,則可產(chǎn)生翹邊效果。
效果:




效果圖:

background: url("images/logo.png") no-repeat;-webkit-mask : url("images/mask.png");
mask.png中黑色代表是不透明的(alpha:1),其他部分為透明的(alpha:0),將它蓋在背景圖上,注意:背景圖對應(yīng)mask.png中透明的位置也會變成透明,留下非透明的形狀,即背景圖的可見形狀與mask.png的可見形狀相同,即為"蒙版"。
09圖片自適應(yīng)占位方式當(dāng)圖片未正確加載,或加載完成前,由于圖片高度為0,其容器會因為沒有內(nèi)容,導(dǎo)致容器無法撐高而塌陷,而如果加載較慢則會在圖片加載完成后出現(xiàn)閃爍的情況。
css中,當(dāng)padding-top/bottom值為百分比時,其值都是以其父元素的寬度為參照對象。因此對于寬高比例固定的情況,可以利用padding-top/bottom用于圖片自適應(yīng)占位,解決頁面閃爍的問題。
如果僅設(shè)置值padding-top/bottom為百分比,會出現(xiàn)一個問題,就是該方法容器的max-height屬性會失效,就無法限制容器的最大高度了。
因此,可以給容器添加一個偽元素的子元素用于撐起內(nèi)容,該子元素?fù)碛幸粋€padding-top:100%,同時給容器一個max-height嘗試限制容器的高度,最后內(nèi)容用絕對定位的方式添加即可。如:
#container{
width: 50%;
max-height:300px;
background-color:#ddd;
/*由于margin存在塌陷的問題,需要通過構(gòu)建BFC來保證容器不會受到影響,因此這里可以給容器一個overflow:hidden來保證偽元素的margin不會塌陷。*/
overflow:hidden;
position: relative; /* 父容器相對定位 */
}
.placeholder::after{
content:"";
display:block;
margin-top:100%;
}
img{
position:absolute; /* 內(nèi)容絕對定位 */
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%); /* 控制內(nèi)容絕對定位位置 */
width:80%; /* 控制圖片不溢出,因此這里使用的圖片實際寬度受父容器影響 */
}
但是對于寬高比例不定的圖片來說,這樣做可能導(dǎo)致圖片顯示不全,使用時要注意。
經(jīng)過大型項目實踐,下面這段CSS是最好的基于rem和vm和calc實踐代碼:
html {
font-size: 16px;
}
@media screen and (min-width: 375px) {
html {
/* iPhone6的375px尺寸作為16px基準(zhǔn),414px正好18px大小, 600 20px */
font-size: calc(100% + 2 * (100vw - 375px) / 39);
font-size: calc(16px + 2 * (100vw - 375px) / 39);
}
}
@media screen and (min-width: 414px) {
html {
/* 414px-1000px每100像素寬字體增加1px(18px-22px) */
font-size: calc(112.5% + 4 * (100vw - 414px) / 586);
font-size: calc(18px + 4 * (100vw - 414px) / 586);
}
}
@media screen and (min-width: 600px) {
html {
/* 600px-1000px每100像素寬字體增加1px(20px-24px) */
font-size: calc(125% + 4 * (100vw - 600px) / 400);
font-size: calc(20px + 4 * (100vw - 600px) / 400);
}
}
@media screen and (min-width: 1000px) {
html {
/* 1000px往后是每100像素0.5px增加 */
font-size: calc(137.5% + 6 * (100vw - 1000px) / 1000);
font-size: calc(22px + 6 * (100vw - 1000px) / 1000);
}
}推薦閱讀
我的公眾號能帶來什么價值?(文末有送書規(guī)則,一定要看)
每個前端工程師都應(yīng)該了解的圖片知識(長文建議收藏)
為什么現(xiàn)在面試總是面試造火箭?

