成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧用 CSS sticky 實現返回頂部功能

開發 前端
又是點擊的,又是滾動的,看著好像必須要借助 JavaScript 了,其實也可不必,經過我的一番琢磨,僅僅使用一點點 CSS 就能實現這樣的交互效果,一起看看吧

[[433133]]

經常在某些文檔中或者文章中可以看到這樣一個"返回頂部"的功能,具體有兩個交互:

  1.   只有滾動一定距離才會出現,返回到頂部重新隱藏
  2.   點擊會返回到頂部

比如 LuLu UI[1]

又是點擊的,又是滾動的,看著好像必須要借助 JavaScript 了,其實也可不必,經過我的一番琢磨,僅僅使用一點點 CSS 就能實現這樣的交互效果,一起看看吧!

一、粘性滾動

這里就需要一點點想象了。比如這里滾動到一定距離才出現,是不是有點類似 CSS sticky[2] 的概念?只不過 sticky 的一般作用是滾動到一定距離,然后就固定到某一位置,mdn 解釋如下

元素根據正常文檔流進行定位,然后相對它的*最近滾動祖先(nearest scrolling ancestor)*和 containing block[3] (最近塊級祖先 nearest block-level ancestor),包括table-related元素,基于top, right, bottom, 和 left的值進行偏移。偏移值不會影響任何其他元素的位置。

雖然和我們需要的交互有點出路,但是仍然可以通過一定的“技巧”聯合起來,先簡單實現一下布局:

  1. <a class="back"></a>  
  2. <article>  
  3. ...很多內容  
  4. </article> 

