8個有用的 CSS 技巧:視差圖像,sticky footer 等等

譯者:前端小智css

原文:medium.com/@bretcamero…html

CSS是一種獨特的語言。乍一看,這彷佛很簡單,可是,某些在理論上看起來很簡單的效果在實踐中每每不那麼明顯。前端

在本文中,我將分享一些有用的技巧和技巧,它們表明了我在學習CSS過程當中的關鍵進展。本文並非要演示CSS能夠變得多麼複雜。相反,它分享了一些在大多數CSS教程中不太可能找到的有用技巧。ios

想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等着你!git

1. Sticky Footer

這個很是常見的需求,但對於初學者來講多是個難題。github

對於大多數項目,無論內容的大小,都但願頁腳停留在屏幕的底部—若是頁面的內容通過了視圖端口,頁腳應該進行調整。web

在CSS3以前,若是不知道腳的確切高度,就很難達到這種效果。雖然咱們稱它爲粘性頁腳,但你不能簡單地用 position: sticky 來解決這個問題,由於它會阻塞內容。api

今天,最兼容的解決方案是使用 Flexbox。主要的作法是在包含頁面主要內容的 div 上使用不太知名的 flex-grow 屬性,在下面的示例中,我使用的是 main 標籤。瀏覽器

flex-grow 控制 flex 項相對於其餘 flex 元素填充其容器的數量。當值爲 0 時,它不會增加,因此咱們須要將它設置爲 1 或更多。在下面的示例中,我使用了簡寫屬性 flex: auto,它將 flex-grow 默認設置爲 1bash

爲了防止任何沒必要要的行爲,咱們還能夠在 footer 標籤中添加 flex-shrink: 0flex-shrink 實際上與 flex-growth 屬性相反,控制 flex 元素收縮到適合其容器的大小,將它設置爲 0 剛防止 footer 標籤收縮,確保它保留其尺寸。

clipboard.png

// html
    <div id="document">
      <main>
        <h1>Everything apart from the footer goes here</h1>
        <p>Add more text here, to see how the footer responds!</p>
      </main>
      <footer>
        <h1>The footer goes here</h1>
      </footer>
    </div>
複製代碼

