1. 程式人生 > >10個讓你受益匪淺的css使用技巧

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:

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

2. 文字居中相容

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

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

  2. font-size、height、width全部放大為2倍,利用transform進行縮放
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;調整

  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不能跳轉,我就想那我通過點選事件來跳轉可以不,結果繫結任何事件都不生效。

解決方法:

然後測試發現,在旋轉過程中(只要未完全旋轉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效果

灰色圖可以直接加濾鏡,不用切多一張圖。如圖:

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

6. 曲線陰影的實現

  • 多個陰影重疊,就是正常陰影+曲線陰影
  • 正常情況下,有個矩形有正常的陰影,作為主投影,這時候再定義一個有一定弧度圓角的圓角矩形,然後放在正常矩形的下面,並露出一點點底部有弧度的陰影,這樣的話就可以形成曲線投影的效果。

效果:


程式碼:

7. 翹邊陰影的實現

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

效果:

程式碼:



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

效果圖:

程式碼:

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」,認真學前端,做個有專業的技術人...

相關推薦

10受益匪淺css使用技巧

1. Safari 3D變換會忽略z-index的層級 在Safari瀏覽器下(此Safari瀏覽器包括iOS的Safari,iPhone上的微信瀏覽器,以及Mac OS X系統的Safari瀏覽器),當我們使用3D transform變換的時候,如果祖先元素沒有overflow:hidden/scroll/

告訴10MySQL資料庫的小技巧

無論是運維、開發、測試,還是架構師,資料庫技術是一個必備加薪神器,那麼,一直說學習資料庫、學MySQL,到底是要學習它的哪些東西呢? 1、如何快速掌握MySQL? 培養興趣   興趣是最好的老師,不論學習什麼知識,興趣都可以極大地提高學習效率。當然學習MySQL 5.6也不例外。   夯

10分鐘快速掌握Excel的16項重要技巧

大家在日常生活、工作使用Excel時,是不是總會遇到很多問題呢? 不小心將檔案命名錯了,要一個個改? 檔案裡只需要資料卻不知道怎麼提取? 工作彙報要做資料彙總、需要插入大量圖片怎麼辦? 甚至在耗費相當多的時間與精力後, 得到的效果卻不如人意? 那麼掌握Excel重要技巧就顯得至關重要了!

有11業績快速提升的運營技巧:想要麼

1. 剛開店時要儘量統一定位 在剛開始做店的時候,因為個性化搜尋的趨勢,所以,我建議你店鋪裡面的商品風格儘可能的統一,包括價位也要儘量的在同一個檔次,並且如果有可能,你從好從葉子類目開始,也就是從最小的類目開始突破,等爆款起來了,在根據店鋪的實際情況慢慢的調整產品佈局。

11吃驚的 Linux 終端命令

command 自己 任務管理 效果 win str 移動 痛苦 機器 from:http://www.linuxidc.com/Linux/2015-05/117414.htm [日期:2015-05-13] 來源:Linux中國 作者:Linux [字體:大

10分鐘明白MySQL是如何利用索引的

一、前言 在MySQL中進行SQL優化的時候,經常會在一些情況下,對MySQL能否利用索引有一些迷惑。 譬如: MySQL 在遇到範圍查詢條件的時候就停止匹配了,那麼到底是哪些範圍條件? MySQL 在LIKE進行模糊匹配的時候又是如何利用索引的呢? MySQL 到

Re:Unity遊戲開發有哪些拍案叫絕的技巧

這是我在知乎一個問題: 《Unity遊戲開發有哪些讓你拍案叫絕的技巧?》 下面的回答,覺得蠻有趣的,貼在這裡和部落格的朋友們分享下。 ----- 分享一個比較好玩的內容吧。 大家都知道Unity有一個職位叫做Evangelist,翻譯成中文就是佈道師。他們的任務是介紹Unity最新的功能,分享U

10分鐘成為全棧工程師-koa快速入門

前言 隨著技術的不斷髮展,前端工程師也被賦予了越來越多的職責。不再是從前只需要切個圖,加個css樣式就能完成任務的切圖仔了。接下來這篇文章,完成一個簡單的登入註冊,能讓你快速上手,成為一個‘小全棧工程師’,here we go ! koa快速開始 安裝 因為nod

10分鐘的站點也支援Markdown

Markdown簡介 Markdown 是一種輕量級的「標記語言」,它的優點很多,目前也被越來越多的寫作愛好者,撰稿者廣泛使用。Markdown 的語法十分簡單,常用的標記符號也不超過十個,這種相對於更為複雜的 HTML 標記語言來說,Markdown 可謂是十分輕量的,學習

10程式設計師瞬間炸毛的奇葩需求

作為一名程式猿 想必都遇到過一些讓自己炸毛的奇葩需求 本文為大家整理了10個最經典案例 一起看看他們的血淚史吧! 01 相信這裡有很多學習java的朋友,小編整理了一份java方面的學習資料, 有想要學習java的可以加一下我的學習群的喲,60833,4068

哈佛研究:9變窮的理由

哈佛大學的喬伊斯 · 馬特勒教授告誡我們:「樹立起創富新觀念,並踏踏實實的行動,不要認為成為富人

10人心情變好的顏色【附RGB值以及html值】

本文源於想把QQ字型調成令人心情愉悅的顏色,傳遞好心情:)。 於是找來了網上已有的十種讓人心情變好的顏色彙總,但只有html的值,又由於QQ字型顏色設定需要RGB,接著用了畫圖工具,一一查詢,就有了這篇小文~ #2ae0c8  #a2e1d4 #acf6ef #cbf

