WEB :實戰演練——從零實現一個交互輪播圖(附源碼)

文章目錄

  • 一、輪播圖整體功能規劃
  • 二、HTML結構深度解析
  • 三、CSS樣式實現細節
    • 1. 定位系統詳解
    • 2. 顯示/隱藏機制
    • 3. 按鈕交互效果實現
    • 4. 純CSS箭頭實現
    • 5. 指示器:當前位置可視化
  • 四、JavaScript邏輯深入解析
    • 1. 核心變量與DOM獲取
    • 2. 圖片切換函數(核心邏輯)
    • 3. 前后切換函數(邊界處理)
    • 4. 自動播放控制
    • 5. 指示器完整交互
    • 6. 事件綁定與初始化

輪播圖作為前端開發中的經典組件,廣泛應用于網站首頁、產品展示等場景。它不僅能在有限空間內展示多張圖片,還能通過動態效果提升用戶體驗。本文將從結構設計、樣式實現到交互邏輯,詳細講解如何從零構建一個功能完善的輪播圖。

輪播圖實現效果:

輪播圖

一、輪播圖整體功能規劃

在開始編碼前,我們需要明確輪播圖的核心功能:

  • 自動播放:圖片按固定時間間隔自動切換
  • 手動切換:通過左右按鈕控制圖片切換
  • 指示器導航:底部小圓點顯示當前位置,點擊可快速跳轉到對應圖片
  • 交互反饋:鼠標懸停時暫停自動播放,顯示操作按鈕;離開時恢復自動播放
  • 平滑過渡:圖片切換時使用動畫效果,避免生硬跳轉

二、HTML結構深度解析

輪播圖的HTML結構看似簡單,實則蘊含了清晰的層次設計:

<div class="box"><!-- 圖片容器組 --><div class="box-img"><img src="img/albumFolklore.jpg"> </div><div class="box-img"><img src="img/albumST.jpg"> </div><div class="box-img"><img src="img/albumSpring.jpg" > </div><div class="box-img"><img src="img/albumNTM.jpg"> </div> <!-- 控制按鈕 --><div class="left"> </div><div class="right"> </div><!-- 指示器 --><div class="dot"><ul id="dot-list"><li class="active" data-index="0"></li><li data-index="1"></li><li data-index="2"></li><li data-index="3"></li></ul></div>
</div>

結構設計考量

  • 為什么使用.box-img包裹圖片而非直接操作img標簽?

    • 便于統一控制圖片容器的顯示狀態(opacity)
    • 為后續可能的圖片加載動畫預留空間
    • 可以在不修改圖片本身的情況下添加過渡效果
  • 指示器為什么使用data-index屬性?

    • 建立指示器與圖片的一一對應關系
    • 無需通過復雜計算獲取索引,直接從DOM中讀取
    • 提高代碼可讀性和可維護性

三、CSS樣式實現細節

1. 定位系統詳解

.box{position: relative;
}
.box-img img{position: absolute;top: 0;left: 0;
}

這是輪播圖實現的核心基礎,通過定位系統實現了"多圖疊加"效果:

  • .box設置position: relative后,成為了所有子元素的"定位上下文"
  • 所有圖片設置position: absolutetop: 0; left: 0,使它們都從容器左上角開始定位
  • 最終效果是所有圖片在視覺上重疊在一起,為后續的顯示/隱藏切換奠定基礎

2. 顯示/隱藏機制

.box-img{opacity: 0;transition: opacity 0.5s ease-in-out;
}
.box-img:nth-child(1){opacity: 1;
}

為什么選擇opacity而不是其他方案?

  • 方案對比:

    • display: none:完全移除元素,無法實現過渡動畫
    • visibility: hidden:元素仍占據空間,且過渡效果有限
    • opacity: 0:元素仍存在于頁面中(可響應事件),支持平滑過渡
  • transition屬性詳解:

    • ease-in-out:緩動函數(開始和結束時較慢,中間較快)

3. 按鈕交互效果實現

按鈕設置了三種狀態:

  1. 鼠標移出盒子時隱藏
  2. 鼠標移入盒子但未移入按鈕為淺灰色
  3. 鼠標移入按鈕為深灰色

