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

来源:https://www.cnblogs.com/LuckyWinty/archive/2019/10/30/11763296.html
-Advertisement-
Play Games

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


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:
GitHub

解決方法:
  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效果

灰色圖可以直接加濾鏡,不用切多一張圖。如圖:
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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • axios學習筆記defaults(預設配置)和mergeConfig(合併config方法) "源碼地址" 找到入口文件 axios/lib/axios.js ... var mergeConfig = require('./core/mergeConfig');` var defaults = ...
  • 前段時間做了一個“國外的公眾號”,為什麼說是國外的公眾號呢,因為他和微信的公眾號有很多共通之處。當然了也有很多不同的地方,第一個要說的就是,我在列印信息的時候,使用的alert()彈窗,但是後臺才發現,LINE中的彈窗中的內容是不能用逗號分隔的。請看下麵的代碼: 在LINE中就只能列印個1,然後後面 ...
  • 序言 隨著用戶量越來越多,業務方關於用戶體驗的要求也在不斷提高,首屏渲染時間就成為了一個提高用戶體驗的指標,減少用戶等待的時間,在一定程度上就會提高用戶的留存。 頁面載入渲染是怎樣的一個過程 參考自Chrome的First Paint Send Request:表示給這個外鏈對應的伺服器發送請求 R ...
  • 在說虛擬DOM之前,先來一個引子,從輸入url到展現出整個頁面都有哪些過程? 1、輸入網址 2、DNS解析 3、建立tcp連接 4、客戶端發送HTPP請求 5、伺服器處理請求 6、伺服器響應請求 7、瀏覽器展示HTML 8、瀏覽器發送請求獲取其他在HTML中的資源。 其中瀏覽器展示HTML經過了:構 ...
  • 對象(object)是 JavaScript 最重要的數據結構。ES6 對它進行了重大升級,本章介紹數據結構本身的改變及語法應用細節。 ...
  • “JSX” JSX就是Javascript和XML結合的一種格式。是一個 JavaScript 的語法擴展。 React發明瞭JSX,利用HTML語法來創建虛擬DOM。當遇到<,JSX就當HTML解析,遇到{就當JavaScript解析。 JSX,是一個 JavaScript 的語法擴展。JSX 可 ...
  • vue,element列表大數據卡頓問題,vue列表渲染慢,element表格渲染慢,表格渲染慢(卡),表格全選卡 ...
  • 結論 3XX開頭的HTTP狀態碼都表示重定向的響應。 301、308是永久重定向;302、303、307是臨時重定向。 301、302是http 1.0的內容,303、307、308是http1.1的內容。 301和302本來在規範中是不允許重定向時改變請求method的(將POST改為GET),實 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...