Hướng dẫn css is sticky - css là dính

Hướng dẫn css is sticky - css là dính

Đã đăng vào thg 1 15, 2019 6:41 SA 1 phút đọc 1 phút đọc

Trong lập trình giao diện web, khi chúng ta muốn một thành phần có sự bám dính trên giao diện, cách đơn giản nhất mọi người thường dùng là sử dụng fixed cho thuộc tính position và có thể kết hợp thêm javascript để xử lý. Tuy nhiên, CSS3 đã cung cấp một giá trị mới cho thuộc tính position

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
0 cho phép định nghĩa các thành phần bám dính trên giao diện một cách linh hoạt, không phụ thuộc vào javascript.

Hiện tại, CSS3 sticky đã hỗ trợ trên hầu hết các trình duyệt, mọi người có thể tham khảo bảng bên dưới:

Hướng dẫn css is sticky - css là dính

Cách sử dụng

Để sử dụng position sticky, mọi người chỉ cần đặt thuộc tính này vào thành phần muốn bám dính và định nghĩa khoảng cách căn các lề

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
2,
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
3,
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
4,
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
5.

VD:

.sticky{
    position: -webkit-sticky;
    position: sticky;
    top: 0;
    /*left: 10px;*/
    /*right: 20px;*/
    /*bottom: 10px;*/
}

Lưu ý

  • Một thành phần được định nghĩa sử dụng
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    6 chỉ hoạt động trong thành phần cha chứa nó (Tức là: chỉ bám dính trên thành phần cha chứa nó, nếu thành phần cha bị scroll ra ngoài window thì thành phần con có sử dụng
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    0 cũng sẽ bị kéo theo).

VD:

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
  • Các lề
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    2,
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    3,
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    4,
    body{
        height: 2000px;
    }
    
    .cha{
        width: 500px;
        height: 1000px;
        margin: 30px auto;
        padding: 10px;
        background-color: #eee;
    }
    
    .con{
        width: 480px;
        height: 300px;
        margin-top: 30px;
        background-color: #666;
        position: -webkit-sticky;
        position: sticky;
        top: 0;
    }
    
    5 sẽ lấy các lề của khung chứa nó làm gốc.

Ví dụ sử dụng sticky trong hiển thị bảng

All rights reserved

CSS Position Sticky đã được hỗ trợ trên hầu hết các trình duyệt (trừ IE và Opera Mini). Tuy nhiên, nó vẫn chưa được nhiều developer sử dụng. Một phần vì phải chờ quá lâu để tính năng này đuợc hỗ trợ trên các trình duyệt và khiến nó bị lãng quên. Một phần vì phần lớn developer vẫn chưa hiểu rõ về cách thức hoạt động của tính năng này. Vậy nên trong bài viết này mình sẽ giới thiệu cho các bạn về thuộc tính Position Sticky trong CSS. đã được hỗ trợ trên hầu hết các trình duyệt (trừ IE và Opera Mini). Tuy nhiên, nó vẫn chưa được nhiều developer sử dụng. Một phần vì phải chờ quá lâu để tính năng này đuợc hỗ trợ trên các trình duyệt và khiến nó bị lãng quên. Một phần vì phần lớn developer vẫn chưa hiểu rõ về cách thức hoạt động của tính năng này. Vậy nên trong bài viết này mình sẽ giới thiệu cho các bạn về thuộc tính Position Sticky trong CSS.

Như chúng ta đã biết, thuộc tính Position có 4 giá trị chính mà chúng ta hay dùng đó là:

.some-element {
  position: sticky;
  top: 0;
} 
2,
.some-element {
  position: sticky;
  top: 0;
} 
3,
.some-element {
  position: sticky;
  top: 0;
} 
4 và fixed.

Sự khác biệt chính giữa

