天天看點

css的這個屬性還可以這麼用!你不知道的負值技巧和細節使用 outline-offset 屬性實作加号使用outline-offset做加号的總結

使用 outline-offset 屬性實作加号

假設有這麼一個初始代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            margin-left: 100px;
            margin-top: 100px;
            padding: 0;
            width: 200px; 
            height: 200px;
            background-color: green;
            outline: 20px solid #000;
            outline-offset: 10px;
}
    </style>
</head>
<body>
    <div></div>
</body>
</html>           

其效果如下:

然後再把這個outline-offset屬性的值改為-118px,那麼就會把邊框變成一個加号

當然我這裡為了效果顯著一些,我加了一個動畫效果來顯示,如下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            margin-left: 100px;
            margin-top: 100px;
            padding: 0;
            width: 200px; 
            height: 200px;
            background-color: green;
            outline: 20px solid #000;
            animation: move 3s infinite;

}   
@keyframes move {
    0% {
        outline-offset: 10px;
    }
   
    100% {
        outline-offset: -118px;
    }
}     
    </style>
</head>
<body>
    <div></div>
</body>
</html>           

使用outline-offset做加号的總結

我覺得這個很有意思,在這裡我試了很多次,在這裡我總結了一下使用outline-offset屬性負值的條件:

  • 容器必須是個正方形
  • outline 邊框本身的寬度不能太小
  • outline-offset 負值 x 的取值範圍為: -(容器寬度的一半 + outline寬度的一半) < x < -(容器寬度的一半 + outline寬度)
    • *

在這個例子後,我又在想,CSS 屬性可以取負值的屬性和地方有很多,也有許多意想不到的效果。大家最為熟知的就是負margin,使用負的 marign,可以用來實作類似多列等高布局、垂直居中等等。那還有沒有其他一些有意思的負值使用技巧呢?

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

使用 scale(-1) 實作翻轉

通常,我們要實作一個元素的 180° 翻轉,我們會使用 

transform: rotate(180deg)

,這裡有個小技巧,使用 

transform: scale(-1)

 可以達到同樣的效果。看個 Demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .g_container {
            position: absolute;
            margin: 100px 0 0 500px;
        }
        .item {
            width: 100px;
            height: 100px;
            background-color: green;
            position: relative;
            border-radius: 50%;
        }
       .item {
    transform: rotate(0) translate(-80px, 0) ;
}
 
.item:nth-child(1) {
    animation: rotate 3s infinite linear;
}
 
.item:nth-child(2) {
    animation: rotate 3s infinite 1s linear;
}
 
.item:nth-child(3) {
    animation: rotate 3s infinite 2s linear;
}
 
 
@keyframes rotate {
    100% {
        transform: rotate(360deg) translate(-80px, 0) ;
    }
}

    </style>
</head>
<body>
    <div class="g_container">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
</body>
</html>           

看看效果:

當然,如果想要讓三個球同時運動,去掉這個延遲,那麼可以改成這樣的代碼:

.item:nth-child(1) {
    animation: rotate 3s infinite linear;
}
 
.item:nth-child(2) {
    animation: rotate 3s infinite -1s linear;
}
 
.item:nth-child(3) {
    animation: rotate 3s infinite -2s linear;
}           

其效果我就不說了,就是同時運動,可參照上面的那個效果

負值 margin

負值 margin 在 CSS 中算是運用的比較多的,元素的外邊距可以設定為負值。

在 flexbox 布局規範還沒流行之前,實作多行等高布局還是需要下一番功夫的。其中一種方法便是使用正 padding 負 margin 相消的方法。

有如下一個布局:

左右兩欄的内容都是不确定的,也就是高度未知。但是希望無論左側内容較多還是右側内容較多,兩欄的高度始終保持一緻。

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

.left {
  ...
  padding-bottom: 9999px;
  margin-bottom: -9999px;
}
 
.right {
  ...
  padding-bottom: 9999px;
  margin-bottom: -9999px;
}           

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

總結一下

除了這些,還有很多的屬性,例子沒有列出來(因作者的水準和時間有限),例如:

  • 使用負 marign 實作元素的水準垂直居中
  • 使用負 marign隐藏清單 li 首尾多餘的邊框
  • 使用負 text-indent 實作文字的隐藏
  • 使用負的 z-index 參與層疊上下文排序

還有一些很深奧的,譬如張鑫旭大大在 CSS 大會上分享的,利用負的 opacity 在 CSS 中實作了僞條件判斷,配合 CSS 自定義屬性,使用純 CSS 實作 360° 的餅圖效果:

多創新,多動手,發現程式設計世界的更多的樂趣和奧秘.

最後的總結

額,即使css屬性的負值在很多時候很有用,能開闊您對代碼的新的了解,但是在某些時候也會帶來很多的麻煩,也就是使用的場景,在使用它的時候要注意一下。有的時候看到這些代碼不得不好好捋一捋才能緩過神來,再感歎一句,原來如此。

如果有其他更好的更易了解的實作方式,具體使用實作的時候應該好好權衡一下。

好了,本文到此結束,希望對你有幫助 :)

注:如果本文有什麼錯誤的話,也歡迎大家評論,讨論哦,知識最重要嘛.

最最後,還希望各位愛好web前端,或者是看了我的文章而喜歡web程式設計的同志們(有點自戀)可以給個關注,不迷路哦.我會不斷更新關于web前端這塊的所有知識,不隻是css.可以一起讨論,一起學習嘛.

當然,最後還希望大家進入我的web前端交流群哦(qq),大家一起可以讨論交流.有什麼問題,疑問,都可以在群裡發起.隻有多個思想的碰撞,才會得到一個正确,甚至比正确更正确的一個"答案(好處)".

歡迎大家加入哦(直接點選這個連結)

1055351817

繼續閱讀