主頁 > 企業開發 > 記錄--讓整個網站界面無滾動條

記錄--讓整個網站界面無滾動條

2023-07-01 08:42:11 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

界面無滾動條

滾動條的優化也有很多種,比如隨便再網上搜索美化瀏覽器滾動條樣式,就會出現些用css去美化滾動條的方案,
那種更好呢?

沒有更好只有更合適

  • 像默認的滾動條的話,他能讓你方便摁著往下滑動(他比較寬)特別省勁,不用擔心美化過后變細摁不到問題,
  • 美化后的滾動條樣式啊更貼合網站主題,讓用戶體驗更好,
  • 無滾動條(滑鼠放上去后出現)這種更適合像一個頁面好多個塊,每個塊的話還很多內容(都有滾動條),如果像這種都默認都出現滾動條的話,也太不美觀了,

那咱們就從無滾動條展開說說!!!

無滾動條設計

比如像element ui組件內像input的自定義模塊資料過多的時候出現的下拉框內的滾動條,如下圖:

element-ui里面它其實是有內部組件el-scrollbar在的,那么它是怎么實作無滾動條呢?

如下圖咱們先把:hover勾選上讓滾動條一直處于顯示得狀態,然后咱們再分析他的實作,

當我把樣式稍微修改下,咱們再觀察下圖:

01.jpg

這么看是不是就很明白了 他其實用margin值把整個容器擴大了點然后溢位隱藏,其實滾動潭訓在就是給界面上看不到了而已,

然后它自己用dom畫了個滾動條,如下圖:

02.jpg

經過上面分析,咱們已經很清楚得了解到一個無滾動條是從那個方面實作得了,

  1. 使用margin值把滾動條給溢位隱藏掉,
  2. 使用div自己畫了一個滾動條,方便咱們隱藏、顯示、更改樣式等,

無滾動條實作

那咱們再從細節上拆分下具體實作要考慮那些點:

  1. 需要計算滾動條得寬度用來margin擴大得距離(每個界面上得滾動條得寬度是不一樣得),
  2. 需要計算畫的div滾動條得高度(這個內容多少會影響滾動條的高度),
  3. 需要根據滾動條去transform: translateY(19.3916%);移動咱們自己畫的div滾動條的,
  4. 需要根據摁著畫的div滾動條,去實際更改需要滾動的高度,
  5. 需要點擊滾動軸的柱子支持跳到目標的滾動位置;

一 計算界面原本滾動條的寬度

計算下界面上原本滾動條的寬度如下:

let scrollBarWidth;

export default function() {
  if (scrollBarWidth !== undefined) return scrollBarWidth;

  const outer = document.createElement('div');
  outer.className = 'el-scrollbar__wrap';
  outer.style.visibility = 'hidden';
  outer.style.width = '100px';
  outer.style.position = 'absolute';
  outer.style.top = '-9999px';
  document.body.appendChild(outer);

  const widthNoScroll = outer.offsetWidth;
  outer.style.overflow = 'scroll';

  const inner = document.createElement('div');
  inner.style.width = '100%';
  outer.appendChild(inner);

  const widthWithScroll = inner.offsetWidth;
  outer.parentNode.removeChild(outer);
  scrollBarWidth = widthNoScroll - widthWithScroll;

  return scrollBarWidth;
};

先創建了一個div, 設定成scroll, 然后再在里面嵌套一個沒有滾動條的div設定寬度100%, 獲取到兩者的offsetWidth, 相級訓取到scrollBarWidth賦值給scrollBarWidth 是惰性加載的優化,只需要計算一次就可以了, 具體展現如下圖:

03.jpg

二 計算畫的滾動條的高度height

計算下畫的div滾動條的高度height,是用當前容器的內部高度 / 容器整個滾動條的高度 * 100計算出百分比;

比如:

const warp = this.$refs.wrap; // 或者使用documnet獲取容器
const heightPercentage = (wrap.clientHeight * 100 / wrap.scrollHeight); // height
const widthPercentage = (wrap.clientWidth * 100 / wrap.scrollWidth); // width

決議: 如當前容器高30px,內容撐起來總共高100px,那么滾動條的高度就是當前容器的30%;

三 計算滾動條需要移動的值

計算畫的div需要滾動條的高度moveY是, 獲取當前容器滾動的scrollTop / 當前容器內部高度 * 100

演算法一:

決議 使用transform: translateY(0%);是移動的是自己本身的百分比那么(容器滾動的scrollTop / 當前容器內部高度 * 100)演算法如下:

 
const warp = this.$refs.wrap; // 或者使用documnet獲取容器
this.moveY = ((wrap.scrollTop * 100) / wrap.clientHeight);
this.moveX = ((wrap.scrollLeft * 100) / wrap.clientWidth);

演算法二:

