1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        你所不知道的 CSS 負(fù)值技巧與細(xì)節(jié)

        共 3906字,需瀏覽 8分鐘

         ·

        2020-12-26 23:10


        文章轉(zhuǎn)載自?Coco



        寫本文的起因是,一天在群里有同學(xué)說誤打誤撞下,使用負(fù)的 outline-offset 實現(xiàn)了加號。嗯?好奇的我馬上也動手嘗試了下,到底是如何使用負(fù)的 outline-offset 實現(xiàn)加號呢?

        使用負(fù)值 outline-offset 實現(xiàn)加號

        假設(shè)我們有這樣一個簡單的結(jié)構(gòu):

        1. <div>div>

        1. div {

        2. width: 200px; height: 200px;

        3. outline: 20px solid #000;

        4. outline-offset: 10px;

        5. }



        修改 outline-offset 到一個合適的負(fù)值 ,那么在恰當(dāng)?shù)臅r候,outline 邊框就會向內(nèi)縮進(jìn)為一個加號。

        經(jīng)過一番嘗試,修改上述 div 的 outline-offset為 -118px。

        1. div {

        2. width: 200px; height: 200px;

        3. outline: 20px solid #000;

        4. outline-offset: -118px;

        5. }

        加個動畫效果,大概是這樣:


        CodePen:?https://codepen.io/Chokcoco/pen/PrrLaP

        很有意思,我嘗試了很多不同的情況,最后總結(jié)了一個簡單的規(guī)律,要使用負(fù)的 outline-offset 生成一個加號有一些簡單的限制:

        • 容器得是個正方形

        • outline 邊框本身的寬度不能太小

        • outline-offset 負(fù)值 x 的取值范圍為: -(容器寬度的一半 + outline寬度的一半) < x < -(容器寬度的一半 + outline寬度)


        在這個例子后,我又想,CSS 屬性可以取負(fù)值的地方有很多。大家最為熟知的就是負(fù)margin,使用負(fù)的 marign,可以用來實現(xiàn)類似多列等高布局、垂直居中等等。那還有沒有其他一些有意思的負(fù)值使用技巧呢?

        下文就再介紹一些 CSS 負(fù)值有意思的使用場景。

        單側(cè)投影

        先說單側(cè)投影,關(guān)于 box-shadow,大部分時候,我們使用它都是用來生成一個兩側(cè)的投影,或者一個四側(cè)的投影。如下:



        OK,那如果要生成一個單側(cè)的投影呢?

        我們來看看 box-shadow 的用法定義:

        1. {

        2. box-shadow: none | [inset? && [ <offset-x> <offset-y> <blur-radius>? <spread-radius>? ? ] ]#

        3. }

        box-shadow:1px2px3px4px#333 為例,4 個數(shù)值的含義分別是,x 方向偏移值、y 方向偏移值 、模糊半徑、擴(kuò)張半徑。

        這里有一個小技巧,擴(kuò)張半徑可以為負(fù)值

        繼續(xù),如果陰影的模糊半徑,與負(fù)的擴(kuò)張半徑一致,那么我們將看不到任何陰影,因為生成的陰影將被包含在原來的元素之下,除非給它設(shè)定一個方向的偏移量。所以這個時候,我們給定一個方向的偏移值,即可實現(xiàn)單側(cè)投影:


        CodePen:?https://codepen.io/Chokcoco/pen/pergRb

        使用 scale(-1) 實現(xiàn)翻轉(zhuǎn)

        通常,我們要實現(xiàn)一個元素的 180° 翻轉(zhuǎn),我們會使用 transform:rotate(180deg),這里有個小技巧,使用 transform:scale(-1) 可以達(dá)到同樣的效果??磦€ Demo:

        1. <p class="scale">CSS Nagative Scale(-1)p>

        1. .scale {

        2. transform: scale(1);

        3. animation: scale 10s infinite linear;

        4. }

        5. @keyframes scale{

        6. 50% {

        7. transform: scale(-1);

        8. }

        9. 100% {

        10. transform: scale(-1);

        11. }

        12. }

        看看效果:



        GIF 中第一行是使用了 transform:rotate(180deg) 的效果

        CodePen:?https://codepen.io/Chokcoco/pen/VoQXVq

        使用負(fù) letter-spacing 倒序排列文字

        與上面 scale(-1) 有異曲同工之妙的是負(fù)的 letter-spacing

        letter-spacing 屬性明確了文字的間距行為,通常而言,除了關(guān)鍵字 normal,我們還可以指定一個大小,表示文字的間距。像這樣:

        1. <p class="letter_spacing">倒序排列文字p>

        1. .letter_spacing {

        2. font-size: 36px;

        3. letter-spacing: 0px;

        4. animation: move 10s infinite;

        5. }

        6. @keyframes move {

        7. 40% {

        8. letter-spacing: 36px;

        9. }

        10. 80% {

        11. letter-spacing: -72px;

        12. }

        13. 100% {

        14. letter-spacing: -72px;

        15. }

        16. }

        我們設(shè)置文字的 letter-spacing 從 0 -> 36px -> -72px,觀察不同的變化:


        CodePen:?https://codepen.io/Chokcoco/pen/QeQXpW

        然而,受到中英文混排或者不同字體的影響,以及倒序后的排列方式,不建議使用這種方式來倒序排列文字。

        transition-delay 及 animation-delay 的負(fù)值使用,立刻開始動畫

        我們知道,CSS 動畫及過渡提供了一個 delay 屬性,可以延遲動畫的進(jìn)行。

        考慮下面這個動畫:



        簡單的代碼大概是這樣:

        1. <div class="g-container">

        2. <div class="item">div>

        3. <div class="item">div>

        4. <div class="item">div>

        5. div>

        1. .item {

        2. transform: rotate(0) translate(-80px, 0) ;

        3. }

        4. .item:nth-child(1) {

        5. animation: rotate 3s infinite linear;

        6. }

        7. .item:nth-child(2) {

        8. animation: rotate 3s infinite 1s linear;

        9. }

        10. .item:nth-child(3) {

        11. animation: rotate 3s infinite 2s linear;

        12. }

        13. @keyframes rotate {

        14. 100% {

        15. transform: rotate(360deg) translate(-80px, 0) ;

        16. }

        17. }

        如果,我們想去掉這個延遲,希望在一進(jìn)入頁面的時候,3 個球就是同時運動的。這個時候,只需要把正向的 animation-delay 改成負(fù)向的即可。

        1. .item:nth-child(1) {

        2. animation: rotate 3s infinite linear;

        3. }

        4. .item:nth-child(2) {

        5. animation: rotate 3s infinite -1s linear;

        6. }

        7. .item:nth-child(3) {

        8. animation: rotate 3s infinite -2s linear;

        9. }


        這里,有個小技巧,被設(shè)置了 animation-dealy 為負(fù)值的動畫會立刻執(zhí)行,開始的位置是其動畫階段中的一個階段。所以,動畫在一開始的時刻就是下面這樣:



        以上述動畫為例,一個被定義執(zhí)行 3s 的動畫,如果 animation-delay 為 -1s,起點相當(dāng)于正常執(zhí)行時,第2s(3-1)時的位置。

        CodePen:?https://codepen.io/Chokcoco/pen/QeQXpW

        負(fù)值 margin

        負(fù)值 margin 在 CSS 中算是運用的比較多的,元素的外邊距可以設(shè)置為負(fù)值。

        在 flexbox 布局規(guī)范還沒流行之前,實現(xiàn)多行等高布局還是需要下一番功夫的。其中一種方法便是使用正 padding 負(fù) margin 相消的方法。

        有如下一個布局:

        左右兩欄的內(nèi)容都是不確定的,也就是高度未知。但是希望無論左側(cè)內(nèi)容較多還是右側(cè)內(nèi)容較多,兩欄的高度始終保持一致。

        OK,其中一種 Hack 辦法便是使用一個很大的正 padding 和相同的負(fù) margin 相消的方法填充左右兩欄:

        1. .g-left {

        2. ...

        3. padding-bottom: 9999px;

        4. margin-bottom: -9999px;

        5. }

        6. .g-right {

        7. ...

        8. padding-bottom: 9999px;

        9. margin-bottom: -9999px;

        10. }

        可以做到無論左右兩欄高度如何變化,高度較低的那一欄都會隨著另外一欄變化。

        具體的代碼可以看看這里:https://codepen.io/Chokcoco/pen/ZgrmVy

        總結(jié)一下

        另外,還有一些大家熟知的沒有單獨列出來的,譬如:

        • 使用負(fù) marign 實現(xiàn)元素的水平垂直居中

        • 使用負(fù) marign隱藏列表 li 首尾多余的邊框

        • 使用負(fù) text-indent 實現(xiàn)文字的隱藏

        • 使用負(fù)的 z-index 參與層疊上下文排序

        ??愛心三連擊

        1.看到這里了就點個在看支持下吧,你的點贊在看是我創(chuàng)作的動力。

        2.關(guān)注公眾號程序員成長指北,回復(fù)「1」加入高級前端交流群!「在這里有好多 前端?開發(fā)者,會討論?前端 Node 知識,互相學(xué)習(xí)」!

        3.也可添加微信【ikoala520】,一起成長。

        “在看轉(zhuǎn)發(fā)”是最大的支持

        瀏覽 43
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产美女全裸网站 | 毛片免费看| 国产成人宗合 | 国产三级综合 | 夜夜爽妓女视频8888 | 女生裸体无马赛克 | 粗大黑人巨精大战欧美成人 | 免费无码性爱视频 | 欧美一级电影在线观看 | 小茹的性荡生活 |