最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實(shí)現(xiàn)PDF本地預(yù)覽功能的多種方法

 更新時(shí)間:2025年12月05日 10:07:41   作者:~無(wú)憂花開(kāi)~  
在Web開(kāi)發(fā)中,實(shí)現(xiàn)本地PDF文件預(yù)覽是一個(gè)常見(jiàn)的需求,JavaScript提供了多種方式來(lái)實(shí)現(xiàn)這一功能,包括使用原生API、第三方庫(kù)或?yàn)g覽器插件,以下將詳細(xì)介紹幾種實(shí)現(xiàn)方法,并分析它們的優(yōu)缺點(diǎn),需要的朋友可以參考下

原生FileReader API實(shí)現(xiàn)

FileReader是HTML5提供的API,允許Web應(yīng)用程序異步讀取存儲(chǔ)在用戶計(jì)算機(jī)上的文件內(nèi)容。結(jié)合PDF.js這樣的庫(kù),可以實(shí)現(xiàn)PDF預(yù)覽功能。

創(chuàng)建文件輸入元素是第一步,HTML中需要添加一個(gè)input標(biāo)簽,類(lèi)型設(shè)置為file,并限制接受的文件類(lèi)型為PDF。用戶選擇文件后,通過(guò)change事件監(jiān)聽(tīng)獲取文件對(duì)象。

<input type="file" id="pdfInput" accept=".pdf" />

JavaScript代碼需要監(jiān)聽(tīng)文件輸入的變化事件。當(dāng)用戶選擇文件后,F(xiàn)ileReader對(duì)象可以讀取文件內(nèi)容。讀取操作是異步的,需要設(shè)置onload回調(diào)函數(shù)處理讀取完成事件。

document.getElementById('pdfInput').addEventListener('change', function(e) {
    const file = e.target.files[0];
    if (file.type !== 'application/pdf') {
        alert('請(qǐng)選擇PDF文件');
        return;
    }
    
    const reader = new FileReader();
    reader.onload = function(e) {
        const contents = e.target.result;
        // 此處處理PDF內(nèi)容
    };
    reader.readAsArrayBuffer(file);
});

FileReader提供了多種讀取方式,包括readAsText、readAsDataURL和readAsArrayBuffer。對(duì)于PDF文件,readAsArrayBuffer是最合適的選擇,因?yàn)樗梢员A舳M(jìn)制數(shù)據(jù)完整性。

PDF.js庫(kù)集成

Mozilla開(kāi)發(fā)的PDF.js是一個(gè)強(qiáng)大的JavaScript庫(kù),可以在Web瀏覽器中渲染PDF文檔。它不需要任何插件,完全基于HTML5和JavaScript實(shí)現(xiàn)。

引入PDF.js庫(kù)是必要的步驟??梢酝ㄟ^(guò)CDN直接加載,或者下載源代碼本地部署?;臼褂眯枰虞d兩個(gè)核心文件:pdf.js和pdf.worker.js。

<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>

初始化PDF.js需要設(shè)置worker路徑。這個(gè)worker負(fù)責(zé)處理密集型計(jì)算任務(wù),避免阻塞主線程。

pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.worker.min.js';

加載PDF文檔使用getDocument方法。這個(gè)方法接受ArrayBuffer、URL或base64編碼的字符串作為輸入。