決議:使用定位top值,這個比較好理解滾動條的滾動 / 容器的滾動總高度 * 100得到百分比,如下:

 
const warp = this.$refs.wrap; // 或者使用documnet獲取容器
this.moveY = ((wrap.scrollTop * 100) / wrap.scrollHeight);
this.moveX = ((wrap.scrollLeft * 100) / wrap.scrollWidth);

把計算出來的moveYmoveX的方法 系結給scroll 滾動事件就可以了,

四 摁著畫的div滾動條 經行拖動

滾動條都是支持拖著上下左右移動的,那咱們也要支持下:

  • 獲取當前滾動條的高度或者寬度可以使用getBoundingClientRect()如下圖:
  • 獲取拖著移動的距離 就是再滑鼠摁下先計一個當前的x1、y1監聽movex2、y2相減就是拖動的距離了,
  • 獲取到拖動的距離后轉成transform || top值,

一個簡單的拖動組件如下:

<template>
  <div
    ref="draggableRef"
    
    :style="style"
  >
    <slot />
  </div>
</template>

<script>
export default {
  name: 'DraggableComponent',

  props: {
    initialValue: {
      type: Object,
      required: false,
      default: () => ({ x: 0, y: 0 }),
    },
  },

  data() {
    return {
      currentValue: { x: 0, y: 0 },
      isDragging: false,
      startX: 0,
      startY: 0,
      diffX: 0,
      diffY: 0,
    };
  },

  computed: {
    style() {
      return `left: ${this.currentValue.x + this.diffX}px; top: ${this.currentValue.y + this.diffY}px`;
    },
  },

  watch: {
    initialValue: {
      handler(val) {
        this.currentValue = https://www.cnblogs.com/smileZAZ/p/val;
      },
      immediate: true,
    },
  },

  mounted() {
    this.$nextTick(() => {
      const { draggableRef } = this.$refs;
      if (draggableRef) {
        draggableRef.addEventListener('mousedown', this.startDrag);
        document.addEventListener('mousemove', this.moveDrag);
        document.addEventListener('mouseup', this.endDrag);
      }
    });
  },

  beforeDestroy() {
    const { draggableRef } = this.$refs;
    draggableRef.removeEventListener('mousedown', this.startDrag);
    document.removeEventListener('mousemove', this.moveDrag);
    document.removeEventListener('mouseup', this.endDrag);
  },

  methods: {
    startDrag({ clientX: x1, clientY: y1 }) {
      this.isDragging = true;
      document.onselectstart = () => false;
      this.startX = x1;
      this.startY = y1;
    },

    moveDrag({ clientX: x2, clientY: y2 }) {
      if (this.isDragging) {
        this.diffX = x2 - this.startX;
        this.diffY = y2 - this.startY;
      }
    },

    endDrag() {
      this.isDragging = false;
      document.onselectstart = () => true;
      this.currentValue.x += this.diffX;
      this.currentValue.y += this.diffY;
      this.diffX = 0;
      this.diffY = 0;
    },
  },
};
</script>

<style>
.draggable {
  position: fixed;
  z-index: 9;
}
</style>

咱們需要獲取到畫的滾動條的高度,然后根據拖動的距離算出來transform: translateY(0%);或者top值;
如上面拖動組件 拖動部分代碼就不在重復了 咱們直接用diffX、diffY、lastX、lastY來用了,

  • diffX、diffY 是拖動差的值
  • lastX、lastY 是上一次也就是未拖動前的值translateY || top

演算法一(transform)

const thumb = document.querySelector('el-scrollbar__thumb'); // element ui  el-scrollbar 的滾動條
const { height: thumbHeight } = thumb?.getBoundingClientRect() || {};


const diffY = 10;
const lastY = '300'; // transform: translateY(300%);`
const moveY = (diffY / thumbHeight) + lastY;
演算法二(top)
 
const thumb = document.querySelector('el-scrollbar__thumb'); // element ui  el-scrollbar 的滾動條
const { height: thumbHeight } = thumb?.getBoundingClientRect() || {};


const diffY = 10;
const lastY = 30; // top: 30%`
const moveY = (diffY / wrap.scrollWidth * 100) + lastY;

五 點擊滾動軸使滾動條跳轉到該位置

  • getBoundingClientRect 的 top 是獲取到距離瀏覽器頂部的距離, 寫一個點擊事件如下
function clickTrackHandler(event) {
  const wrap = this.$refs.wrap;
  // 1. 減去clientX  正好能獲取到需要滾動到的位置
 const offset = Math.abs(e.target.getBoundingClientRect().top - e.clientX);

 // 2. 利用offset 的到畫的滾動條的實際位置 兩種演算法transform || top
  const thumb = document.querySelector('el-scrollbar__thumb'); // element ui  el-scrollbar 的滾動條
  const { height: thumbHeight } = thumb?.getBoundingClientRect() || {};

  const translateY = offset / height * 100; // transform 
  const top = offset / wrap.scrollHeight * 100; // top

  // 3、計算實際需要滾動的高度 使界面滾動到該位置,兩種演算法transform(scrollTop2) || top(scrollTop1)
  const scrollTop1 = top * wrap.scrollHeight; // top
  const scrollTop2 = translateY * wrap.clientHeight; // transform
}

