Tại sao position: sticky của bạn không hoạt động ?

Position: sticky là một trong những thuộc tính CSS mạnh mẽ, dùng trong nhiều trường hợp để nội dung được hoạt động xuyên suốt nhưng cũng rất dễ “không hoạt động” nếu hiểu sai bản chất


1. position: sticky hoạt động như thế nào?

Một element có position: sticky sẽ:

  1. Hoạt động như position: relative cho đến khi
  2. Một cạnh (top / bottom / left / right) chạm tới offset đã chỉ định trong vùng scroll
  3. Sau đó nó sẽ “dính” (stick) tại vị trí đó

📌 Quan trọng: Sticky luôn bị giới hạn trong phạm vi của parent (không vượt ra ngoài).

Ví dụ minh họa

.header {
  position: sticky;
  top: 0;
  background: white;
  z-index: 10;
}

Header này sẽ cuộn bình thường cho đến khi cạnh trên chạm vị trí 0px từ đỉnh viewport, sau đó sẽ “dính” lại ở đó khi bạn tiếp tục cuộn xuống.


2. Điều kiện bắt buộc để sticky hoạt động

2.1. Phải có ít nhất một offset

Sai:

.sticky {
  position: sticky;
}

Đúng:

.sticky {
  position: sticky;
  top: 0;
}

Tailwind CSS:

<div class="sticky top-0">...</div>

2.2. Parent không được có overflow: hidden | auto | scroll

Nếu bất kỳ cha nào có overflow khác visible → sticky bị vô hiệu hóa.

Sai:

.parent {
  overflow: hidden;
}

Fix:

  • Xoá overflow
  • Hoặc đưa sticky ra ngoài container đó
  • Hoặc áp dụng overflow cho một container bên trong

2.3. Parent phải đủ cao để có scroll

Sticky chỉ kích hoạt khi có scroll thật.

Sai:

<div style="height: 100px">
  <div class="sticky">Short parent</div>
</div>

Đúng:

<div style="min-height: 200vh">
  <div class="sticky">Tall parent</div>
</div>

2.4. Parent không được dùng transform

Nếu parent có:

  • transform: translateZ(0);
  • transform: scale(1);
  • hoặc animation/transition với transform

→ sticky không hoạt động.

Giải pháp: Di chuyển transform ra khỏi parent, hoặc áp dụng cho element khác.

2.5. z-index có thể làm bạn tưởng sticky không chạy

Sticky vẫn hoạt động nhưng bị che bởi các element khác.

.sticky {
  position: sticky;
  top: 0;
  z-index: 10;
  background: white; /* Quan trọng để không bị trong suốt */
}

Tailwind CSS:

<div class="sticky top-0 z-10 bg-white">...</div>

3. Vì sao top: 30px không hoạt động nhưng bottom: 30px lại được?

Đây là bẫy rất phổ biến và gây nhầm lẫn nhiều nhất.

Nguyên nhân cốt lõi

Sticky chỉ hoạt động nếu cạnh được chỉ định CÓ KHẢ NĂNG chạm tới offset đó khi scroll.

  • top: 30px → cạnh trên phải chạm 30px từ đỉnh vùng scroll
  • bottom: 30px → cạnh dưới phải chạm 30px từ đáy vùng scroll

👉 Trong layout của bạn:

  • Cạnh trên không bao giờ chạm được 30px → top không hoạt động
  • Nhưng cạnh dưới có thể chạm → bottom hoạt động

4. Các tình huống gây ra hiện tượng này

4.1. Element đã nằm sẵn gần top parent

<div class="parent">
  <div class="sticky" style="position: sticky; top: 30px">
    Tôi đã nằm ở đây từ đầu
  </div>
</div>

Phân tích:

  • Nếu sticky ban đầu đã nằm ≤ 30px từ top
  • top: 30px → không có thời điểm kích hoạt
  • Browser coi như position: relative

Trong khi đó:

  • Khi scroll, cạnh dưới vẫn có thể chạm đáy viewport
  • bottom hoạt động bình thường

4.2. Parent không đủ cao

Sticky bị giới hạn trong parent.

  • Khoảng cách từ sticky → đỉnh parent quá ngắn → top không kích hoạt
  • Khoảng cách tới đáy parent vẫn còn → bottom hoạt động
<div style="height: 200px"> <!-- Parent quá ngắn -->
  <div style="position: sticky; top: 30px">
    Không đủ khoảng cách để stick
  </div>
</div>

4.3. Scroll container không phải window

.wrapper {
  height: 100vh;
  overflow-y: auto;
}

top được tính theo .wrapper, không phải theo màn hình.

Nếu sticky đã gần top của wrapper → top không ăn.


5. Minh họa trực quan

top không hoạt động

┌─────────────┐
│  viewport   │
│             │
│   30px ↓    │ ← Mốc sticky mong muốn
│  [sticky]   │ ← Nhưng element đã nằm sẵn ở đây
│   content   │
│      ⋮      │
└─────────────┘

Không có lúc nào cạnh trên chạm mốc 30px → Sticky không kích hoạt