.some-element {
  position: sticky;
  top: 0;
} 
6 và
.some-element {
  position: sticky;
  top: 0;
} 
7 là không gian mà chúng chiếm trong website. Cụ thể hơn, Postion
.some-element {
  position: sticky;
  top: 0;
} 
2 và
.some-element {
  position: sticky;
  top: 0;
} 
3 sẽ giữ lại không gian tự nhiên của phần tử trên website, còn
.some-element {
  position: sticky;
  top: 0;
} 
4 và fixed sẽ loại bỏ không gian vốn có của phần tử đi và khiến chúng nằm trôi nổi trên các phần tử khác.

Và Position Sticky cũng tương tự như 4 giá trị trên, nhưng nó lại khác về cách thức hoạt động. Mình sẽ giải thích thêm ở dưới Position Sticky cũng tương tự như 4 giá trị trên, nhưng nó lại khác về cách thức hoạt động. Mình sẽ giải thích thêm ở dưới

Hướng dẫn css is sticky - css là dính

Ví dụ đầu tiên về Position Sticky

Ở ví dụ đầu tiên với Position Sticky, chúng ta có thể nhanh chóng nhận ra rằng phần tử sẽ stick lại khi chúng ta scroll đến vị trí của phần tử này.Position Sticky, chúng ta có thể nhanh chóng nhận ra rằng phần tử sẽ stick lại khi chúng ta scroll đến vị trí của phần tử này.

.some-element {
  position: sticky;
  top: 0;
} 

Vấn đề là có lúc nó hoạt động, nhưng có những lúc thì lại không. Khi nó hoạt động thì phần tử được stick lại, nhưng đôi lúc nó lại không được stick lại khi scroll. Đối với những ai mà làm việc với CSS nhiều thì khó có thể chấp nhận được, vì vậy mình quyết định tìm hiểu sâu hơn về Position Sticky.Position Sticky.

Tìm hiểu về Sticky

Trong quá trình tìm hiểu về nó, mình đã nhận thấy rằng khi một phần tử với style là

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6 được đặt trong một phần tử khác được gọi là container và trong container chỉ có một phần tử sticky mà chúng ta khởi tạo dưới đây, thì phần tử này sẽ không được stick lại.container và trong container chỉ có một phần tử sticky mà chúng ta khởi tạo dưới đây, thì phần tử này sẽ không được stick lại.

<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>

Tuy nhiên, khi chúng ta thêm một vài phần tử vào trong phần tử container, thì nó mới thực sự hoạt động. Đó là vì khi một phần tử được set style là

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6, thì phần tử cha liền kề của nó (tức là container trong ví dụ trên) là một vùng mà phần tử sticky có thể hoạt động được, còn nằm ngoài vùng đó phần tử sticky sẽ không hoạt động. Trong phần tử cha không có bất cứ phần tử con nào để nằm nổi lên vì nó chỉ có một phần tử con duy nhất và phần tử con này lại chính là phần tử Sticky.container, thì nó mới thực sự hoạt động. Đó là vì khi một phần tử được set style là
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6, thì phần tử cha liền kề của nó (tức là container trong ví dụ trên) là một vùng mà phần tử sticky có thể hoạt động được, còn nằm ngoài vùng đó phần tử sticky sẽ không hoạt động. Trong phần tử cha không có bất cứ phần tử con nào để nằm nổi lên vì nó chỉ có một phần tử con duy nhất và phần tử con này lại chính là phần tử Sticky.

Position Sticky hoạt động như thế nào?

CSS position sticky có 2 thành phần chính, đó là sticky item và sticky container. có 2 thành phần chính, đó là sticky itemsticky container.

Sticky item là một phần tử mà chúng ta định nghĩa style cho nó là

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6. Phần tử này sẽ nằm trôi nổi trên màn hình dựa trên vị trí mà chúng ta định nghĩa: Ví dụ:
<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
5 hay
<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
6.
là một phần tử mà chúng ta định nghĩa style cho nó là
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6. Phần tử này sẽ nằm trôi nổi trên màn hình dựa trên vị trí mà chúng ta định nghĩa: Ví dụ:
<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
5 hay
<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
6.