本文轉載于:

https://juejin.cn/post/7227033124856135738

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556432.html

標籤:Html/Css

上一篇:如何實作巡檢報告?

下一篇:返回列表

標籤雲
其他(161947) Python(38266) JavaScript(25517) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7278) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1982) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--讓整個網站界面無滾動條

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 界面無滾動條 滾動條的優化也有很多種,比如隨便再網上搜索美化瀏覽器滾動條樣式,就會出現些用css去美化滾動條的方案。 那種更好呢? 沒有更好只有更合適 像默認的滾動條的話,他能讓你方便摁著往下滑動(他比較寬)特別省勁,不用擔心美化過后變細 ......

    uj5u.com 2023-07-01 08:42:11 more
  • 如何實作巡檢報告?

    # 什么是巡檢報告 巡檢報告是指對某一個系統或設備進行全面檢查,并把檢查結果及建議整理成報告的程序。 巡檢報告通常用于評估系統或設備的運行狀況與性能,以發現問題、優化系統、提高效率、降低故障率等方面提供參考。 ![file](https://img2023.cnblogs.com/other/233 ......

    uj5u.com 2023-07-01 08:41:36 more
  • HTML網頁內容適配——標題欄

    前言 現在很多網頁用的都是固定標題欄,就像這樣: 很多網站為了兼容小視窗還會做個JS適配: 但是如果視窗比這還小的話... 那就只剩下一部分了。 由于設定position:fixed后元素不會隨著滾動條滾動,所以超出頁面邊緣的部分將永遠看不見,除非增大視窗或縮小顯示比例。 很多設計師忘記考慮這一點了 ......

    uj5u.com 2023-07-01 08:40:26 more
  • 1.1 Metasploit 工具簡介

    Metasploit 簡稱(MSF)是一款流行的開源滲透測驗框架,由`Rapid7`公司開發,可以幫助安全和IT專業人士識別安全性問題,驗證漏洞的緩解措施,并管理專家驅動的安全性進行評估,提供真正的安全風險情報。并且該框架還提供了一系列攻擊模塊和`Payload`工具,可用于漏洞利用、及漏洞攻擊。同... ......

    uj5u.com 2023-07-01 08:39:46 more
  • 1.1 Metasploit 工具簡介

    Metasploit 簡稱(MSF)是一款流行的開源滲透測驗框架,由`Rapid7`公司開發,可以幫助安全和IT專業人士識別安全性問題,驗證漏洞的緩解措施,并管理專家驅動的安全性進行評估,提供真正的安全風險情報。并且該框架還提供了一系列攻擊模塊和`Payload`工具,可用于漏洞利用、及漏洞攻擊。同... ......

    uj5u.com 2023-07-01 08:38:27 more
  • Vue3從入門到精通(三)

    vue3插槽Slots 在 Vue3 中,插槽(Slots)的使用方式與 Vue2 中基本相同,但有一些細微的差異。以下是在 Vue3 中使用插槽的示例: // ChildComponent.vue <template> <div> <h2>Child Component</h2> <slot></ ......

    uj5u.com 2023-06-30 09:07:11 more
  • 記錄--寫一個高德地圖巡航功能的小DEMO

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 風格設定 加載地圖 使用AMapLoader.load加載地圖,從 控制臺 申請一個屬于自己的key import AMapLoader from '@amap/amap-jsapi-loader'; ... const AMap = a ......

    uj5u.com 2023-06-30 08:29:46 more
  • CSS基礎-背景

    # 背景 ### **background-color** 背景顏色, 可以使用十六進制、rgb、rgba表示。 **語法** ```css /**selector 背景元素的原則去*/ /** color 背景顏色的值, 可以是 顏色名稱、十六進制值、RGB、RGBA*/ selector { b ......

    uj5u.com 2023-06-30 08:29:30 more
  • 京東到家小程式-在性能及多端能力的探索實踐

    為了提高研發效率,經過技術選型采用了taro3+原生混合開發模式,本文主要講解我們是如何基于taro框架,進行多端能力的探索和性能優化。 ......

    uj5u.com 2023-06-30 08:29:18 more
  • 初入前端-HTML

    ## HTML ### HTML歷史 HTML(Hypertext Markup Language)的歷史可以追溯到上世紀90年代初,以下是HTML的主要歷史階段: 1. HTML 1.0:在1991年發布,是HTML的最初版本,用于創建基本的文本和鏈接結構,但功能有限。 2. HTML 2.0:于 ......

    uj5u.com 2023-06-30 08:29:14 more