const loadingTask = pdfjsLib.getDocument(contents);
loadingTask.promise.then(function(pdf) {
    // 成功加載PDF文檔
    console.log('PDF加載完成,總頁(yè)數(shù):', pdf.numPages);
    
    // 渲染第一頁(yè)
    pdf.getPage(1).then(function(page) {
        const viewport = page.getViewport({ scale: 1.0 });
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;
        
        document.body.appendChild(canvas);
        
        page.render({
            canvasContext: context,
            viewport: viewport
        });
    });
}).catch(function(error) {
    console.error('PDF加載失?。?, error);
});

PDF.js提供了豐富的API控制PDF渲染。可以調(diào)整縮放比例、旋轉(zhuǎn)角度,提取文本內(nèi)容,甚至實(shí)現(xiàn)搜索功能。

性能優(yōu)化考慮

處理大型PDF文件時(shí),性能優(yōu)化至關(guān)重要。采用分頁(yè)加載策略可以顯著改善用戶體驗(yàn),避免一次性渲染所有頁(yè)面導(dǎo)致瀏覽器卡頓。

實(shí)現(xiàn)分頁(yè)加載需要維護(hù)當(dāng)前頁(yè)碼狀態(tài),并提供導(dǎo)航控件。用戶瀏覽到特定頁(yè)面時(shí),再動(dòng)態(tài)加載和渲染該頁(yè)內(nèi)容。

let currentPage = 1;
const totalPages = pdf.numPages;

function renderPage(pageNum) {
    pdf.getPage(pageNum).then(function(page) {
        // 清除舊內(nèi)容
        const container = document.getElementById('pdf-container');
        container.innerHTML = '';
        
        const viewport = page.getViewport({ scale: 1.5 });
        const canvas = document.createElement('canvas');
        const context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;
        
        container.appendChild(canvas);
        
        page.render({
            canvasContext: context,
            viewport: viewport
        });
    });
}

// 添加頁(yè)面導(dǎo)航控制
document.getElementById('next-page').addEventListener('click', function() {
    if (currentPage < totalPages) {
        currentPage++;
        renderPage(currentPage);
    }
});

document.getElementById('prev-page').addEventListener('click', function() {
    if (currentPage > 1) {
        currentPage--;
        renderPage(currentPage);
    }
});

內(nèi)存管理也是重要考量。當(dāng)用戶預(yù)覽多個(gè)PDF文件時(shí),應(yīng)及時(shí)釋放前一個(gè)PDF占用的資源。PDF.js提供了destroy方法清理內(nèi)存。

let currentPDF = null;

function loadNewPDF(contents) {
    if (currentPDF) {
        currentPDF.destroy();
    }
    
    const loadingTask = pdfjsLib.getDocument(contents);
    loadingTask.promise.then(function(pdf) {
        currentPDF = pdf;
        renderPage(1);
    });
}

替代方案比較

除了PDF.js,還有其他實(shí)現(xiàn)PDF預(yù)覽的方法,各有優(yōu)缺點(diǎn)。

使用iframe嵌入是一種簡(jiǎn)單方案。將PDF文件轉(zhuǎn)換為DataURL后,可以作為iframe的src屬性值。

reader.readAsDataURL(file);
reader.onload = function(e) {
    const iframe = document.createElement('iframe');
    iframe.src = e.target.result;
    iframe.style.width = '100%';
    iframe.style.height = '600px';
    document.body.appendChild(iframe);
};

這種方法的局限性在于瀏覽器兼容性。不同瀏覽器對(duì)PDF內(nèi)嵌支持程度不一,有些可能需要插件或特定配置。

Object標(biāo)簽方案類(lèi)似iframe,但更專(zhuān)門(mén)用于嵌入文檔。語(yǔ)法略有不同,但同樣面臨瀏覽器兼容性問(wèn)題。

<object data="document.pdf" type="application/pdf" width="100%" height="600px">
    <p>您的瀏覽器不支持PDF預(yù)覽,請(qǐng)<a href="document.pdf" rel="external nofollow" >下載文件</a>查看。</p>
</object>

第三方服務(wù)如Google Docs Viewer提供在線PDF預(yù)覽功能。通過(guò)將PDF上傳到公共URL,然后嵌入特定iframe即可。

<iframe src="https://docs.google.com/viewer?url=http://example.com/document.pdf&embedded=true" 
        style="width:100%; height:600px;" frameborder="0"></iframe>

這種方法依賴外部服務(wù),需要考慮隱私和網(wǎng)絡(luò)延遲問(wèn)題。

用戶體驗(yàn)增強(qiáng)

良好的用戶界面可以顯著提升PDF預(yù)覽體驗(yàn)。添加加載指示器是基本要求,因?yàn)镻DF解析和渲染可能需要較長(zhǎng)時(shí)間。

function showLoader() {
    document.getElementById('loader').style.display = 'block';
}

function hideLoader() {
    document.getElementById('loader').style.display = 'none';
}

document.getElementById('pdfInput').addEventListener('change', function(e) {
    showLoader();
    // 文件處理邏輯
    hideLoader();
});

錯(cuò)誤處理機(jī)制必不可少。捕獲各種可能出現(xiàn)的異常,如文件損壞、不兼容格式或權(quán)限問(wèn)題,并提供友好的錯(cuò)誤提示。

loadingTask.promise.then(function(pdf) {
    // 成功處理
}).catch(function(error) {
    console.error('PDF處理錯(cuò)誤:', error);
    alert('無(wú)法加載PDF文件,請(qǐng)檢查文件格式是否正確');
    hideLoader();
});