.some-component {
  position: sticky;
  top: 0px;
}

Sticky container là một phần tử HTML chứa các phần tử sticky bên trong. Đây là một vùng giới hạn mà các phần tử sticky bên trong được phép hoạt động. Khi bạn định nghĩa một phần tử với

body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6 thì lúc đó bạn đang tự động định nghĩa phần tử cha là một sticky container. Điều này rất quan trọng, container là một phạm vi mà các sticky item bên trong không thể vượt ra bên ngoài nó. là một phần tử HTML chứa các phần tử sticky bên trong. Đây là một vùng giới hạn mà các phần tử sticky bên trong được phép hoạt động. Khi bạn định nghĩa một phần tử với
body{
    height: 2000px;
}

.cha{
    width: 500px;
    height: 1000px;
    margin: 30px auto;
    padding: 10px;
    background-color: #eee;
}

.con{
    width: 480px;
    height: 300px;
    margin-top: 30px;
    background-color: #666;
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
6 thì lúc đó bạn đang tự động định nghĩa phần tử cha là một sticky container. Điều này rất quan trọng, container là một phạm vi mà các sticky item bên trong không thể vượt ra bên ngoài nó.

Đây là lý do tại sao ở trong ví dụ trên, sticky item không hoạt động vì nó là sticky item duy nhất nằm trong container.sticky item duy nhất nằm trong container.

Ví dụ về Position Sticky:

Hướng dẫn css is sticky - css là dính

Như mình đã nói ở đầu bài viết, CSS Position Sticky hoạt động khác với các giá trị position khác. Tuy nhiên, nó cũng có một số điểm tương đồng với chúng. Hãy để mình giải thích:

Relative (hoặc Static) - Position Sticky khá giống với 2 giá trị này, bởi vì nó vẫn giữ một khoảng cách tự nhiên trong DOM. - Position Sticky khá giống với 2 giá trị này, bởi vì nó vẫn giữ một khoảng cách tự nhiên trong DOM.

Fixed - khi phần tử sticky được stick lại, thì nó hoạt động như một phần tử fixed và nằm nổi lên trên các phần tử khác, đồng thời nó cũng bị xoá khỏi flow. - khi phần tử sticky được stick lại, thì nó hoạt động như một phần tử fixed và nằm nổi lên trên các phần tử khác, đồng thời nó cũng bị xoá khỏi flow.

Absolute - ở cuối của phạm vi container, phần tử sẽ dừng lại và xếp chồng lên trên các phần tử khác, khá giống với

<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
8 - ở cuối của phạm vi container, phần tử sẽ dừng lại và xếp chồng lên trên các phần tử khác, khá giống với
<!-- DOESN'T WORK!!! -->
<style>
  .sticky {
    position: sticky;
    top: 0;
  }
</style>
<div class="wrapper">
  <div class="sticky">
    SOME CONTENT
  </div>
</div>
8

Hỗ trợ trình duyệt

  • Position Sticky đã được hỗ trợ trên các trình duyệt phổ biến hiện nay, trừ IE và Opera Mini.
  • Đối với trình duyệt Safari chúng ta sẽ cần thêm
    <!-- DOESN'T WORK!!! -->
    <style>
      .sticky {
        position: sticky;
        top: 0;
      }
    </style>
    <div class="wrapper">
      <div class="sticky">
        SOME CONTENT
      </div>
    </div>
    
    9 prefix.
position: -webkit-sticky; /* Safari */
position: sticky;

Hướng dẫn css is sticky - css là dính


Tài liệu tham khảo: https://medium.com/@elad/css-position-sticky-how-it-really-works-54cd01dc2d46 https://medium.com/@elad/css-position-sticky-how-it-really-works-54cd01dc2d46