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

1. Safari 3D變換會忽略z-index的層級

在Safari瀏覽器下(此Safari瀏覽器包括iOS的Safari,iPhone上的微信瀏覽器,以及Mac OS X系統的Safari瀏覽器),當咱們使用3D transform變換的時候,若是祖先元素沒有overflow:hidden/scroll/auto等限制,則會直接忽略自身和其餘元素的z-index層疊順序設置,而直接使用真實世界的3D視角進行渲染。 例以下面的場景,圖中紅框裏面的模塊,使用 3D transform變換,進行旋轉動畫,可是在Safari瀏覽器下,忽略了二維碼遮罩層的z-index,結果使用了真實世界的3D視角進行渲染。出現了重疊的bug: GitHubcss

解決方法:
  1. 父級,任意父級,非body級別,設置overflow:hidden可恢復和其餘瀏覽器同樣的渲染。
  2. 以毒攻毒。有時候,頁面複雜,咱們不能給父級設置overflow:hidden,那麼能夠將被影響的元素設置一個足夠大的translateZ值就能夠,如translateZ(100px)。

2. 文字居中兼容

正常處理文字上下居中的手段是讓元素height和line-height相等,可是安卓環境下當字體大小<14px/0.7rem的時候會出現居中失效的狀況。html

解決方法:
  1. 判斷系統環境(安卓/IOS)分別做微調;前端

  2. font-size、height、width所有放大爲2倍,利用transform進行縮放ios

height: 1rem; 
width: 2rem; 
font-size: 0.5rem;

變成: 
height: 2rem; 
width: 4rem; 
font-size: 1rem; 
transform: scale(0.5);

但因爲放大以後佔據空間,左右會留白,須要利用margin負值 margin: -0.35rem -0.45rem 0; 調整web

  1. 有解決方案是將rem改成px。

3. 2個a標籤包裹的模塊作90度旋轉,其中一個模塊會出現點擊失靈

定義了一個動畫效果以下(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標籤,作90度的旋轉效果使得兩個a能夠循環切換展現。這裏2個的基本樣式是一致的,寬高也同樣。可是在安卓下(ios正常)只有打開頁面能看到的第一個a標籤能正常跳轉,能正常綁定事件。第二個a不能跳轉,我就想那我經過點擊事件來跳轉能夠不,結果綁定任何事件都不生效。sass

解決方法:

而後測試發現,在旋轉過程當中(只要未徹底旋轉90度)點擊仍是能一切正常的。因而把旋轉角度改成了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)。裏面也是說了這個解決方法。學習

4. 使用currentColor來簡化css

設置border-color、background-color等顏色的時候,可使用currentColor[與當前元素的字體顏色相同]來簡化css。測試

.div{
    color: rgba(0,0,0,.85);
    font-weight: 500;
    text-align: left;
    padding: 20px;
    border: solid 1px currentColor;
}

5. 利用灰色濾鏡作樣式的disable效果

灰色圖能夠直接加濾鏡,不用切多一張圖。如圖: GitHub

解決方法:
.coupon_style .disable {
-webkit-filter: grayscale(1);
}

6. 曲線陰影的實現

  • 多個陰影重疊,就是正常陰影+曲線陰影
  • 正常狀況下,有個矩形有正常的陰影,做爲主投影,這時候再定義一個有必定弧度圓角的圓角矩形,而後放在正常矩形的下面,並露出一點點底部有弧度的陰影,這樣的話就能夠造成曲線投影的效果。

效果:

GitHub 代碼: GitHub GitHub

7. 翹邊陰影的實現

利用:before和:after,加上絕對定位的性質,能夠造成一個矩形,這個時候結合CSS3的傾斜屬性skew和旋轉屬性rote。就能夠造成一個有旋轉角度的平行四邊形,這個時候再和原來的矩形重疊,則可產生翹邊效果。

效果: GitHub

代碼:

GitHub GitHub GitHub

8.利用-webkit-mask實現蒙版效果

效果圖: GitHub 代碼:

background: url("images/logo.png") no-repeat;
-webkit-mask : url("images/mask.png");

mask.png中黑色表明是不透明的(alpha:1),其餘部分爲透明的(alpha:0),將它蓋在背景圖上,注意:背景圖對應mask.png中透明的位置也會變成透明,留下非透明的形狀,即背景圖的可見形狀與mask.png的可見形狀相同。 即爲"蒙版"。

9.圖片自適應佔位方式

當圖片未正確加載,或加載完成前,因爲圖片高度爲0,其容器會由於沒有內容,致使容器沒法撐高而塌陷,而若是加載較慢則會再圖片加載完成後出現閃爍的狀況。

css中,當padding-top/bottom值爲百分比時,其值都是以其父元素的寬度爲參照對象。所以對於寬高比例固定的狀況,能夠利用padding-top/bottom用於圖片自適應佔位,解決頁面閃爍的問題。

若是僅設置值padding-top/bottom爲百分比,會出現一個問題,就是該方法容器的max-height屬性會失效,就沒法限制容器的最大高度了。

所以,能夠給容器添加一個僞元素的子元素用於撐起內容,該子元素擁有一個padding-top:100%,同時給容器一個max-height嘗試限制容器的高度,最後內容用絕對定位的方式添加便可。如:

#container{
    width: 50%;
    max-height:300px;
    background-color:#ddd;
    /*因爲margin存在塌陷的問題,須要經過構建BFC來保證容器不會受到影響,所以這裏能夠給容器一個overflow:hidden來保證僞元素的margin不會塌陷。*/
    overflow:hidden;
    position: relative; /* 父容器相對定位 */
}
.placeholder::after{
    content:"";
    display:block;
    margin-top:100%;
}
img{
    position:absolute;  /* 內容絕對定位 */
    left: 50%;
    top: 50%;      
    transform: translateX(-50%) translateY(-50%); /* 控制內容絕對定位位置 */
    width:80%;   /* 控制圖片不溢出,所以這裏使用的圖片實際寬度受父容器影響 */
}

可是對於寬高比例不定的圖片來講,這樣作可能致使圖片顯示不全,使用時要注意。

10.頁面自適應最佳實踐

通過大型項目實踐,下面這段CSS是最好的基於rem和vm和calc實踐代碼:

html {
    font-size: 16px;
}
@media screen and (min-width: 375px) {
    html {
        /* iPhone6的375px尺寸做爲16px基準,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);
    }
}

最後

  • 歡迎加我微信(winty230),拉你進技術羣,長期交流學習...
  • 歡迎關注「前端Q」,認真學前端,作個有專業的技術人...

GitHub

相關文章
相關標籤/搜索