按鈕演示

.left,.right{position: absolute;top: 225px; /* 垂直居中 */transform: translateY(-50%); /* 精確居中 */width: 35px;height: 35px;display: flex; /* 確保后面::before偽元素選擇器起作用 *//*使箭頭位于圓中心*/align-items: center;justify-content: center;border-radius: 50%; /* 圓形按鈕 */z-index: 10; /* 確保在圖片上方 */cursor: pointer; /* 鼠標懸停顯示手型 */opacity: 0; /*隱藏*/background-color: rgba(0,0,0,0.2);/* 淺灰 */color: white;/*箭頭顏色*/transition: all 0.3s ease; /* 按鈕自身的動畫效果 */
}/* 鼠標懸停盒子時顯示按鈕 */
.box:hover .left, .box:hover .right{opacity:1; /*顯示按鈕*/
}.left{left: 10px;
}
.right{right: 10px;
}

這是一個典型的"條件顯示"交互模式:

  • 默認狀態下按鈕隱藏(opacity:0
  • 當鼠標懸停在容器上時(.box:hover),通過后代選擇器激活按鈕顯示狀態
  • transform: translateY(-50%)確保按鈕在垂直方向上精確居中

4. 純CSS箭頭實現

.left::before, .right::before{content: '';width: 12px;height: 12px;border-top: 2px solid white;border-left: 2px solid white;
}
.left::before{transform: translateX(2px) rotate(-45deg);
}
.right::before{transform: translateX(-2px) rotate(135deg);
}

這是一種無需圖片的箭頭實現方案:

  • 使用::before偽元素創建一個正方形元素
  • 通過border-topborder-left繪制兩條邊(模擬箭頭的兩條邊)
  • 利用rotate旋轉實現箭頭方向:
    • 左箭頭:旋轉-45度
    • 右箭頭:旋轉135度(相當于-225度)
  • 微調translateX使箭頭視覺上居中

優點: 減少HTTP請求、易于修改顏色和大小、縮放不失真

5. 指示器:當前位置可視化

指示器演示

.dot{position: absolute;bottom: 15px;right: 70px; /* 定位在右下角 */
}.dot ul li{width: 10px;height: 10px;border-radius: 100%; /* 圓形指示器 */background-color: #737171;float: left;margin-right: 15px;cursor: pointer;transition: all 0.3s ease; /* 狀態變化動畫 */
}/* 指示器交互效果 */
.dot ul li.active{background-color: #ffffff;transform: scale(1.4); /* 當前項更大 */box-shadow: 0 0 8px rgba(255,255,255,0.8); /* 高亮效果 */
}

指示器作用:

  • 直觀顯示當前是第幾張圖片及總數量
  • 點擊可快速跳轉到對應圖片
  • 通過active類區分當前選中狀態

四、JavaScript邏輯深入解析

1. 核心變量與DOM獲取

// 獲取 DOM元素
const imgs = document.querySelectorAll('.box-img');
const prevB = document.querySelector(".left");
const nextB = document.querySelector('.right');
const dots = document.getElementById('dot-list').querySelectorAll('li');// 狀態變量
let currentIndex = 0;
const imgCnt = imgs.length;
let autoTimer = null;

變量作用詳解:

  • imgs:獲取所有圖片容器的集合(NodeList),便于批量操作
  • currentIndex:當前顯示圖片的索引,是整個輪播邏輯的"狀態核心"
  • imgCnt:存儲圖片總數,避免重復計算imgs.length
  • autoTimer:存儲計時器ID,用于控制自動播放的開啟與關閉

2. 圖片切換函數(核心邏輯)

function switchToImg(index) {// 隱藏所有圖片imgs.forEach( img => {img.style.opacity = 0;});// 顯示目標圖片imgs[index].style.opacity=1;// 更新當前索引currentIndex = index;// 更新指示器狀態dots.forEach(dot => {dot.classList.remove('active');});dots[index].classList.add('active')
}

這個函數是輪播圖的"心臟",負責完成一次完整的圖片切換:

執行步驟分解:

  1. 遍歷所有圖片容器,將它們的透明度設為0(隱藏)
  2. 將目標索引對應的圖片容器透明度設為1(顯示)
    • 此時會觸發CSS中定義的transition動畫,實現淡入效果
  3. 更新currentIndex為當前索引,保持狀態同步
  4. 更新指示器狀態:
    • 先移除所有指示器的active
    • 再給當前索引對應的指示器添加active
    • 這會觸發指示器的CSS狀態變化(顏色、大小等)

3. 前后切換函數(邊界處理)

// 向左切換
function prevImg(){currentIndex = (currentIndex - 1 + imgCnt) % imgCnt;switchToImg(currentIndex);
}// 向右切換
function nextImg(){currentIndex = (currentIndex + 1) % imgCnt;switchToImg(currentIndex);
}

這兩個函數解決了輪播圖的"循環切換"問題,關鍵在于邊界處理:

  • 向右切換邏輯:

    • 正常情況:索引+1(如從0→1,1→2)
    • 邊界情況:當索引是最后一張(3)時,+1后應該變為0
    • 實現:(currentIndex + 1) % imgCnt,利用取模運算自動回繞
  • 向左切換邏輯:

    • 正常情況:索引-1(如從2→1,1→0)
    • 邊界情況:當索引是0時,-1后應該變為最后一張(3)
    • 實現:(currentIndex - 1 + imgCnt) % imgCnt
    • imgCnt是為了避免出現負數(如0-1=-1,+4=3,再取模仍為3)

4. 自動播放控制

// 開始自動播放
function startAutoPlay(){stopAutoPlay();autoTimer = setInterval(nextImg, 3000);
}// 停止自動播放
function stopAutoPlay(){clearInterval(autoTimer);
}

自動播放功能的實現關鍵點:

  • 為什么在startAutoPlay中先調用stopAutoPlay

    • 防止多次調用startAutoPlay導致創建多個計時器
    • 確保每次開始自動播放前都清除了之前的計時器
    • 避免輪播速度越來越快的問題
  • 時間間隔選擇:3000ms(3秒)是一個平衡用戶瀏覽和交互的常用值

    • 太短:用戶來不及看清內容
    • 太長:輪播效果不明顯

5. 指示器完整交互

function initDots(){dots.forEach((dot,index) => {// 點擊事件dot.addEventListener('click',() => {switchToImg(index);startAutoPlay();});// 鼠標移入事件dot.addEventListener('mouseenter',() => {switchToImg(index);stopAutoPlay();});// 鼠標離開事件dot.addEventListener('mouseleave', startAutoPlay);// 設置數據索引dot.setAttribute('data-index',index);});dots[0].classList.add('active');
}

指示器實現了三種交互方式,提升用戶體驗:

  • 點擊交互:

    • 直接跳轉到對應圖片(調用switchToImg(index)
    • 跳轉后重新開始自動播放計時(startAutoPlay()
  • 懸停交互:

    • 鼠標移入時跳轉到對應圖片并暫停自動播放
    • 鼠標離開時恢復自動播放
    • 這種設計允許用戶仔細查看某張圖片,提升瀏覽體驗
  • 初始化:確保頁面加載時第一個指示器處于激活狀態

6. 事件綁定與初始化

// 按鈕點擊事件
prevB.addEventListener('click',() => {prevImg();startAutoPlay();
});
nextB.addEventListener('click',() => {nextImg();startAutoPlay();
});// 容器懸停事件
const box = document.querySelector('.box');
box.addEventListener('mouseenter', stopAutoPlay);
box.addEventListener('mouseleave', startAutoPlay);// 初始化執行
initDots();
startAutoPlay();

事件綁定將所有功能串聯起來,形成完整的交互閉環:

  • 按鈕點擊:

    • 點擊后切換圖片
    • 同時重啟自動播放計時器(避免手動操作后立即自動切換)
  • 容器懸停:

    • 鼠標進入容器時暫停自動播放(方便用戶查看當前圖片)
    • 鼠標離開容器時恢復自動播放
    • 這個設計優先考慮了用戶主動瀏覽的需求
  • 初始化流程:

    1. 先初始化指示器(initDots()
    2. 再啟動自動播放(startAutoPlay()
    3. 確保頁面加載完成后輪播圖即可正常工作

聲明:源碼是本人的部分期末作業,以初學者的角度思考問題,代碼相對實際開發還欠缺優化,僅僅為初學者提供思路,歡迎大佬提出優化意見。

源碼:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box{width: 1000px;height: 500px;position: relative;margin: 15px auto;}.box-img img{width: 1000px;height: 500px;position: absolute;top: 0;left: 0;}.box-img{opacity: 0;transition: opacity 0.5s ease-in-out;}.box-img:nth-child(1){opacity: 1;}.left,.right{opacity: 0;position: absolute;transform: translateY(-50%);top: 225px;width: 35px;height: 35px;align-items: center;justify-content: center;border-radius: 50%;z-index: 10;cursor: pointer;background-color: rgba(0,0,0,0.2);color: white;font-size: 24px;transition: all 0.3s ease; /* 按鈕自身的動畫效果 */display: flex;}.box:hover .left, .box:hover .right{opacity: 1;}.left{left: 10px;}.right{right: 10px;}.left::before, .right::before{content: '';width: 12px;height: 12px;border-top: 2px solid white;border-left: 2px solid white;}.left::before{transform: translateX(2px) rotate(-45deg);}.right::before{transform: translateX(-2px) rotate(135deg);}.left:hover, .right:hover{background-color: rgba(0,0,0,0.7);transform: translateY(-50%) scale(1.1);opacity: 1; box-shadow: 0 0 15px rgba(255,255,255,0.3);}.dot{position: absolute;bottom: 15px;right: 70px;}.dot ul{padding: 0;margin: 0;list-style: none;}.dot ul li{width: 10px;height: 10px;border-radius: 100%;background-color: #737171;float: left;margin-right: 15px;cursor: pointer;transition: all 0.3s ease;}.dot ul li.active{background-color: #ffffff;transform: scale(1.4);box-shadow: 0 0 8px rgba(255,255,255,0.8);}</style>
</head>
<body>
<div class="box"><!-- 輪播圖片容器 --><div class="box-img"><img src="img/albumFolklore.jpg"> </div><div class="box-img"><img src="img/albumST.jpg"> </div><div class="box-img"><img src="img/albumSpring.jpg" > </div><div class="box-img"><img src="img/albumNTM.jpg"> </div> <!-- 左右切換按鈕 --><div class="left"> </div><div class="right"> </div><!-- 指示器(小圓點) --><div class="dot"><ul id="dot-list"><li class="active" data-index="0"></li><li data-index="1"></li><li data-index="2"></li><li data-index="3"></li></ul></div></div>
<script>
const imgs = document.querySelectorAll('.box-img');
const prevB = document.querySelector(".left");
const nextB = document.querySelector('.right');
const dots = document.getElementById('dot-list').querySelectorAll('li');let currentIndex = 0;
const imgCnt = imgs.length;//初始化
function initDots(){dots.forEach((dot,index) => {//點擊dot.addEventListener('click',() => {switchToImg(index);startAutoPlay();});//移入dot.addEventListener('mouseenter',() => {switchToImg(index);stopAutoPlay();})//離開dot.addEventListener('mouseleave',startAutoPlay);dot.setAttribute('data-index',index)});dots[0].classList.add('active');
}//切換
function switchToImg(index) {imgs.forEach( img => {img.style.opacity = 0;});imgs[index].style.opacity=1;currentIndex = index;dots.forEach(dot => {dot.classList.remove('active');});dots[index].classList.add('active')
}//向左切換
function prevImg(){currentIndex = (currentIndex - 1 + imgCnt) % imgCnt;switchToImg(currentIndex);
}//向右切換
function nextImg(){currentIndex = (currentIndex + 1) % imgCnt;switchToImg(currentIndex);
}//計時器
let autoTimer = null;
function startAutoPlay(){stopAutoPlay();autoTimer = setInterval(nextImg,3000);
}function stopAutoPlay(){clearInterval(autoTimer);
}//事件綁定
prevB.addEventListener('click',() => {prevImg();startAutoPlay();
});
nextB.addEventListener('click',() => {nextImg();startAutoPlay();
});initDots();
startAutoPlay();const box = document.querySelector('.box');
box.addEventListener('mouseenter',stopAutoPlay);
box.addEventListener('mouseleave',startAutoPlay);
</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90165.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCP 協議詳細分析一 initialize ping tools/list tools/call

MCP 協議詳細分析一 &#xff08;initialize ping tools/list tools/call) 本節基于 實現一個 java 的mcp client 調用的 一個python 的mcp server 的日志&#xff0c;完整展示一次典型的 MCP Java SDK 通信流程、工具調用、通知機制與日志記錄&#xff0c;僅包含 echo-simple…

SLAM學習資料記錄

ORB_SLAM2 創建自己的數據集&#xff08;還未使用&#xff09; 【SLAM實戰篇】Ubuntu 20.04版本&#xff08;OpenCV版本4.5.3&#xff09;對于ORB-SLAM2安裝運行&#xff0c;代碼編譯&#xff0c;自己的數據集構造_ubuntu20.04 安裝運行orb_slam2算法-CSDN博客 卡爾曼濾波數據…

用Phi-3 Mini微調實現英文到尤達語翻譯

用Phi-3 Mini微調實現英文到尤達語翻譯 引言 本文將帶你快速上手大模型微調實踐——以微軟的Phi-3 Mini 4K Instruct模型為例&#xff0c;教你如何將其微調為一個能把英文翻譯成"尤達語"&#xff08;《星球大戰》中尤達大師的獨特說話風格&#xff09;的模型。這是一…

AI助力,輕松實現人聲分離伴奏提取

親愛的小伙伴們&#xff01;前段時間&#xff0c;有一位同事家的可愛小孩參加了一場英語演講比賽。同事找到我&#xff0c;希望我能幫個忙&#xff0c;把講視頻中的人聲去掉&#xff0c;只提取出其中相應的伴奏。今天&#xff0c;我就來和大家分享一下究竟如何實現從 MP4 視頻中…

第1章第2章筆記

OSI參考模型---開放式系統互聯模型---OSI/RM ISO--->國際標準化組織&#xff1b;特點&#xff1a;先有模型&#xff0c;在又協議。 OSI七層參考模型&#xff1a;應用層 --- 提供網絡服務&#xff1b;自然語言-->編碼表示層 --- 對數據的處理&#xff1b;格式化&#xff0…

圖的BFS和DFS

一&#xff0c;圖的遍歷邏輯1.之前我們學了圖的存儲&#xff0c;可以鄰接表存和鄰接矩陣存。現在我們要學習圖的遍歷操作和樹類似可以分為深度遍歷和廣度遍歷&#xff0c;而深度遍歷也是用遞歸實現&#xff0c;廣度遍歷是用隊列實現2.深度遍歷(DFS)a.確定起點b.找到一條邊按順時…

WWDC 25 給自定義 SwiftUI 視圖穿上“玻璃外衣”:最新 Liquid Glass 皮膚詳解

引子 各位 iOS 足球體育健兒們&#xff0c;且聽我一言&#xff01;想當年在《少林足球》里&#xff0c;阿星一句“做人如果沒夢想&#xff0c;那跟咸魚有什么分別啊&#xff1f;”點燃了多少人的江湖夢。 如今在 SwiftUI 江湖里&#xff0c;Apple 于 WWDC 25 推出的 Liquid Gl…

Day01_C++

01.思維導圖02.方法一&#xff1a;#include <iostream> #include <cstring> #include <iostream> using namespace std; class mystring { private:char* buf;int len;public:mystring(const char* str);void copy(const char* ptr);void copy(mystring ptr)…

C語言學習(days09)

二維數組的定義與特性二維數組的聲明格式為&#xff1a;類型說明符 數組名[表達式1][表達式2];[下標1]表示行索引&#xff0c;[下標2]表示列索引。二維數組可視為由多個一維數組組成&#xff0c;a[0]表示第0行的首地址&#xff08;即一維數組地址&#xff09;a[0][0]表示第0的第…

WIFI路由器長期不重啟,手機連接時提示無IP分配

今天在公司&#xff0c;突然發現手機連不上公司WIFI。每次鏈接&#xff0c;提示無IP分析。我以為是我手機出問題了&#xff0c;想復位一下。后來一想萬一復位還是不靈&#xff0c;怎么辦&#xff1f;同事認為是路由器沒有重啟的原因。于是找到路由器&#xff0c;重啟&#xff0…

【前沿技術動態】【AI總結】RustFS:從 0 到 1 打造下一代分布式對象存儲

目錄1 引言&#xff1a;為什么我們又需要一個新的對象存儲2 RustFS 全景速覽3 技術架構深度拆解3.1 整體拓撲3.2 關鍵數據結構&#xff08;rust 偽代碼&#xff09;3.3 讀寫路徑&#xff08;寫放大 < 1.1&#xff09;4 核心源碼導讀4.1 關鍵函數跟蹤4.2 一段最小可復現示例5…

ImageNet1K數據集的下載解壓與處理

前言 博主因為這個數據集踩了好多坑&#xff0c;浪費了好幾天時間&#xff0c;最近終于找到了高效的辦法&#xff0c;寫此篇文章來記錄具體操作方法&#xff0c;也希望可以幫助到有需要的人。&#xff08;主要是在云服務器是使用&#xff09; 下載數據集 一共下載三個文件&…

OkHttp 與 Room 結合使用:構建高效的 Android 本地緩存策略

前言在現代 Android 應用開發中&#xff0c;網絡請求與本地數據持久化是兩大核心功能。OkHttp 作為強大的網絡請求庫&#xff0c;與 Jetpack Room 持久化庫的結合使用&#xff0c;可以創建高效的數據緩存策略&#xff0c;提升應用性能和用戶體驗。本文將詳細介紹如何將這兩者完…

Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]

Nacos中feign.FeignException$BadGateway: [502 Bad Gateway] 文章目錄Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]背景原因背景 Mac本地運行Nacos微服務項目&#xff0c;調用服務失敗 原因 關閉本地代理clash或者其他&#xff0c;windows沒發現問題&#x…

基于deepseek的LORA微調

LORA微調&#xff1a; 核心是&#xff1a;低秩轉換&#xff0c;減少參數。凍結大部分&#xff0c;調節部分模塊(注意力模塊的Wq&#xff0c;Wk&#xff0c;Wv)。 調整過后得到一個lora.safetensors, 內部記錄了(detail W: 即部分修改的W)。推理使用原權重和lora權重。 具體操…

Linux運維新手的修煉手扎之第22天

Tomcat服務1 java項目部署方式&#xff1a;war包部署、jar包部署、源代碼部署2 Ubuntu環境部署Java - openjdk[熟練]:#安裝軟件rootubuntu24-13:~# apt update; apt list openjdk*rootubuntu24-13:~# apt install openjdk-11-jdk -y#檢測效果rootubuntu24-13:~# whereis javaja…

Python爬蟲實戰:研究Genius庫相關技術

1. 引言 在當今數字化時代,音樂數據的分析與挖掘成為了音樂學、計算機科學等領域的研究熱點。歌詞作為音樂的重要組成部分,蘊含著豐富的情感、文化和社會信息。通過對歌詞數據的分析,可以揭示音樂風格的演變、流行趨勢的變化以及社會情緒的波動等。 Genius 是一個專注于歌詞…

內核協議棧源碼閱讀(一) ---驅動與內核交互

文章目錄 一、硬中斷 1.1 `e100_intr` 1.2 `__netif_rx_schedule` 1.3 補充: 二、軟中斷 2.1 net_rx_action 2.2 e100_poll 2.3 補充 三、非 NAPI 的軟中斷處理 3.1 netif_rx 3.2 backlog_dev->poll 3.3 補充 四、總結 以 e100_intr 為例: 一、硬中斷 1.1 e100_intr 網卡…

Vue3 面試題及詳細答案120道(61-75 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

ubuntulinux快捷鍵

1.復制文件使用cp命令。cp是復制的簡寫。語法也很簡單。使用&#xff0c;cp后跟要復制的文件以及要將其移動到的目的地cp ~/Downloads/your-file.txt ~/Documents/2.復制文件夾為了復制文件夾及其內容&#xff0c;您將需要告訴cp命令以遞歸方式復制。使用-r標志就足夠簡單了。c…