You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似Behance、Artstation的网页局部重载效果?

Hey there! Great question—local content reload (keeping your nav and footer fixed while swapping out the main content) is a staple on creative platforms like Behance, Artstation, and Upwork, and it’s totally achievable with proven patterns that balance performance and user experience. Let’s break down exactly how these platforms pull it off:

Core Implementation Patterns Used by These Platforms

1. Enhanced Ajax + HTML5 History API

Most of these platforms don’t rely on basic Ajax alone—they pair it with the HTML5 History API to keep the browser URL in sync with the loaded content (so users can bookmark, share, and use back/forward buttons normally). Here’s a simplified breakdown:

  • Intercept link clicks with JavaScript: When a user clicks a navigation link, prevent the default full page reload.
  • Fetch partial content: Use fetch() or XMLHttpRequest to pull only the main content fragment (not the entire HTML page). Many platforms have dedicated backend endpoints for this (e.g., /project/123/partial) that return just the content container markup instead of including nav/footer.
  • Swap content: Replace the inner HTML of your main content container (like <div id="app-content">) with the fetched markup.
  • Sync the URL: Use history.pushState() (or replaceState() for navigation that doesn’t add a history entry) to update the browser’s address bar without reloading the page.
  • Handle back/forward: Listen for the popstate event (triggered when users click back/forward) to reload the appropriate content fragment based on the current URL.

You can verify this by opening your browser’s dev tools: Watch the Network tab when clicking links on Artstation or Behance—you’ll see small, targeted requests instead of full page loads, and the URL updates instantly.

2. Lightweight Client-Side Routing (SPA-Lite Approach)

Platforms like Upwork (which has more dynamic, tool-focused sections) often use a lightweight client-side routing layer. Instead of fetching raw HTML fragments, they might:

  • Define route mappings (e.g., /freelancer/:id maps to a freelancer profile view).
  • On link click, parse the route, fetch structured data (JSON) via an API.
  • Render the new content using a templating engine or lightweight framework (even if the site isn’t a full single-page app).
  • Update the History API to sync the URL, just like the Ajax approach.

A key perk here is reusability—components can be rendered with different data without reloading the whole page. You’ll also notice loading states (skeleton screens, spinners) on these platforms while content fetches, which boosts perceived performance.

3. Smart Caching for Snappier Loads

To make this feel seamless, these platforms use caching strategies to avoid redundant requests:

  • In-memory caching: Store fetched content fragments or data in JavaScript variables so returning to a page doesn’t require a new request.
  • HTTP caching: Set Cache-Control headers on partial content endpoints so browsers cache responses automatically for repeat visits.
  • Preloading: Fetch popular content in the background when users are idle (Behance does this with recommended projects as you scroll through your feed).

4. Handling Edge Cases (The Polish That Matters)

The best implementations nail the small details to match the smoothness of Behance/Artstation:

  • Page transitions: Add subtle animations (fade-in, slide) when swapping content to make the experience feel intentional, not jarring.
  • Script reinitialization: If your fetched content includes interactive elements (like project embeds or filters), you’ll need to reinitialize their scripts after content swaps. Many platforms use modular functions that can be called manually when new content loads.
  • Accessibility: Ensure screen readers and keyboard navigation work correctly—update focus to the new content, and use ARIA live regions to announce content changes.
  • JS fallback: Make sure links still work normally if JavaScript is disabled. Use standard <a href="/full-page-url"> tags, and have your server render the full page when it detects no Ajax header.
Quick Vanilla JS Example

Here’s a simplified code snippet to get you started with the Ajax + History API approach:

// Intercept all relevant link clicks
document.addEventListener('click', async (e) => {
  const link = e.target.closest('a');
  // Skip external links, anchor links, and new-tab links
  if (!link || link.target === '_blank' || link.href.startsWith('#')) return;

  e.preventDefault();
  const targetUrl = link.href;

  try {
    // Fetch partial content (backend checks for X-Requested-With header)
    const response = await fetch(targetUrl, {
      headers: { 'X-Requested-With': 'XMLHttpRequest' }
    });
    if (!response.ok) throw new Error('Failed to load content');
    
    const content = await response.text();
    // Swap content in the main container
    document.getElementById('main-content').innerHTML = content;

    // Update URL and browser history
    history.pushState({ path: targetUrl }, '', targetUrl);

    // Optional: Scroll to top of new content
    window.scrollTo(0, 0);

    // Optional: Reinitialize scripts for interactive content
    initInteractiveElements();
  } catch (err) {
    // Fallback to full page reload if something breaks
    console.error('Content load failed:', err);
    window.location.href = targetUrl;
  }
});

// Handle back/forward button navigation
window.addEventListener('popstate', async (e) => {
  if (!e.state?.path) return;
  const response = await fetch(e.state.path, {
    headers: { 'X-Requested-With': 'XMLHttpRequest' }
  });
  const content = await response.text();
  document.getElementById('main-content').innerHTML = content;
});
Key Takeaways
  • You don’t need Nginx for this—all the client-side work is done with JavaScript, paired with backend support for partial content endpoints.
  • The History API is non-negotiable for maintaining proper URL behavior (bookmarks, back/forward functionality).
  • Focus on UX details like loading states and transitions to match the polished feel of these platforms.

内容的提问来源于stack exchange,提问作者Rija Cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:18:33