添加頁(yè)面縮略圖導(dǎo)航可以方便用戶快速定位。生成所有頁(yè)面的小型預(yù)覽圖,點(diǎn)擊時(shí)跳轉(zhuǎn)到對(duì)應(yīng)頁(yè)面。

function generateThumbnails(pdf) {
    const thumbnailsContainer = document.getElementById('thumbnails');
    thumbnailsContainer.innerHTML = '';
    
    for (let i = 1; i <= pdf.numPages; i++) {
        pdf.getPage(i).then(function(page) {
            const viewport = page.getViewport({ scale: 0.2 });
            const canvas = document.createElement('canvas');
            const context = canvas.getContext('2d');
            canvas.height = viewport.height;
            canvas.width = viewport.width;
            canvas.onclick = function() { renderPage(i); };
            
            thumbnailsContainer.appendChild(canvas);
            
            page.render({
                canvasContext: context,
                viewport: viewport
            });
        });
    }
}

安全考慮

處理用戶上傳的PDF文件存在安全風(fēng)險(xiǎn)。惡意構(gòu)造的PDF可能包含XSS攻擊向量或利用PDF閱讀器漏洞。

內(nèi)容安全策略(CSP)可以緩解部分風(fēng)險(xiǎn)。限制腳本執(zhí)行來(lái)源,防止PDF中嵌入的惡意代碼運(yùn)行。

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' cdnjs.cloudflare.com;">

沙盒模式是另一種防護(hù)措施。使用sandbox屬性限制iframe權(quán)限,防止執(zhí)行JavaScript或?qū)Ш降狡渌?yè)面。

<iframe sandbox="allow-same-origin" src="pdf-dataurl"></iframe>

服務(wù)器端驗(yàn)證同樣重要。即使實(shí)現(xiàn)客戶端預(yù)覽,上傳后仍需驗(yàn)證文件內(nèi)容,防止繞過(guò)客戶端檢查。

移動(dòng)端適配

移動(dòng)設(shè)備上的PDF預(yù)覽需要特別考慮。觸摸事件處理、屏幕尺寸適配和性能優(yōu)化是關(guān)鍵。

響應(yīng)式設(shè)計(jì)確保預(yù)覽區(qū)域適應(yīng)不同屏幕尺寸。使用CSS媒體查詢調(diào)整布局和字體大小。

@media (max-width: 768px) {
    #pdf-container {
        width: 100%;
        height: auto;
    }
    #thumbnails {
        display: none;
    }
}

觸摸手勢(shì)支持提升移動(dòng)體驗(yàn)。監(jiān)聽(tīng)touch事件實(shí)現(xiàn)滑動(dòng)翻頁(yè),替代桌面端的按鈕控制。

let startX = 0;
const container = document.getElementById('pdf-container');

container.addEventListener('touchstart', function(e) {
    startX = e.touches[0].clientX;
});

container.addEventListener('touchend', function(e) {
    const endX = e.changedTouches[0].clientX;
    const diffX = startX - endX;
    
    if (diffX > 50 && currentPage < totalPages) {
        // 向左滑動(dòng),下一頁(yè)
        currentPage++;
        renderPage(currentPage);
    } else if (diffX < -50 && currentPage > 1) {
        // 向右滑動(dòng),上一頁(yè)
        currentPage--;
        renderPage(currentPage);
    }
});

移動(dòng)設(shè)備性能限制更嚴(yán)格。降低默認(rèn)渲染質(zhì)量,減少內(nèi)存占用,確保流暢體驗(yàn)。

page.render({
    canvasContext: context,
    viewport: viewport,
    intent: 'display'  // 優(yōu)化顯示而非打印質(zhì)量
});

高級(jí)功能實(shí)現(xiàn)

文本選擇和搜索是專(zhuān)業(yè)PDF閱讀器的核心功能。PDF.js支持從PDF中提取文本層,實(shí)現(xiàn)這些高級(jí)特性。

啟用文本層需要額外配置。渲染頁(yè)面時(shí)設(shè)置包含文本內(nèi)容的選項(xiàng)。

page.render({
    canvasContext: context,
    viewport: viewport,
    textContent: textContent  // 從page.getTextContent()獲取
}).then(function() {
    // 文本層渲染完成
});

實(shí)現(xiàn)文本搜索功能涉及遍歷PDF文本內(nèi)容。獲取所有文本項(xiàng)后,進(jìn)行字符串匹配并高亮顯示結(jié)果。