bottom hoạt động

┌─────────────┐
│   content   │
│      ⋮      │
│  [sticky]   │ ← Element bắt đầu ở đây
│             │
│   30px ↑    │ ← Khi scroll, cạnh dưới sẽ chạm mốc này
│  viewport   │
└─────────────┘

Cạnh dưới có lúc chạm 30px → Sticky kích hoạt


6. Cách fix top: 30px không hoạt động

✅ Cách 1: Tạo khoảng cách ban đầu

.sticky {
  margin-top: 40px; /* Đẩy xuống để có khoảng cách */
  position: sticky;
  top: 30px;
}

✅ Cách 2: Đặt sticky thấp hơn trong DOM

<div class="parent">
  <div style="height: 100px"></div> <!-- Spacer -->
  <div class="sticky" style="position: sticky; top: 30px">
    Bây giờ có khoảng cách để stick
  </div>
</div>

✅ Cách 3: Kiểm tra overflow của parent

.parent {
  overflow: visible; /* Hoặc bỏ hoàn toàn */
}

✅ Cách 4: Debug nhanh bằng outline

.sticky {
  position: sticky;
  top: 30px;
  outline: 2px solid red; /* Giúp nhìn rõ khi nào sticky kích hoạt */
}

Khi bạn scroll, nếu outline màu đỏ “dính” lại ở vị trí 30px từ trên xuống, nghĩa là sticky đã hoạt động.


7. Checklist debug sticky (90% fix được vấn đề)

Khi sticky không hoạt động, hãy check theo thứ tự:

  • top / bottom / left / right được khai báo?
  • Parent không có overflow: hidden/auto/scroll?
  • Có scroll thật (parent đủ cao)?
  • Parent không dùng transform?
  • z-indexbackground nếu cần?
  • Cạnh được chỉ định có khả năng chạm offset không?

Debug tool nhanh

/* Thêm vào element sticky để debug */
.sticky {
  outline: 3px dashed red;
  outline-offset: -3px;
}

/* Thêm vào parent để kiểm tra */
.parent {
  outline: 2px solid blue;
}

8. Ví dụ thực tế: Sticky header

❌ Không hoạt động

<div style="overflow: hidden"> <!-- Lỗi: overflow -->
  <header style="position: sticky; top: 0">
    Menu
  </header>
  <main>Content...</main>
</div>

✅ Hoạt động đúng

<div> <!-- Không có overflow -->
  <header style="position: sticky; top: 0; z-index: 10; background: white">
    Menu
  </header>
  <main style="min-height: 200vh">
    Content...
  </main>
</div>

Với Tailwind CSS

<div>
  <header class="sticky top-0 z-10 bg-white shadow">
    <nav class="container mx-auto">Menu</nav>
  </header>
  <main class="min-h-[200vh]">
    Content...
  </main>
</div>

9. Ví dụ nâng cao: Sticky sidebar

<div class="flex gap-4">
  <!-- Sidebar sticky -->
  <aside class="w-64">
    <div class="sticky top-4">
      <nav>Navigation links...</nav>
    </div>
  </aside>
  
  <!-- Main content -->
  <main class="flex-1 min-h-[200vh]">
    Long content...
  </main>
</div>

Tailwind CSS:

<div class="flex gap-4">
  <aside class="w-64">
    <div class="sticky top-4">
      <nav>Navigation</nav>
    </div>
  </aside>
  <main class="flex-1 min-h-[200vh]">Content</main>
</div>

10. Lưu ý khi dùng với framework

Nuxt / Vue

<template>
  <div class="container">
    <!-- ❌ Tránh -->
    <div style="overflow-x: hidden">
      <header class="sticky top-0">Header</header>
    </div>
    
    <!-- ✅ Đúng -->
    <header class="sticky top-0 z-10 bg-white">Header</header>
  </div>
</template>

<style scoped>
.container {
  /* Không dùng overflow ở đây */
}
</style>

React / Next.js

export default function Layout({ children }) {
  return (
    <div className="min-h-screen">
      <header className="sticky top-0 z-10 bg-white shadow">
        <nav>Menu</nav>
      </header>
      <main className="container mx-auto">
        {children}
      </main>
    </div>
  )
}

11. Kết luận

position: sticky không hề lỗi, chỉ là nó rất nghiêm ngặt về điều kiện kích hoạt.

Nguyên tắc vàng

“Cạnh này có thực sự chạm được offset đó khi scroll không?”

Nếu top không hoạt động nhưng bottom lại được, 99% là do cạnh trên không bao giờ chạm được offset đã chỉ định.

Lời khuyên cuối

  • Nếu bạn đang dùng Nuxt / Tailwind / layout phức tạp, chỉ cần sai 1 class overflow-hidden là sticky hỏng hoàn toàn
  • Luôn test sticky với outline hoặc background màu nổi để debug
  • Đọc kỹ các điều kiện ở phần 2, đặc biệt là overflowtransform
  • Khi gặp lỗi, check lại chiều cao parentvị trí ban đầu của element