// css
    #document { 
        height: 100vh;
        display: flex;
        flex-direction: column;
    }
    
    main {
      flex: auto;
    }
    
    footer {
        flex-shrink: 0;
    }
    
    /* Other styling elements, that are not necessary for the example */
    
    * {
      margin: 0;
      font-family: Candara;
    }
    
    h1, p {
      padding: 20px;
    }
    
    footer {
      color: white;
      background: url(https://images.unsplash.com/photo-1550795598-717619d32900?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=676&q=80);
      background-position: center; 
      background-repeat: no-repeat;
      background-size: cover;
    }
    
    footer > h1 {
      text-shadow: 1px 1px 4px #00000080;
    }
複製代碼

查看演示

2. Zoom-on-Hover

clipboard.png

zoom-on-hover 效果是將注意力吸引到可點擊圖像上的好方法。當用戶將鼠標懸停在上面時,圖像會稍微放大,但其尺寸保持不變。

爲了達到這個效果,須要用 div 標籤包裹 img 標籤。

要使此效果生效,須要設置父元素的 widthheight ,並確保將 overflow 設置爲 hidden,而後,你能夠將任何類型的轉換動畫效果應用於內部圖像。

// html
<div class="img-wrapper">
    <img class="inner-img" src="https://source.unsplash.com/random/400x400" />
</div>

<!-- Additional examples -->

<div class="img-wrapper">
    <img class="inner-img" src="https://source.unsplash.com/random/401x401" width="400px" height="400px" />
</div>

<div class="img-wrapper">
    <img class="inner-img" src="https://source.unsplash.com/random/402x402" width="400px" height="400px" />
</div>
複製代碼

// css
.img-wrapper {  
  width: 400px;
  height: 400px;
  overflow: hidden; 
}

.inner-img {
  transition: 0.3s;
}

.inner-img:hover {
  transform: scale(1.1);
}
複製代碼

查看演示

3. 即時夜間模式

若是你正在尋找一個快速的方法來應用「夜間模式」皮膚到你的網站,可使用 inverthue-rotate 過濾器。

filter: invert() 的範圍是從 0 到 1,其中 1 從白色變爲黑色。

filter: hue-rotate() 改變元素的顏色內容,使它們或多或少保持相同的分離水平, 其值範圍爲 0deg360deg

經過將這些效果組合在 body 標籤上,能夠快速試用網站的夜間模式(注意,爲了影響背景,你必須給它一個顏色。)

使用這些設置,咱們能夠給谷歌的主頁一個即時改造:

圖片描述

4.自定義的要點

clipboard.png

要爲無序列表建立自定義項目符號,可使用 content 屬性和 ::before 僞元素。

在下面的 CSS 中,我使用 .complete.incomplete 兩個類來區分兩種不一樣類型的項目符號。

ul {
  list-style: none;
}
ul.complete li::before {
  content: '🗹 ';
}
ul.incomplete li::before {
  content: '☐ ';
}
複製代碼

查看演示

額外用途:麪包屑導航

clipboard.png

利用 content 屬性有許多更有用的方法,這裏忍不住又多介紹一種。

因爲用於分隔麪包屑的斜槓和其餘符號具備樣式性,因此在CSS中定義它們頗有意義。和本文中的許多例子同樣,這種效果依賴於CSS3中提供的僞類——last-child——:

.breadcrumb a:first-child::before {
  content: " » ";
}
.breadcrumb a::after {
  content: " /";
}
.breadcrumb a:last-child::after {
  content: "";
}
複製代碼

查看演示

5. 視差圖像 (Parallax Images)

這種引人注目的效果愈來愈受歡迎,當用戶滾動頁面時,它能夠給頁面帶來生氣。

當一個頁面的正常圖像隨着用戶滾動而移動時,視差圖像看起來是固定的——只有經過它可見的窗口才會移動。

僅 CSS 示例

圖片描述

// html
<div class="wrapper">
  <h1>Scroll Down</h1>  
  <div class="parallax-img"></div>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
  <p>At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.</p>
</div>
<div class="wrapper">
</div>
複製代碼

// css
.wrapper {
  height: 100vh;
}

.parallax-img {
  height: 100%;
  background-attachment: fixed;
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}

/* Other styling elements, that are not necessary for the example */

    body {
      margin: 0;
      background: #000;
    }
    
    * {
      font-family: Candara;
      color: white;
    }
    
    h1 {
      margin: 15px;
      text-align: center;
    }
    
    p {
      margin: 15px;
      font-size: 1.1rem;
    }
    
    .parallax-img {
      background-image: url('https://source.unsplash.com/random/1920x1080');
    }
複製代碼

查看演示

CSS + JavaScript 示例

要得到更高級的效果,可使用 JavaScript 在用戶滾動時向圖像添加移動。

圖片描述

// html
<div class="block">
  <img src="https://unsplash.it/1920/1920/?image=1005" data-speed="-1" class="img-parallax">
  <h2>Parallax Speed -1</h2>
</div>
<div class="block">
  <img src="https://unsplash.it/1920/1920/?image=1067" data-speed="1" class="img-parallax">
  <h2>Parallax Speed 1</h2>
</div>
<div class="block">
  <img src="https://unsplash.it/1920/1920/?gravity=center" data-speed="-0.25" class="img-parallax">
  <h2>Parallax Speed -0.25</h2>
</div>
<div class="block">
  <img src="https://unsplash.it/1920/1920/?image=1080" data-speed="0.25" class="img-parallax">
  <h2>Parallax Speed 0.25</h2>
</div>
<div class="block">
  <img src="https://unsplash.it/1920/1920/?random" data-speed="-0.75" class="img-parallax">
  <h2>Parallax Speed -0.75</h2>
</div>
<div class="block">
  <img src="https://unsplash.it/1920/1920/?blur" data-speed="0.75" class="img-parallax">
  <h2>Parallax Speed 0.75</h2>
</div>
複製代碼

// css
@import url(https://fonts.googleapis.com/css?family=Amatic+SC:400,700);
html, body{
  margin: 0;
  padding: 0;
  height: 100%;
  width: 100%;
  font-family: 'Amatic SC', cursive;
}
.block{
  width: 100%;
  height: 100%;
  position: relative;
  overflow: hidden;
  font-size: 16px;
}
.block h2{
  position: relative;
  display: block;
  text-align: center;
  margin: 0;
  top: 50%;
  transform: translateY(-50%);
  font-size: 10vw;
  color: white;
  font-weight: 400;
}
.img-parallax {
  width: 100vmax;
  z-index: -1;
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%,0);
  pointer-events: none
}
複製代碼

// js

// I know that the code could be better.
// If you have some tips or improvement, please let me know.

$('.img-parallax').each(function(){
  var img = $(this);
  var imgParent = $(this).parent();
  function parallaxImg () {
    var speed = img.data('speed');
    var imgY = imgParent.offset().top;
    var winY = $(this).scrollTop();
    var winH = $(this).height();
    var parentH = imgParent.innerHeight();


    // The next pixel to show on screen      
    var winBottom = winY + winH;

    // If block is shown on screen
    if (winBottom > imgY && winY < imgY + parentH) {
      // Number of pixels shown after block appear
      var imgBottom = ((winBottom - imgY) * speed);
      // Max number of pixels until block disappear
      var imgTop = winH + parentH;
      // Porcentage between start showing until disappearing
      var imgPercent = ((imgBottom / imgTop) * 100) + (50 - (speed * 50));
    }
    img.css({
      top: imgPercent + '%',
      transform: 'translate(-50%, -' + imgPercent + '%)'
    });
  }
  $(document).on({
    scroll: function () {
      parallaxImg();
    }, ready: function () {
      parallaxImg();
    }
  });
});
複製代碼

查看演示

6. 裁剪圖像動畫

圖片描述

與粘性頁腳同樣,在 CSS3 以前裁剪圖像也很是棘手。如今,咱們有兩個屬性使裁剪變得簡單,object-fitobject-position,它們一塊兒容許你更改圖像的尺寸而不影響它的長寬比。

之前,老是能夠在照片編輯器中裁剪圖像,可是在瀏覽器中裁剪圖像的一個很大的優點是能夠將圖像大小調整爲動畫的一部分。

爲了儘量簡單地演示這種效果,下面的示例使用 <input type="checkbox"> 標記觸發這種效果。這樣,咱們能夠利用CSS的 :checked 僞類,咱們不須要使用任何JavaScript:

// html
<input type="checkbox" />
<br />
<img src="https://source.unsplash.com/random/1920x1080" alt="Random" />


input {
  transform: scale(1.5)
  margin:10px 5px;
}

img {
  width: 1920px;
  height: 1080px;
  transition: 0s;
}

input:checked +br + img{
  width: 500px;
  height: 500px;
  object-fit: cover;
  object-position: left-top;
   transition: width 2s, height 4s;
}
複製代碼

查看演示

7. 混合模式(Blend Modes)

若是你有使用 Photoshop 的經驗,你可能知道它不一樣的混合模式是多麼強大,能夠建立有趣的效果。可是你知道 Photoshop 的大部分混合模式也能夠在 CSS 中使用嗎?

當圖像的被設置爲 background-color:lightblue; blend-mode:difference ; ,這就是Medium 的主頁的樣子:

圖片描述

此外,背景並非利用混合模式的惟一方法。mix-blend-mode 屬性容許你將元素與其現有背景進行混合。例如,使用以下樣式建立這樣的效果:

圖片描述

// html
    <h1>This is an example title</h1>
複製代碼

// css
h1 {
    mix-blend-mode: color-dodge;
    font-family: Candara;
    font-size: 5rem;
    text-align: center;
    margin: 0; 
    padding: 20vh 200px;
    color: lightsalmon;
  }


  html,
  body {
    margin: 0;
    background-color: white;
  }

  body {
    background-image: url(https://images.unsplash.com/photo-1550589348-67046352c5f3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1353&q=80);
    background-repeat: no-repeat;
    background-size: cover;
    min-height: 100vh;
    overflow: hidden;
}   
複製代碼

查看演示

8. Pinterest-style 圖像

CSS Grid和Flexbox使得實現多種不一樣類型的響應式佈局變得更加容易,而且容許咱們在頁面上很容易地將元素垂直居中——這在之前是很是困難的。

然而,它們不太適合的一種佈局風格是 Pinterest 使用的佈局風格,即每一個元素的垂直位置都根據其上方元素的高度而變化。

圖片描述

實現此目的的最佳方法是使用 CSS 的列屬性套件。 這些最經常使用於建立多個報紙樣式的文本列,但這是另外一個很好的用例。

要實現這一點,須要將元素包裝在 div 中,併爲該包裝器提供一個 column-widthcolumn-gap 屬性。

而後,爲了防止任何元素被分割到兩個列中,使用 column-break-inside:avoid 將其添加到單個元素中。

圖片描述

// html
<div id="columns">
  <figure>
  <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/cinderella.jpg">
    <figcaption>Cinderella wearing European fashion of the mid-1860’s</figcaption>
    </figure>
    
    <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/rapunzel.jpg">
    <figcaption>Rapunzel, clothed in 1820’s period fashion</figcaption>
    </figure>
    
  <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/belle.jpg">
    <figcaption>Belle, based on 1770’s French court fashion</figcaption>
    </figure>
  
    <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/mulan_2.jpg">
    <figcaption>Mulan, based on the Ming Dynasty period</figcaption>
    </figure>
    
   <figure>
     <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/sleeping-beauty.jpg">
    <figcaption>Sleeping Beauty, based on European fashions in 1485</figcaption>
    </figure>
    
   <figure>
     <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/pocahontas_2.jpg">
    <figcaption>Pocahontas based on 17th century Powhatan costume</figcaption>
    </figure>
  
    <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/snow-white.jpg">
    <figcaption>Snow White, based on 16th century German fashion</figcaption>
    </figure>   
  
   <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/ariel.jpg">
    <figcaption>Ariel wearing an evening gown of the 1890’s</figcaption>
    </figure>
  
    <figure>
    <img src="//s3-us-west-2.amazonaws.com/s.cdpn.io/4273/tiana.jpg">
    <figcaption>Tiana wearing the <i>robe de style</i> of the 1920’s</figcaption>
    </figure>   
  <small>Art &copy; <a href="//clairehummel.com">Claire Hummel</a></small>
    </div>
複製代碼

// css
@font-face{font-family:'Calluna';
 src:url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/callunasansregular-webfont.woff') format('woff');
}
body {
    background: url(//subtlepatterns.com/patterns/scribble_light.png);
  font-family: Calluna, Arial, sans-serif;
  min-height: 1000px;
}
#columns {
    column-width: 320px;
    column-gap: 15px;
  width: 90%;
    max-width: 1100px;
    margin: 50px auto;
}

div#columns figure {
    background: #fefefe;
    border: 2px solid #fcfcfc;
    box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
    margin: 0 2px 15px;
    padding: 15px;
    padding-bottom: 10px;
    transition: opacity .4s ease-in-out;
  display: inline-block;
  column-break-inside: avoid;
}

div#columns figure img {
    width: 100%; height: auto;
    border-bottom: 1px solid #ccc;
    padding-bottom: 15px;
    margin-bottom: 5px;
}