function searchText(pdf, query) {
    for (let i = 1; i <= pdf.numPages; i++) {
        pdf.getPage(i).then(function(page) {
            page.getTextContent().then(function(textContent) {
                const textItems = textContent.items;
                for (let j = 0; j < textItems.length; j++) {
                    if (textItems[j].str.includes(query)) {
                        // 高亮匹配文本
                        highlightText(textItems[j], page);
                    }
                }
            });
        });
    }
}

注釋和表單支持是另一個(gè)高級(jí)特性。PDF.js可以解析PDF中的注釋和表單字段,并在渲染時(shí)保留交互性。

page.getAnnotations().then(function(annotations) {
    annotations.forEach(function(annotation) {
        // 處理不同類(lèi)型的注釋
    });
});

瀏覽器兼容性處理

不同瀏覽器對(duì)PDF預(yù)覽的支持程度差異較大。特性檢測(cè)和漸進(jìn)增強(qiáng)是確保廣泛兼容的關(guān)鍵。

檢測(cè)FileReader支持是基本檢查?,F(xiàn)代瀏覽器普遍支持,但舊版本可能需要polyfill。

if (typeof FileReader === 'undefined') {
    alert('您的瀏覽器不支持文件預(yù)覽,請(qǐng)升級(jí)到最新版本');
    return;
}

PDF.js版本選擇也影響兼容性。較新版本功能豐富,但舊版本可能對(duì)老舊瀏覽器支持更好。

Blob和ArrayBuffer的兼容性同樣需要關(guān)注。IE10及以下版本可能需要特殊處理。

if (typeof Uint8Array !== 'undefined') {
    // 現(xiàn)代瀏覽器處理方式
    reader.readAsArrayBuffer(file);
} else {
    // IE兼容方案
    reader.readAsBinaryString(file);
}

性能差異也需要考慮。移動(dòng)瀏覽器和低端設(shè)備的JavaScript引擎較弱,需要適當(dāng)降低功能復(fù)雜度。

本地存儲(chǔ)集成

結(jié)合本地存儲(chǔ)API,可以實(shí)現(xiàn)PDF文件的離線訪問(wèn)。將用戶預(yù)覽過(guò)的PDF保存到IndexedDB或localStorage。

使用IndexedDB存儲(chǔ)大型二進(jìn)制數(shù)據(jù)更合適。創(chuàng)建數(shù)據(jù)庫(kù)存儲(chǔ)PDF文件和元數(shù)據(jù)。

const request = indexedDB.open('PDFStorage', 1);

request.onupgradeneeded = function(e) {
    const db = e.target.result;
    if (!db.objectStoreNames.contains('pdfs')) {
        db.createObjectStore('pdfs', { keyPath: 'id' });
    }
};

function savePDFToDB(id, data) {
    const transaction = db.transaction(['pdfs'], 'readwrite');
    const store = transaction.objectStore('pdfs');
    store.put({ id: id, data: data, timestamp: Date.now() });
}

實(shí)現(xiàn)最近預(yù)覽歷史功能增強(qiáng)用戶體驗(yàn)。保存用戶操作記錄,方便快速訪問(wèn)。

function addToHistory(pdfInfo) {
    let history = JSON.parse(localStorage.getItem('pdfHistory') || '[]');
    history = history.filter(item => item.id !== pdfInfo.id);
    history.unshift(pdfInfo);
    localStorage.setItem('pdfHistory', JSON.stringify(history.slice(0, 10)));
}

打印和導(dǎo)出功能

完整的PDF預(yù)覽解決方案通常需要打印支持。CSS打印樣式可以優(yōu)化打印輸出效果。

@media print {
    .no-print {
        display: none;
    }
    #pdf-container {
        width: 100%;
        height: auto;
    }
}

JavaScript觸發(fā)打印對(duì)話框直接打印渲染的canvas內(nèi)容。需要注意縮放比例確保打印質(zhì)量。

function printPDF() {
    const canvas = document.querySelector('#pdf-container canvas');
    const printWindow = window.open('', '_blank');
    printWindow.document.write('<html><head><title>打印PDF</title></head><body>');
    printWindow.document.write('<img src="' + canvas.toDataURL() + '" />');
    printWindow.document.write('</body></html>');
    printWindow.document.close();
    printWindow.focus();
    printWindow.print();
}

導(dǎo)出功能允許用戶保存修改后的PDF。PDF.js支持生成新的PDF文檔,包含注釋或表單填寫(xiě)結(jié)果。