這里注意需要將.back 放在前面,不然沒法觸發粘性定位,然后給 .back加上 sticky 定位。

  1. .back{  
  2.   position: sticky;  
  3.   display: block;  
  4.   top: 0;  
  5.   border-radius: 50%;  
  6.   background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E %3Cpath fill='%23ffffff' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'%3E%3C/path%3E %3C/svg%3E") center no-repeat dodgerblue; 
  7.   background-size: 50%;  
  8.   width: 50px;  
  9.   height: 50px;  

由于這里的 top 給的為 0,所以返回按鈕在滾動過程中是貼在頂部的,如下:

這時,如果把 top 改為一個負值會怎么樣呢? 

  1. .back{  
  2.   /**/  
  3.   position: sticky;  
  4.   top: -30px;  

可以看到,按鈕會在超出屏幕 -30px 的地方固定,如下:

接著,我們把.back向下偏移整個屏幕距離,也就是 100vh。

  1. .back{  
  2.   /**/  
  3.   position: sticky;  
  4.   top: -30px;  
  5.   transform: translateY(100vh);  

這樣,和我們需要的效果已經很接近了,只是最后只出現了一部分,如下:

原理示意如下:

最后,把剛才的top設置的更小一些,直到.back可以完全出現,比如設置 -60px。

  1. .back{  
  2.   /**/  
  3.   position: sticky;  
  4.   top: -60px;  
  5.   transform: translateY(100vh);  

這樣基本上就完成了,不過還有一些問題,接著往下看。

二、右下角的處理

上面的實現其實還有兩個布局問題需要優化:

  1.  按鈕本身占據了一定的空間
  2.  按鈕一般位于右下角

一般為了讓一個元素不占空間,可能想到的方法是設置絕對定位。但是這里由于設置了 position: sticky,所以肯定不能再設置絕對定位了。除此之外,我們還可以采用浮動float,可以很輕易的解決以上兩個布局問題 

  1. .back{  
  2.   /***/  
  3.   float: right  

設置右浮動有兩個好處,一是脫離文檔流,不影響高度,二是實現居右效果,實際效果如下:

其實到了這里,還是有個小問題的,當頭部的文字比較多時,可以很清楚的看到右環繞效果,如下:

如何處理呢?很簡單,加一個負的margin就可以了。

  1. .back{  
  2.   /***/  
  3.   float: right;  
  4.   margin-top:-50px;/*自身高度*/  

但是又出現了新的問題,底下的按鈕又漏出來了。

由于 top已經被sticky占用,現在改變按鈕位置就只能靠transform了,這里可以用calc進行計算,同時top也要相應減少自身高度。 

  1. .back{  
  2.   /***/  
  3.   float: right;  z  margin-top:-50px;/*自身高度*/  
  4.   top: -110px; /*60 + 50*/  
  5.   transform: translateY(calc(100vh + 50px));  

完美!

三、返回頂部

返回頂部就比較容易了,一般可以通過href='#'就可以實現,當然,為了平滑的滾動,可以加上scroll-behavior: smooth。 

  1. html, body {   
  2.   scroll-behavior:smooth;   

實際效果如下:

最后附上完整代碼,非常少。 

  1. html,body{  
  2.   scroll-behavior: smooth;  
  3.  
  4. .back{  
  5.   position: sticky;  
  6.   float: right;  
  7.   top: -110px;  
  8.   margin-top: -50px;  
  9.   border-radius: 50%;  
  10.   background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E %3Cpath fill='%23ffffff' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'%3E%3C/path%3E %3C/svg%3E") center no-repeat dodgerblue; 
  11.   background-size: 50%;  
  12.   width: 50px;  
  13.   height: 50px;  
  14.   transform: translateY(calc(100vh + 50px));  

HTML 只需要在起始地方加一個標簽即可。 

  1. <body>  
  2.   <a class="back" href="#"></a><!--添加再這里就行了-->  
  3.   <article>  
  4.   ...很多內容  
  5.   </article>  
  6. </body> 

線上代碼可訪問 back-top \(codepen.io\)[4]

四、總結和說明

以上借助 CSS sticky 實現了一個自動顯示返回按鈕的小交互,本身代碼量并不復雜,其實是一點點想象力,把比較相似的效果聯想起來,多多嘗試,可能會帶來不一樣的解決方案。下面總結一下實現要點:

  1.   CSS sticky 可以實現粘性滾動效果,可以設置負值
  2.   transformY(100vh)可以偏移1屏幕高度,不影響占位
  3.   浮動可以脫離文檔流,不影響高度
  4.   負的 margin 可以抵消浮動的環繞效果
  5.   scroll-behavior: smooth 可以實現平滑滾動
  6.   兼容性取決于 sticky,不兼容IE

還算是一個比較實用的小功能,雖然 JS 也能實現,但是能用 CSS 實現的何必麻煩 JS 呢?相比 JS 而言,CSS 使用起來簡單方便,也無需考慮加載問題,幾乎零成本。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2022-01-13 07:04:54

CSS 技巧Loading 動畫

2023-06-27 09:33:15

Loading 動畫CSS

2023-10-14 15:29:28

RedisFeed

2022-02-16 08:21:28

CSS三角邊框動畫SVG

2022-01-28 09:01:49

架構

2022-04-12 07:37:08

CSS滾動視差效果前端

2020-12-24 08:37:41

Css前端加載動畫

2021-08-30 06:20:39

CSS 技巧3D 效果

2023-04-06 00:19:26

CSSSticky前端

2009-11-10 13:27:30

VB.NET RND(

2025-04-16 05:00:00

2010-01-25 12:58:26

2025-02-18 10:13:20

2021-08-05 23:09:53

前端程序員CSS

2010-09-03 10:58:45

DIVCSS

2022-02-28 07:02:51

CSS二維碼前端

2010-01-22 09:01:02

2021-02-01 00:04:13

Dictionary數據批量

2024-10-22 08:47:03

2024-09-09 15:24:26

Redis開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人国产精品免费观看视频 | 麻豆精品一区二区三区在线观看 | 国产精品一区久久久久 | 久久一起草 | 在线免费观看黄a | 亚洲精品乱码久久久久久黑人 | 国产精品久久精品 | 国产美女精品视频 | 亚洲视频一区在线观看 | 免费一区 | 日韩精品一区二区三区在线 | 2018天天干天天操 | av一区二区三区四区 | www.97zyz.com | 欧美日韩国产不卡 | 久久精品小视频 | 成人夜晚看av | 亚洲在线电影 | 亚洲精品一区二区三区免 | 欧区一欧区二欧区三免费 | 欧美国产精品一区二区三区 | 视频第一区 | 久久久久99 | 日韩av成人在线观看 | 99亚洲精品 | 日日夜夜精品免费视频 | 午夜小影院| 国产午夜影院 | 欧美综合在线视频 | 99视频在线免费观看 | 午夜视频免费在线 | 国产视频黄色 | 一级看片免费视频 | 午夜精品福利视频 | 欧美区在线 | 中文字幕成人网 | 精品一区二区三区在线观看国产 | 中文字幕欧美一区 | 在线观看中文字幕 | 欧美美女爱爱视频 | 在线亚洲欧美 |