webstorm的live templates快速編輯功能,css JS程式碼書寫速度飛起來

前言: Emmet的前身是大名鼎鼎的Zen coding,如果你從事Web前端開發的話,對該外掛一定不會陌生。它使用仿CSS選擇器的語法來生成程式碼, 大大提高了HTML/CSS程式碼編寫的速度,比如下面的演示:    但是對於我們來說這遠遠不夠,我還想寫css js呢,有

Web前端:11程式碼整潔的原則

寫Web頁面就像我們建設房子一樣,地基牢固,房子才不會倒。同樣的,我們製作Web頁面也一樣,一個良好的HTML結構是製作一個美麗的網站的開始,同樣的,良好的CSS只存在同樣良好的HTML中,所以一個乾淨的,語義的HTML的優點很多,那麼平時製作中,我們做到

Python 有哪些相見恨晚的技巧

關注「實驗樓」,每天分享一個專案教程實驗樓高階工程師protream老師,為大家帶來這些Pyth

上百事半功倍的jquery外掛

jQuery是一個了不起的javascript庫,它可以是我們用很少的幾句程式碼就可以創建出漂亮的頁面效果。從網站的方面說,這使得javascript更加有趣。 很多jquery愛好者開發了基於jquery的外掛,在這裡發現作者收集好多jquery的外掛,轉貼過來,給大家分享。 File upload-檔案

驚訝的冷門知識-有點意思,分享給大家樂一樂

媽媽們在懷孕前過量飲酒,她們的孩子可能發生血糖升高,或者其他血糖功能上的改變。這些改變會提高這些孩子在成年以後患糖尿病的風險。 十歲的時候聽力最好,然後越往後越差。 每年都有超過兩萬只鳥撞在窗子上死亡的。 女生的性活躍區域與大腦海馬體中神經組織的生長有關

10成為傑出的Java程式設計師

開發十年,就只剩下這套架構體系了! >>>   

幹貨分享,4眼前一亮的手機軟件,款款良心

視頻水印 找到你 img 擁有 生活 快手 水印 mage 免費 1、氫應用 手機裏面安裝了它的話,就相當於安裝了幾十個軟件,對應的插件功能讓人想不到有多完美,可以獲得第一手的網易新聞以及IT之家的實時消息,讓你的生活不會乏味。 2、音樂狂 這是一個集合了眾多音樂平臺的聽歌

10秒鐘的日誌模組化

## 一、背景 業務開發中常常有這樣的場景, 好幾個人在同一個專案中,負責不同的業務模組,比如在一個商城系統中,老王負責會員(member)和返現(rebate)模組;老李負責商品(item)和促銷(promotion)模組;老呂負責活動(campaign)模組。 業務剛起步,團隊很小,沒那麼多預算去搞微