function exportPDF() {
    const loadingTask = pdfjsLib.getDocument({ data: modifiedPDF });
    loadingTask.promise.then(function(pdf) {
        pdf.getData().then(function(data) {
            const blob = new Blob([data], { type: 'application/pdf' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'modified.pdf';
            a.click();
        });
    });
}

測(cè)試和調(diào)試

PDF預(yù)覽功能的測(cè)試需要覆蓋各種場(chǎng)景。不同尺寸、分辨率和內(nèi)容的PDF文件都應(yīng)測(cè)試。

單元測(cè)試驗(yàn)證核心功能。使用測(cè)試框架如Jest編寫(xiě)測(cè)試用例,模擬文件選擇和渲染過(guò)程。

describe('PDF預(yù)覽功能', () => {
    test('正確識(shí)別PDF文件', () => {
        const mockFile = new File([''], 'test.pdf', { type: 'application/pdf' });
        const event = { target: { files: [mockFile] } };
        handleFileSelect(event);
        expect(isPDFLoaded).toBeTruthy();
    });
});

性能分析識(shí)別瓶頸。瀏覽器開(kāi)發(fā)者工具的時(shí)間線記錄幫助優(yōu)化渲染性能。

console.time('PDF渲染');
page.render({
    canvasContext: context,
    viewport: viewport
}).then(function() {
    console.timeEnd('PDF渲染');
});

跨瀏覽器測(cè)試確保兼容性。使用BrowserStack或類(lèi)似服務(wù)測(cè)試不同瀏覽器和設(shè)備上的表現(xiàn)。

錯(cuò)誤邊界處理增強(qiáng)穩(wěn)定性。模擬網(wǎng)絡(luò)錯(cuò)誤、文件損壞等異常情況,驗(yàn)證錯(cuò)誤處理流程。

// 模擬損壞的PDF文件
const corruptedPDF = new Uint8Array([0x25, 0x50, 0x44, 0x46, 0x2D]); // 無(wú)效的PDF頭
const loadingTask = pdfjsLib.getDocument({ data: corruptedPDF });
loadingTask.promise.catch(function(error) {
    console.assert(error.name === 'InvalidPDFException');
});

部署注意事項(xiàng)

生產(chǎn)環(huán)境部署需要考慮資源加載優(yōu)化。PDF.js文件較大,應(yīng)使用CDN或按需加載。

Web服務(wù)器配置需要正確設(shè)置PDF文件的MIME類(lèi)型。確保服務(wù)器返回正確的Content-Type頭。

location ~ \.pdf$ {
    types { application/pdf pdf; }
    add_header Content-Type application/pdf;
}

內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)加速PDF文件傳輸。特別是對(duì)于大型PDF文件,CDN可以顯著改善加載速度。

// 從CDN加載PDF示例
pdfjsLib.getDocument('https://cdn.example.com/path/to/document.pdf');

緩存策略優(yōu)化減少重復(fù)下載。設(shè)置合適的Cache-Control頭,利用瀏覽器緩存提高性能。

location ~ \.pdf$ {
    expires 7d;
    add_header Cache-Control "public, max-age=604800";
}

未來(lái)發(fā)展方向

WebAssembly技術(shù)可能提升PDF處理性能。將PDF解析等密集型任務(wù)編譯為WASM模塊運(yùn)行。

Web Components標(biāo)準(zhǔn)化PDF預(yù)覽組件。創(chuàng)建可重用的自定義元素,簡(jiǎn)化集成過(guò)程。

class PDFViewerElement extends HTMLElement {
    constructor() {
        super();
        // 組件實(shí)現(xiàn)
    }
}
customElements.define('pdf-viewer', PDFViewerElement);

Web Worker分擔(dān)主線程壓力。將PDF解析和渲染任務(wù)轉(zhuǎn)移到Worker線程,保持UI響應(yīng)。

const worker = new Worker('pdf-worker.js');
worker.postMessage({ command: 'render', data: pdfData });
worker.onmessage = function(e) {
    if (e.data.status === 'complete') {
        // 更新UI
    }
};

機(jī)器學(xué)習(xí)增強(qiáng)PDF處理。自動(dòng)分類(lèi)、OCR識(shí)別或智能摘要等AI功能可集成到預(yù)覽解決方案中。

結(jié)論

JavaScript實(shí)現(xiàn)本地PDF預(yù)覽功能有多種方案,各有適用場(chǎng)景。PDF.js提供了最完整的功能集,適合需要高級(jí)特性的項(xiàng)目。簡(jiǎn)單的iframe方案則適用于基礎(chǔ)需求。無(wú)論選擇哪種方案,都應(yīng)考慮性能優(yōu)化、用戶體驗(yàn)和安全性。隨著Web技術(shù)的發(fā)展,PDF預(yù)覽功能將變得更加強(qiáng)大和高效。

以上就是JavaScript實(shí)現(xiàn)PDF本地預(yù)覽的幾種常見(jiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript PDF本地預(yù)覽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于js中document.cookie全面解析

    基于js中document.cookie全面解析

    下面小編就為大家?guī)?lái)一篇基于js中document.cookie全面解析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • javascript 緩沖效果 實(shí)現(xiàn)代碼

    javascript 緩沖效果 實(shí)現(xiàn)代碼

    非常漂亮的緩沖效果代碼,大家可以看看下。
    2009-06-06
  • js URL參數(shù)的拼接方法比較

    js URL參數(shù)的拼接方法比較

    請(qǐng)求的URL后面帶參數(shù)在項(xiàng)目中是很常見(jiàn)的,常用在的地方比如跳轉(zhuǎn)到新頁(yè)面或者請(qǐng)求CGI等
    2012-02-02
  • vue使用vue-quill-editor富文本編輯器且將圖片上傳到服務(wù)器的功能

    vue使用vue-quill-editor富文本編輯器且將圖片上傳到服務(wù)器的功能

    這篇文章主要介紹了vue使用vue-quill-editor富文本編輯器且將圖片上傳到服務(wù)器的功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • JavaScript制作樓層導(dǎo)航效果流程詳解

    JavaScript制作樓層導(dǎo)航效果流程詳解

    項(xiàng)目中遇到比較多的的文檔內(nèi)容,為了方便查找里面的小內(nèi)容,一般都會(huì)在左側(cè)或者右側(cè)放一個(gè)固定樓層的導(dǎo)航欄,今天就來(lái)說(shuō)一下這個(gè)固定樓層導(dǎo)航欄的思路以及實(shí)現(xiàn)的方法
    2021-10-10
  • JS實(shí)現(xiàn)的適合做faq或menu滑動(dòng)效果示例

    JS實(shí)現(xiàn)的適合做faq或menu滑動(dòng)效果示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的適合做faq或menu滑動(dòng)效果,結(jié)合實(shí)例形式分析了基于JS實(shí)現(xiàn)的頁(yè)面元素滑動(dòng)漸變效果的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • JavaScript、C# URL編碼、解碼總結(jié)

    JavaScript、C# URL編碼、解碼總結(jié)

    這篇文章主要介紹了JavaScript、C# URL編碼總結(jié),注意包括了encodeURI、decodeURI、encodeURIComponent、decodeURIComponent等使用需要的朋友可以參考下
    2017-01-01
  • 小程序圖片剪裁加旋轉(zhuǎn)的示例代碼

    小程序圖片剪裁加旋轉(zhuǎn)的示例代碼

    這篇文章主要介紹了小程序圖片剪裁的示例代碼,可以通過(guò)手勢(shì)控制旋轉(zhuǎn)縮放移動(dòng),也可以點(diǎn)擊旋轉(zhuǎn)進(jìn)行90度旋轉(zhuǎn),非常具有實(shí)用價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 微信小程序?qū)崿F(xiàn)輪播圖指示器

    微信小程序?qū)崿F(xiàn)輪播圖指示器

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)輪播圖指示器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • JS實(shí)現(xiàn)兩個(gè)跨域頁(yè)面實(shí)現(xiàn)量子糾纏互動(dòng)效果

    JS實(shí)現(xiàn)兩個(gè)跨域頁(yè)面實(shí)現(xiàn)量子糾纏互動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)兩個(gè)跨域頁(yè)面實(shí)現(xiàn)量子糾纏互動(dòng)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12

最新評(píng)論

广丰县| 邮箱| 镇巴县| 家居| 信丰县| 怀来县| 东乌珠穆沁旗| 新田县| 绥中县| 盈江县| 平乐县| 营山县| 昌乐县| 嘉义市| 元谋县| 淮滨县| 伊金霍洛旗| 徐闻县| 和田市| 沂源县| 黄骅市| 襄汾县| 盘锦市| 牙克石市| 苍溪县| 武隆县| 阜新| 靖安县| 建始县| 青神县| 蒲江县| 泌阳县| 罗平县| 元阳县| 南溪县| 泗洪县| 桂东县| 科尔| 长葛市| 云霄县| 调兵山市|