使用Stream CSS进度栏为WordPress网站创建JavaScript路线
#javascript #网络开发人员 #前端 #wordpress

Image description

在本文中,我们将学习如何为WordPress网站创建JavaScript路由,允许平稳的客户端导航,并实现流CSS进度栏以增强用户体验。我们将使用本机JavaScript没有任何框架或库。在本教程结束时,您将对如何构建JavaScript路线并在WordPress网站上实现流CSS Progress Bar。

先决条件

要遵循本文,您应该对HTML,CSS和JavaScript有基本的了解。此外,熟悉WordPress及其模板系统将是有益的。

入门

在我们深入了解代码之前,请确保您启动并运行WordPress网站。在主题目录中创建一个新的目录,并将其命名 js 。在 js 目录中,创建一个名为 main.js 的新文件。这将是我们的主要JavaScript文件,我们将在其中实现JavaScript路由并流css进度栏。

打开wordpress主题的 functions.php 文件,并在 main.js.js 文件中加入。将以下代码添加到您的 functions.php 文件:

function enqueue_custom_scripts() {
    wp_enqueue_script( 'custom-scripts', get_template_directory_uri() . '/js/main.js', array(), '1.0', true );
}
add_action( 'wp_enqueue_scripts', 'enqueue_custom_scripts' );

此代码可确保 main.js 文件已加载在WordPress网站的前端。

实现JavaScript路由

现在,让我们开始为WordPress网站实现JavaScript路由。打开 main.js 文件并添加以下代码:

document.addEventListener("DOMContentLoaded", function () {
  const progressBar = document.getElementById("progress-bar");
  // Update the progress bar width based on the loading percentage
  function updateProgressBar(percentage) {
    progressBar.style.width = `${percentage}%`;
    progressBar.classList.add("filled");
    // hide progress bar when content is loaded
    if (percentage == 100) {
      setTimeout(() => {
        progressBar.classList.remove("filled");
        progressBar.style.width = 0;
      }, 300);
    }
  }
  // Fetch content based on the URL and update the page
  function fetchContent(url) {
    updateProgressBar(0); // Reset progress bar
    console.log(url);
    fetch(url, {
      headers: {
        "Content-Type": "text/html; charset=utf-8",
      },
      mode: "cors",
    })
      .then((response) => {
        const reader = response.body.getReader();
        const decoder = new TextDecoder("utf-8");
        const total = +response.headers.get("Content-Length");
        let loaded = 0;
        let html = "";
        function read() {
          reader.read().then(({ done, value }) => {
            if (done) {
              const parser = new DOMParser();
              const doc = parser.parseFromString(html, "text/html");
              // Extract the specific HTML element and their child's from the parsed document
              const primary = doc.querySelector("#primary");
              // take content element from current page
              const appContainer = document.getElementById("content");
              // Then, Remove all child elements
              while (appContainer.firstChild) {
                appContainer.removeChild(appContainer.firstChild);
              }
              // Append a new element
              appContainer.appendChild(primary);
              updateProgressBar(100); // Set progress bar to 100% when content is loaded
              return;
            }
            loaded += value.length;
            updateProgressBar((loaded / total) * 100);
            const chunk = decoder.decode(value, { stream: true });
            html += chunk;
            // Process the content here if needed
            // somthing like pelase wait or spinner..
            read(); // Continue reading the stream
          });
        }
        read();
      })
      .catch((error) => {
        console.error(error);
        updateProgressBar(0); // Reset progress bar in case of errors
      });
  }
  // Handle link clicks
  function handleLinkClick(event) {
    const target = event.target;
    // Check if the clicked element or its parent is an anchor element
    const anchor = target.closest("a");
    if (anchor) {
      event.preventDefault();
      // Get the href attribute of the anchor element
      const targetUrl = anchor.getAttribute("href");
      // Update the URL and push a new history state
      history.pushState(null, "", targetUrl);
      // Fetch and load the content for the clicked link
      fetchContent(targetUrl);
    }
  }
  // Attach click event listeners to all links
  const allLinks = document.querySelectorAll("a");
  allLinks.forEach((link) => {
    link.addEventListener("click", handleLinkClick);
  });
  // Handle the popstate event to update the page when the user navigates back/forward
  window.addEventListener("popstate", () => {
    fetchContent(window.location.href);
  });
});

在上面的代码中,我们首先将事件侦听器附加到 domcontentloaded 事件,以确保我们的JavaScript代码在页面完成后运行。

handlelinkClick 功能负责拦截链接点击,防止默认行为,启动进度栏动画并使用 fetchContent 函数获取单击链接的内容。

fetchContent 函数将get请求发送到目标URL,将响应作为文本检索,停止进度栏动画,并使用获取的html更新内容容器。

确保将CSS文件链接到您的HTML,您可以在其中定义Progress Bar Animation的样式。这是进度栏的基本CSS示例:

.progress-bar-container {
  width: 100%;
  height: 2px;
  background-color: transparent;
  position: absolute;
  top: 0;
  display: block;
}

.progress-bar {
  width: 0;
  height: 100%;
  background-color: #f00;
  position: relative;
  transition: width 0.3s ease-in-out;
  opacity: 0;
}
.progress-bar.filled {
  opacity: 1;
}
/* Optional: Add animation to the progress bar */
@keyframes progress-animation {
  0% {
    width: 0;
  }
  100% {
    width: 100%;
  }
}

使用此设置,每当您在WordPress网站上单击链接时,JavaScript代码都会截获点击事件,启动Progress Bar Animation,获取单击链接的内容,然后无缝更新内容容器。

随时自定义CSS样式以匹配您的网站的设计。

就是这样!您已经成功实现了WordPress网站的流CSS进度栏的JavaScript路线。现在,用户将体验到不同页面之间的平稳且视觉上吸引人的导航。