div#columns figure figcaption {
  font-size: .9rem;
    color: #444;
  line-height: 1.5;
}

div#columns small { 
  font-size: 1rem;
  float: right; 
  text-transform: uppercase;
  color: #aaa;
} 

div#columns small a { 
  color: #666; 
  text-decoration: none; 
  transition: .4s color;
}

div#columns:hover figure:not(:hover) {
    opacity: 0.4;
}

@media screen and (max-width: 750px) { 
  #columns { column-gap: 0px; }
  #columns figure { width: 100%; }
}
複製代碼

查看演示

上面的例子也是 CSS:not() 僞類的一個很好的例子。他將它與 :hover 一塊兒使用,這樣除了盤旋的元素外,其餘元素都將淡出。

其它的資源

總的來講,我但願下面的例子已經了說明了一些有用的 CSS 效果,甚至可能會讓你注意到一些你沒有見到過的特性。

像這樣的特性並不屬於「簡單技巧」的範疇,它們能夠本身進行至關深刻的探索。因此我不打算在這裏描述它們,下面介紹一些很好資源來了解它們:

Keyframe animation

Scroll-snapping

多級導航

3D 效果

CSS的打印

設計原則

你的點贊是我持續分享好東西的動力,歡迎點贊!

交流

乾貨系列文章彙總以下,以爲不錯點個Star,歡迎 加羣 互相學習。

github.com/qq449245884…

我是小智,公衆號「大遷世界」做者,對前端技術保持學習愛好者。我會常常分享本身所學所看的乾貨,在進階的路上,共勉!

關注公衆號,後臺回覆福利,便可看到福利,你懂的。

相關文章
相關標籤/搜索