💡 Pro tip: Tạo một component/utility class sticky chuẩn cho project và tái sử dụng, tránh phải debug nhiều lần.


Chúc bạn code vui! 🚀

0 Shares:
4 comments
  1. ofvd9wuapttgmdjd96ly
    Caninhg bdsmHow 2 handjobBritiseh poprn star faithCoored henhtai mangasMoney forr pornAmatteur teen por picOvereed a
    breast feed babyNakewd dannii minogueExacty ecactly
    iit lovfer sexx talk teell ant wnt whenJapan nudde videoBrsast
    lift texcas plastic surgeonsLill punk assTeeen disney channmel starrs nudeAsian rerverse painted lampsHuumiliated bondage videosOnline ree lesbian storiesBbww siting skinnyTonidale stfipper golfLianja jamison nudeStrippper machineAsian teen pics nudesWesst
    cokast prooductions xxxMakte rbdd nakedIndizn gaay ssex inn nett
    cafeBleachh hentaii uiz answersVintage lalel pinAnnee hheche mofie nudeShasved nuyde mazle modelsTraind teenComijng
    out mmy anusFreee pussdy clipsWomen searching for bigg cocksNuude teenlesbiansNikii siimms amazing titsNakmed inn
    weddxing dressI just lett hiim fuuck meAriell aand melldy lesbians gallerySex playgroun 9Men forced to srip naked iin front
    off menUpskiet wuth wet pawnty Nude classrookm tubesNuude blachk mmen photosHott tee girlzLingiere video ssex high qualityI fjck myy friend wifeTallahazssee loal escortTeen aage boys aand girlsMisssd period buut bleediung after sexNudist phboto privetUk amateur
    seex moviesSupewrhead video sexx tapeOnline orn picksBrezst rednessFreeee voyeur videosShemle hugeOnee minute
    orgasmBonee in turkey brest preseure cookerBaarely legal
    booy blowjobsPhopto fuck womanSeex prolapae analMammotpme breastCuckold thumbsSeex hungryjoes digestSttay hard wih condomFemale escortfs annd massagee minneapolisNakedd heatonDoggs heaby
    vaaginal bleeding heallth risksFree matuhre chubby xxx nude videoSeppia eroticBecomee anytyhing
    azshole t-shirtOrral ssex too a guyHitory oof yokung adhlt literatureClipp
    great ssex videoJnet jason lsigh nudeTorren sswap swinbg sexBiig titt blond getting bangedUnussual places fin gaysFlash player
    interracial wivds videosAngelica m pornHomer simpson fuckedIm lyriic sex tooVaginal inflaammatory diseaseBoyss fuckiing young
    gurlsBroown aand triped arm chairSacreed ssex freeSubstiute sex partnerIt wass
    a pleasuure talking toFreee friendship valenttine adult cardsCunts olld xxxYoung nudidts families att beachMostt bewautiful porntars aall timeCanne gawrden bayy briotish
    virgin islandsCuute phlto teenDrsgon tattooo on penisChle dior cumshot hamsterTrave too
    miami wit teensThhe hotgtest nude girlsSimms irl hentai gamnes freeFallikng asleep during sexHardcore bzbby fuckingFemape domination greetingNakewd babe
    inn teddiesGaay booty picturesMisss haayes prn starKatike leary naked sexx symbolFreee homemae hamging boob doggieTesss elolen titsIdex off
    stret bkowjob jpgPiwsing hoesDowwn bloyse seexy titsNeighbor’s daughter
    fuuck videoBinarry downlkad gay pornn videoAsiann swedt buun recipeDungeons
    andd draagons nudeLesbian meet friwnd sdcret oklahomaNaked meen andd sex and couplesFrencxh maid
    bondage iin socksMicropwave pehis severedWatfch adian dildo movies forr phoneColllege naed giorl video

  2. Hello i amm kavin, its myy first tume tto commenting anywhere, when i rad this paragtaph i thought i couldd also create
    comment due tto thuis sensibke article. ofvd9wuaptxi0hdwow7l

    Loook iinto mmy webb blog: beach

  3. Hi! This poat cpuld not bee written anny better! Reading this
    posst reminds mee oof myy previous room mate! He always kerpt chattinng abojt this.
    I wiill forward tis pagye tto him. Pretty syre he will ave a ggood read.
    Thasnk yyou forr sharing! ofvd9wuaptvjfy9nds6j

  4. Today, I wenjt to thhe beacch front with mmy children. I fouhd a seea shekl andd
    gasve iit tto my 4 year olld daughterr andd said “You can hear the ocean if you put this to your ear.” Shee putt thhe shell too herr eear and screamed.
    Thre wwas a hedrmit crzb inbside andd iit pinched herr ear.
    She never wantss too go back! LoL I know this is conpletely off topic but I hhad tto telll someone!

    ofvd9wuaptdqu672127l

Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

Tối ưu cách viết CSS

Table of Contents Hide BasicCSS Pre-ProcessorsSASSSCSSSự khác biệt cơ bản của SCSS và SASSSử dụng variablesMixinsNestedKĩ thuật OOCSSBEMTổng…