前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)

这篇具有很好参考价值的文章主要介绍了前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、在一个页面(不跨页面)

效果:

html 标签页切换,前端,html,css,前端

html 标签页切换,前端,html,css,前端

代码 

<!DOCTYPE html>
<html>
    <head>
        <style>
        /* 设置标签页外层容器样式 */
        .tab-container {
            width: 100%;
            background-color: #f1f1f1;
            overflow: hidden;
        }

        /* 设置标签页选项卡的样式 */
        .tab {
            float: left;
            padding: 8px 16px;
            background-color: #ccc;
            cursor: pointer;
        }

        /* 设置选中的标签页样式 */
        .active {
            background-color: #aaa;
        }

        /* 设置标签页内容的样式 */
        .tab-content {
            display: none;
            padding: 16px;
            background-color: #fff;
        }
    </style>
    </head>
    <body>
        <div class="tab-container">
            <!-- 标签页选项卡 -->
            <div class="tab active" onclick="openTab(event,'tab1')">标签页1</div>
            <div class="tab" onclick="openTab(event,'tab2')">标签页2</div>
            <div class="tab" onclick="openTab(event,'tab3')">标签页3</div>

            <!-- 标签页内容 -->
            <div id="tab1" class="tab-content" style="display:block;">
                <h3>标签页1内容</h3>
                <p>这是标签页1的内容。</p>
            </div>
            <div id="tab2" class="tab-content">
                <h3>标签页2内容</h3>
                <p>这是标签页2的内容。</p>
            </div>
            <div id="tab3" class="tab-content">
                <h3>标签页3内容</h3>
                <p>这是标签页3的内容。</p>
            </div>
        </div>

        <script>
        function openTab(event, tabName) {
            // 获取所有标签页内容元素
            var tabContent = document.getElementsByClassName("tab-content");

            // 隐藏所有标签页内容
            for (var i = 0; i < tabContent.length; i++) {
                tabContent[i].style.display = "none";
            }

            // 移除所有标签页选项卡的 active 类
            var tabs = document.getElementsByClassName("tab");
            for (var i = 0; i < tabs.length; i++) {
                tabs[i].className = tabs[i].className.replace(" active", "");
            }

            // 显示当前选中标签页内容
            document.getElementById(tabName).style.display = "block";

            // 添加 active 类到当前选中标签页选项卡
            event.currentTarget.className += " active";
        }
    </script>
    </body>
</html>

 二、Tab标签,跨页面效果

效果

html 标签页切换,前端,html,css,前端

 代码

首页

<!DOCTYPE html>
<html>
  <head>
    <style>
    .tab {
      display: inline-block;
      padding: 8px;
      background-color: #f2f2f2;
      cursor: pointer;
    }
    
    .tab.active {
      background-color: #ccc;
    }
    
    #content {
      border: 1px solid #ccc;
      padding: 10px;
      height: 400px;
      overflow: auto;
    }
  </style>
  </head>
  <body>
    <div id="tabs"></div>
    <div id="content"></div>

    <script>
    // 示例超链接列表数据
    var links = [
      { title: '页面一', url: 'page1.html' },
      { title: '页面二', url: 'page2.html' },
      { title: '页面三', url: 'page3.html' }
    ];
    
    var tabsContainer = document.getElementById('tabs');
    var contentContainer = document.getElementById('content');
    
    // 创建标签页和加载内容函数
    function createTabAndLoadContent(title, url) {
      var tab = document.createElement('div');
      tab.innerText = title;
      tab.className = 'tab';
      
      // 点击标签页切换内容
      tab.addEventListener('click', function() {
        loadContent(url);
        setActiveTab(tab);
      });
      
      tabsContainer.appendChild(tab);
    }
    
    // 加载内容到右侧窗口
    function loadContent(url) {
      contentContainer.innerHTML = '加载中...';
      
      // 模拟异步加载页面内容
      setTimeout(function() {
        // 使用iframe展示页面内容
        contentContainer.innerHTML = '<iframe src="' + url + '" frameborder="0" style="width: 100%; height: 100%;"></iframe>';
      }, 500);
    }
    
    // 设置活动标签页样式
    function setActiveTab(tab) {
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      tabs.forEach(function(t) {
        t.classList.remove('active');
      });
      
      tab.classList.add('active');
    }
    
    // 初始化超链接列表和标签页
    links.forEach(function(link) {
      createTabAndLoadContent(link.title, link.url);
    });
  </script>
  </body>
</html>

 page1.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>页面1</title>
    </head>
    <body>
        页面1
    </body>
</html>

 三、 Tab标签实现页面顶部标签栏

效果

html 标签页切换,前端,html,css,前端

html 标签页切换,前端,html,css,前端

 代码

<!DOCTYPE html>
<html>
  <head>
    <style>
    /* 左侧超链接列表 */
    .link {
      display: block;
      padding: 8px;
      background-color: #f2f2f2;
      cursor: pointer;
    }
    
    /* 顶部标签栏 */
    #tabsContainer {
      display: flex;
      align-items: center;
    }
    
    .tab {
      display: flex;
      align-items: center;
      /* padding: 5px 15px 5px 15px; */
      background-color: #f2f2f2;
      cursor: pointer;
      position: relative;
      margin-right: 10px;
      border-radius: 3px;
      
    }
    
    /* 标签标题 */
    .tab .title {
      /* margin-right: 5px; */
      /* width:10px; */
      /* border:1px solid black; */
      padding:5px 15px 5px 15px;
      /* width:90% */
    }
    
    /* 标签关闭按钮 */
    .tab .close-btn {
      /* width:10%; */
      font-size: 10px;
      font-weight: bold;
      cursor: pointer;
      padding:5px 5px 5px 0;
      /* border:1px solid black; */
    }
    
    .tab.active {
      background-color: #ccc;
    }
    
    /* 右侧内容 */
    #links {
      float: left;
      width: 200px;
      padding: 10px;
    }
    
    #tabs {
      padding: 10px;
    }
    
    #content {
      border: 1px solid #ccc;
      padding: 10px;
      height: 400px;
      overflow: auto;
    }
  </style>
  </head>
  <body>
    <div id="links">
      <!-- 在这里添加你的超链接 -->
      <a href="#" onclick="loadContent('page1.html', '超链接1'); return false;"
        class="link">超链接1</a>
      <a href="#" onclick="loadContent('page2.html', '超链接2'); return false;"
        class="link">超链接2</a>
      <a href="#" onclick="loadContent('page3.html', '超链接3'); return false;"
        class="link">超链接3</a>
    </div>
    <div id="tabsContainer"></div>
    <div id="content"></div>

    <script>
    var tabsContainer = document.getElementById('tabsContainer');
    var contentContainer = document.getElementById('content');
    var activeTab = null;
    
    // 加载内容到右侧窗口
    function loadContent(url, tabName) {
      contentContainer.innerHTML = '加载中...';
      
      // 模拟异步加载页面内容
      setTimeout(function() {
        // 使用 iframe 展示页面内容
        contentContainer.innerHTML = '<iframe src="' + url + '" frameborder="0" style="width: 100%; height: 100%;"></iframe>';
        
        // 创建标签并将其激活
        createTabAndSetActive(url, tabName);
      }, 500);
    }
    
    // 创建标签并将其激活
    function createTabAndSetActive(url, tabName) {
      // 如果标签已存在,则激活该标签
      var tab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (tab) {
        setActiveTab(tab);
        return;
      }
      
      // 创建新的标签
      tab = document.createElement('div');
      tab.className = 'tab';
      tab.setAttribute('data-url', url);
      
      var title = document.createElement('span');
      title.className = 'title';
      title.innerText = tabName;
      tab.appendChild(title);
      
      var closeBtn = document.createElement('span');
      closeBtn.innerText = 'X';
      closeBtn.className = 'close-btn';
      closeBtn.addEventListener('click', function(event) {
        event.stopPropagation();
        closeTab(tab);
      });
      tab.appendChild(closeBtn);
      
      // 点击标签页切换内容
      tab.addEventListener('click', function() {
        loadContent(url, tabName);
        setActiveTab(tab);
      });
      
      tabsContainer.appendChild(tab);
      setActiveTab(tab);
    }
    
    // 设置活动标签页样式
    function setActiveTab(tab) {
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      tabs.forEach(function(t) {
        t.classList.remove('active');
      });
      
      tab.classList.add('active');
      activeTab = tab;
    }
    
    // 关闭标签页
    function closeTab(tab) {
      if (tab === activeTab) {
        contentContainer.innerHTML = '';
        activeTab = null;
      }
      
      tab.parentNode.removeChild(tab);
    }
    </script>
  </body>
</html>

四、更新三、Tab标签实现页面顶部标签栏(超过数量自动删除首项)

效果

解决切换页面时,页面中的内容会进行刷新的问题(实现切换页面,数据不会进行更新的问题)

增加关闭当前页,页面会自动锁定到打开标签页的最后一个页面

增加规定打开标签栏的总数,超过总数,关闭最早打开的页面 

html 标签页切换,前端,html,css,前端

代码

<!DOCTYPE html>
<html>
  <head>
    <style>
    /* 左侧超链接列表 */
    .link {
      display: block;
      padding: 8px;
      background-color: #f2f2f2;
      cursor: pointer;
    }
    
    /* 顶部标签栏 */
    #tabsContainer {
      display: flex;
      align-items: center;
    }
    
    .tab {
      display: flex;
      align-items: center;
      /* padding: 5px 15px 5px 15px; */
      background-color: #f2f2f2;
      cursor: pointer;
      position: relative;
      margin-right: 10px;
      border-radius: 3px;
      
    }
    
    /* 标签标题 */
    .tab .title {
      padding:5px 15px 5px 15px;
    }
    
    /* 标签关闭按钮 */
    .tab .close-btn {
      font-size: 10px;
      font-weight: bold;
      cursor: pointer;
      padding:5px 5px 5px 0;
      /* border:1px solid black; */
    }
    
    .tab.active {
      background-color: #ccc;
    }
    
    /* 右侧内容 */
    #links {
      float: left;
      width: 200px;
      padding: 10px;
    }
    
    #tabs {
      padding: 10px;
    }
    
    #content {
      border: 1px solid #ccc;
      padding: 10px;
      height: 400px;
      overflow: auto;
    }
  </style>
  </head>
  <body>
    <div id="links">
      <!-- 在这里添加你的超链接 -->
      <a href="#" onclick="loadContent('page1.html', '超链接1'); return false;"
        class="link">超链接1</a>
      <a href="#" onclick="loadContent('page2.html', '超链接2'); return false;"
        class="link">超链接2</a>
      <a href="#" onclick="loadContent('page3.html', '超链接3'); return false;"
        class="link">超链接3</a>
      <a href="#" onclick="loadContent('page4.html', '超链接4'); return false;"
        class="link">超链接4</a>
      <a href="#" onclick="loadContent('page5.html', '超链接5'); return false;"
        class="link">超链接5</a>
      <a href="#" onclick="loadContent('page6.html', '超链接6'); return false;"
        class="link">超链接6</a>
    </div>
    <div id="tabsContainer"></div>
    <div id="content"></div>
    <script>
    var tabsContainer = document.getElementById('tabsContainer');
    var contentContainer = document.getElementById('content');
    var activeTab = null;
    
    // 加载内容到右侧窗口
  function loadContent(url, tabName) {
    // 隐藏当前页面内容
    if (activeTab) {
        activeTab.classList.remove('active');
        var activeUrl = activeTab.getAttribute('data-url');
        var activeContent = document.getElementById(activeUrl);
        activeContent.style.display = 'none';
    }
    // 显示新页面内容
    var content = document.getElementById(url);
    if (content) {
        content.style.display = 'block';
    } else {
        content = document.createElement('div');
        content.id = url;
        content.style.display = 'block';
        contentContainer.appendChild(content);

        var iframe = document.createElement('iframe');
        iframe.src = url;
        iframe.frameborder = '0';
        iframe.style.width = '100%';
        iframe.style.height = '100%';
        content.appendChild(iframe);
    }

    createTabAndSetActive(url, tabName);
  }
    
   function createTabAndSetActive(url, tabName) {
      // 如果标签已存在,则激活该标签
      var tab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (tab) {
        setActiveTab(tab);
        return;
      }

     // 判断当前已打开的标签数量
    var existingTabs = tabsContainer.getElementsByClassName('tab');
    if (existingTabs.length >= 5) {
        // 关闭最早打开的标签页
        var firstTab = existingTabs[0];
        closeTab(firstTab);
    }

      // 创建新的标签
      tab = document.createElement('div');
      tab.className = 'tab';
      tab.setAttribute('data-url', url);

      var title = document.createElement('span');
      title.className = 'title';
      title.innerText = tabName;
      tab.appendChild(title);

      var closeBtn = document.createElement('span');
      closeBtn.innerText = 'X';
      closeBtn.className = 'close-btn';
      closeBtn.addEventListener('click', function(event) {
        event.stopPropagation();
        closeTab(tab);
      });
      tab.appendChild(closeBtn);

      // 点击标签页切换内容
      tab.addEventListener('click', function() {
        loadContent(url, tabName);
        setActiveTab(tab);
      });

      tabsContainer.appendChild(tab);
      setActiveTab(tab);
    }
    
   // 设置活动标签页样式
  function setActiveTab(tab) {
    var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
    tabs.forEach(function(t) {
        t.classList.remove('active');
    });

    tab.classList.add('active');
    activeTab = tab;

    // 显示当前标签页对应的内容
    var url = tab.getAttribute('data-url');
    var content = document.getElementById(url);
    if (content) {
        content.style.display = 'block';
    }
  }
    
    // 关闭标签页
    // function closeTab(tab) {
    //   if (tab === activeTab) {
    //     contentContainer.innerHTML = '';
    //     activeTab = null;
    //   }
      
    //   tab.parentNode.removeChild(tab);
    // }
    // 关闭标签页
  function closeTab(tab) {
    var isActiveTab = (tab === activeTab);
    var nextActiveTab = tab.previousElementSibling || tab.nextElementSibling;

    tab.parentNode.removeChild(tab);

    // 如果关闭的是活动标签页且还有其他标签页存在,则将页面锁定到下一个标签页
    if (isActiveTab && nextActiveTab) {
      setActiveTab(nextActiveTab);
      loadContent(nextActiveTab.getAttribute('data-url'), nextActiveTab.querySelector('.title').innerText);
    }

    // 如果关闭的是活动标签页且没有其他标签页存在,则清空内容和活动标签页
    if (isActiveTab && !nextActiveTab) {
      contentContainer.innerHTML = '';
      activeTab = null;
    }

    // 隐藏当前页面内容
    if (isActiveTab) {
      var activeUrl = tab.getAttribute('data-url');
      var activeContent = document.getElementById(activeUrl);
      activeContent.style.display = 'none';
    }
  }
    </script>
  </body>
</html>

五、更新三、Tab标签实现页面顶部标签栏(超过数量,进行提示,但需要自己删除)

链接

前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)_雯0609~的博客-CSDN博客前端:html实现页面切换、顶部标签栏,类似于浏览器的顶部标签栏(完整版)https://blog.csdn.net/weixin_46001736/article/details/132559742?spm=1001.2014.3001.5501

效果

超过页面限制总数,进行提示,不对超出的页面进行展示

增加标签导航栏的横向滚动(超出部分进行隐藏)

增加全部删除标签页(悬停在标签导航栏最右侧出现删除按钮)

html 标签页切换,前端,html,css,前端

代码

<!DOCTYPE html>
<html>

  <head>
    <style>
    /* 左侧超链接列表 */
    .link {
      display: block;
      padding: 8px;
      background-color: #f2f2f2;
      cursor: pointer;
    }

    /* 顶部标签栏 */
    #tabsContainer {
      width:98%;
      display: flex;
      align-items: center;
      overflow-x: auto; /* 添加横向滚动 */
      white-space: nowrap; /* 防止标签换行 */
    }
    #tabsContainer::-webkit-scrollbar {
      display: none; /* 隐藏Webkit浏览器的滚动条 */
    }
    /* 关闭按钮的宽度 */
    .line2{
      width:2%;
    }
    #all_close{
      cursor: pointer;
      display: none;
    }
    .tab_position:hover #all_close {
      display: block;
    }
    .tab_position {
			display: flex;
			align-items: center;/*垂直居中*/
		}
    .tab {
      display: flex;
      align-items: center;
      background-color: #f2f2f2;
      cursor: pointer;
      position: relative;
      margin-right: 10px;
      border-radius: 3px;
    }

    /* 标签标题 */
    .tab .title {
      padding: 5px 15px 5px 15px;
      user-select: none; /* 禁止文字复制 */
    }

    /* 标签关闭按钮 */
    .tab .close-btn {
      font-size: 10px;
      font-weight: bold;
      cursor: pointer;
      padding: 5px 5px 5px 0;
      user-select: none; /* 禁止文字复制 */
    }

    .tab.active {
      background-color: #ccc;
    }

    /* 左侧内容 */
    #links {
      float: left;
      width: 200px;
      padding: 10px;
    }

    #tabs {
      padding: 10px;
    }
    /* 右侧 */
    #content {
      border: 1px solid #ccc;
      padding: 10px;
      overflow: auto;
    }
  </style>
  </head>

  <body>
    <div id="links">
      <!-- 在这里添加你的超链接 -->
      <a href="#" onclick="loadContent('page1.html', '这是我的超链接标题1,我要测试滚动条');
        return
        false;"
        class="link">超链接1</a>
      <a href="#" onclick="loadContent('page2.html', '这是我的超链接标题2,我要测试滚动条');
        return
        false;"
        class="link">超链接2</a>
      <a href="#" onclick="loadContent('page3.html', '这是我的超链接标题3,我要测试滚动条');
        return
        false;"
        class="link">超链接3</a>
      <a href="#" onclick="loadContent('page4.html', '这是我的超链接标题4,我要测试滚动条');
        return
        false;"
        class="link">超链接4</a>
      <a href="#" onclick="loadContent('page5.html', '这是我的超链接标题5,我要测试滚动条');
        return
        false;"
        class="link">超链接5</a>
      <a href="#" onclick="loadContent('page6.html', '这是我的超链接标题6,我要测试滚动条');
        return
        false;"
        class="link">超链接6</a>
      <a href="#" onclick="loadContent('page7.html', '这是我的超链接标题7,我要测试滚动条');
        return
        false;"
        class="link">超链接7</a>
      <a href="#" onclick="loadContent('page8.html', '这是我的超链接标题8,我要测试滚动条');
        return
        false;"
        class="link">超链接8</a>
      <a href="#" onclick="loadContent('page9.html', '这是我的超链接标题9,我要测试滚动条');
        return
        false;"
        class="link">超链接9</a>
    </div>
    <div class="tab_position">
      <div id="tabsContainer"></div>
      <div id="line2">
        <div id="all_close" onclick="all_close()">X</div>
      </div>
    </div>
    <div id="content"></div>
    <script>
    var tabsContainer = document.getElementById('tabsContainer');
    var contentContainer = document.getElementById('content');
    var activeTab = null;

    // 加载内容到右侧窗口
    function loadContent(url, tabName) {
      var existingTab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (existingTab) {
        setActiveTab(existingTab);
        return;
      }

      // 检查标签页数量是否已达上限
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      if (tabs.length >= 7) {
        alert('已达到标签页数量上限');
        return;
      }

      // 隐藏当前页面内容
      if (activeTab) {
        activeTab.classList.remove('active');
        var activeUrl = activeTab.getAttribute('data-url');
        var activeContent = document.getElementById(activeUrl);
        activeContent.style.display = 'none';
      }

      // 显示新页面内容
      var content = document.getElementById(url);
      if (content) {
        content.style.display = 'block';
      } else {
        content = document.createElement('div');
        content.id = url;
        content.style.display = 'block';
        contentContainer.appendChild(content);

        var iframe = document.createElement('iframe');
        iframe.src = url;
        iframe.frameborder = '0';
        iframe.style.width = '100%';
        iframe.style.height = '100%';
        content.appendChild(iframe);
      }

      createTabAndSetActive(url, tabName);
    }


    function createTabAndSetActive(url, tabName) {
      // 如果标签已存在,则激活该标签
      var tab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (tab) {
        setActiveTab(tab);
        return;
      }

      // 创建新的标签
      tab = document.createElement('div');
      tab.className = 'tab';
      tab.setAttribute('data-url', url);

      var title = document.createElement('span');
      title.className = 'title';
      title.innerText = tabName;
      tab.appendChild(title);

      var closeBtn = document.createElement('span');
      closeBtn.innerText = 'X';
      closeBtn.className = 'close-btn';
      closeBtn.addEventListener('click', function (event) {
        event.stopPropagation();
        closeTab(tab);
      });
      tab.appendChild(closeBtn);

      // 点击标签页切换内容
      tab.addEventListener('click', function () {
        loadContent(url, tabName);
        setActiveTab(tab);
      });

      tabsContainer.appendChild(tab);
      setActiveTab(tab);
    }

    // 设置活动标签页样式
    function setActiveTab(tab) {
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      tabs.forEach(function (t) {
        t.classList.remove('active');

        // 隐藏标签页对应的内容
        var tabUrl = t.getAttribute('data-url');
        var tabContent = document.getElementById(tabUrl);
        if (tabContent) {
          tabContent.style.display = 'none';
        }
      });

      tab.classList.add('active');
      activeTab = tab;

      // 显示当前标签页对应的内容
      var url = tab.getAttribute('data-url');
      var content = document.getElementById(url);
      if (content) {
        content.style.display = 'block';
      }
    }

    // 关闭标签页
    function closeTab(tab) {
      var isActiveTab = (tab === activeTab);
      var nextActiveTab = tab.previousElementSibling || tab.nextElementSibling;

      tab.parentNode.removeChild(tab);

      // 如果关闭的是活动标签页且还有其他标签页存在,则将页面锁定到下一个标签页
      if (isActiveTab && nextActiveTab) {
        setActiveTab(nextActiveTab);
        loadContent(nextActiveTab.getAttribute('data-url'), nextActiveTab.querySelector('.title').innerText);
      }

      // 如果关闭的是活动标签页且没有其他标签页存在,则清空内容和活动标签页
      if (isActiveTab && !nextActiveTab) {
        contentContainer.innerHTML = '';
        activeTab = null;
      }
      // 隐藏当前页面内容
      if (isActiveTab) {
        var activeUrl = tab.getAttribute('data-url');
        var activeContent = document.getElementById(activeUrl);
        activeContent.style.display = 'none';
      }
    }

    // 关闭全部未激活标签页
    function all_close() {     
      var confirmation = confirm('是否关闭全部标签页?'); // 显示确认和取消提示框
      if (confirmation) {
        var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
        tabs.forEach(function (tab) {
          if (!tab.classList.contains('active')) {
            closeTab(tab);
          }
        });
        // 清空内容、活动标签页和标签导航栏
        contentContainer.innerHTML = '';
        activeTab = null;
        tabsContainer.innerHTML = '';
      } else {
        console.log('取消')
      }       
    }
    

    var isMouseDown = false;
    var startX = 0;
    var scrollLeft = 0;

    tabsContainer.addEventListener('mousedown', function (e) {
      isMouseDown = true;
      startX = e.pageX - tabsContainer.offsetLeft;
      scrollLeft = tabsContainer.scrollLeft;
    });

    tabsContainer.addEventListener('mouseleave', function () {
      isMouseDown = false;
    });

    tabsContainer.addEventListener('mouseup', function () {
      isMouseDown = false;
    });

    tabsContainer.addEventListener('mousemove', function (e) {
      if (!isMouseDown) return;
      e.preventDefault();
      var x = e.pageX - tabsContainer.offsetLeft;
      var walk = (x - startX) * 2; // 调整滚动速度
      tabsContainer.scrollLeft = scrollLeft - walk;
    });
  </script>
  </body>

</html>

修改BUG(直接替换相应的方法即可解决问题)

问题:当关闭单页存在页面数据未清除的问题

修改方法closeTab()

// 关闭标签页
function closeTab(tab) {
	var isActiveTab = (tab === activeTab);
	var nextActiveTab = tab.previousElementSibling || tab.nextElementSibling;
	var tabUrl = tab.getAttribute('data-url');
	var tabContent = document.getElementById(tabUrl);
	tab.parentNode.removeChild(tab);
	tabContent.parentNode.removeChild(tabContent); // 移除对应的内容
	if (isActiveTab) {
		activeTab = null; // 清空活动标签页
	}
	// 如果关闭的是活动标签页且还有其他标签页存在,则将页面锁定到下一个标签页
	if (isActiveTab && nextActiveTab) {
		setActiveTab(nextActiveTab);
		loadContent(nextActiveTab.getAttribute('data-url'), nextActiveTab.querySelector('.title').innerText);
	}
	// 如果关闭的是活动标签页且没有其他标签页存在,则清空内容和活动标签页
	if (isActiveTab && !nextActiveTab) {
		contentContainer.innerHTML = '';
	}
}

六、补充五:增加标签栏默认页面,其默认页面无法关闭始终展示到右侧内容栏中

效果

html 标签页切换,前端,html,css,前端

修改的核心代码

1、增加打开页面时,加载默认页面

// 如果没有活动标签页或者关闭了全部标签页,则加载默认页面
if (!activeTab || tabsContainer.getElementsByClassName('tab').length === 0) {
    loadContent('page1.html', '默认页面');
}

2、给默认页面取消关闭按钮

if (url === 'page1.html') {
    closeBtn.style.display = 'none';
} else {
    closeBtn.addEventListener('click', function (event) {
        event.stopPropagation();
        closeTab(tab);
    });
}

 3、关闭全部页面时保持默认页面的加载文章来源地址https://www.toymoban.com/news/detail-742312.html

// 加载默认页面
loadContent('page1.html', '默认页面');

代码

<!DOCTYPE html>
<html>

  <head>
    <style>
    /* 左侧超链接列表 */
    .link {
      display: block;
      padding: 8px;
      background-color: #f2f2f2;
      cursor: pointer;
    }

    /* 顶部标签栏 */
    #tabsContainer {
      width: 98%;
      display: flex;
      align-items: center;
      overflow-x: auto;
      /* 添加横向滚动 */
      white-space: nowrap;
      /* 防止标签换行 */
    }

    #tabsContainer::-webkit-scrollbar {
      display: none;
      /* 隐藏Webkit浏览器的滚动条 */
    }

    /* 关闭按钮的宽度 */
    .line2 {
      width: 2%;
    }

    #all_close {
      cursor: pointer;
      display: none;
    }

    .tab_position:hover #all_close {
      display: block;
    }

    .tab_position {
      display: flex;
      align-items: center;
      /*垂直居中*/
    }

    .tab {
      display: flex;
      align-items: center;
      background-color: #f2f2f2;
      cursor: pointer;
      position: relative;
      margin-right: 10px;
      border-radius: 3px;
    }

    /* 标签标题 */
    .tab .title {
      padding: 5px 15px 5px 15px;
      user-select: none;
      /* 禁止文字复制 */
    }

    /* 标签关闭按钮 */
    .tab .close-btn {
      font-size: 10px;
      font-weight: bold;
      cursor: pointer;
      padding: 5px 5px 5px 0;
      user-select: none;
      /* 禁止文字复制 */
    }

    .tab.active {
      background-color: #ccc;
    }

    /* 左侧内容 */
    #links {
      float: left;
      width: 200px;
      padding: 10px;
    }

    #tabs {
      padding: 10px;
    }

    /* 右侧 */
    #content {
      border: 1px solid #ccc;
      padding: 10px;
      overflow: auto;
    }
  </style>
  </head>

  <body>
    <div id="links">
      <!-- 在这里添加你的超链接 -->
      <a href="#" onclick="loadContent('page1.html',
        '这是我的超链接标题1,我要测试滚动条');
        return
        false;" class="link">超链接1</a>
      <a href="#" onclick="loadContent('page2.html',
        '这是我的超链接标题2,我要测试滚动条');
        return
        false;" class="link">超链接2</a>
      <a href="#" onclick="loadContent('page3.html',
        '这是我的超链接标题3,我要测试滚动条');
        return
        false;" class="link">超链接3</a>
      <a href="#" onclick="loadContent('page4.html',
        '这是我的超链接标题4,我要测试滚动条');
        return
        false;" class="link">超链接4</a>
      <a href="#" onclick="loadContent('page5.html',
        '这是我的超链接标题5,我要测试滚动条');
        return
        false;" class="link">超链接5</a>
      <a href="#" onclick="loadContent('page6.html',
        '这是我的超链接标题6,我要测试滚动条');
        return
        false;" class="link">超链接6</a>
      <a href="#" onclick="loadContent('page7.html',
        '这是我的超链接标题7,我要测试滚动条');
        return
        false;" class="link">超链接7</a>
      <a href="#" onclick="loadContent('page8.html',
        '这是我的超链接标题8,我要测试滚动条');
        return
        false;" class="link">超链接8</a>
      <a href="#" onclick="loadContent('page9.html',
        '这是我的超链接标题9,我要测试滚动条');
        return
        false;" class="link">超链接9</a>
    </div>
    <div class="tab_position">
      <div id="tabsContainer"></div>
      <div id="line2">
        <div id="all_close" onclick="all_close()">X</div>
      </div>
    </div>
    <div id="content"></div>
    <script>
    var tabsContainer = document.getElementById('tabsContainer');
    var contentContainer = document.getElementById('content');
    var activeTab = null;

    // 加载内容到右侧窗口
    function loadContent(url, tabName) {
      var existingTab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (existingTab) {
        setActiveTab(existingTab);
        return;
      }

      // 检查标签页数量是否已达上限
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      if (tabs.length >= 7) {
        alert('已达到标签页数量上限');
        return;
      }

      // 隐藏当前页面内容
      if (activeTab) {
        activeTab.classList.remove('active');
        var activeUrl = activeTab.getAttribute('data-url');
        var activeContent = document.getElementById(activeUrl);
        activeContent.style.display = 'none';
      }

      // 显示新页面内容
      var content = document.getElementById(url);
      if (content) {
        content.style.display = 'block';
      } else {
        content = document.createElement('div');
        content.id = url;
        content.style.display = 'block';
        contentContainer.appendChild(content);

        var iframe = document.createElement('iframe');
        iframe.src = url;
        iframe.frameborder = '0';
        iframe.style.width = '100%';
        iframe.style.height = '100%';
        content.appendChild(iframe);
      }

      createTabAndSetActive(url, tabName);
    }
    // 如果没有活动标签页或者关闭了全部标签页,则加载默认页面
    if (!activeTab || tabsContainer.getElementsByClassName('tab').length === 0) {
      loadContent('page1.html', '默认页面');
    }
    function createTabAndSetActive(url, tabName) {
      // 如果标签已存在,则激活该标签
      var tab = tabsContainer.querySelector('[data-url="' + url + '"]');
      if (tab) {
        setActiveTab(tab);
        return;
      }

      // 创建新的标签
      tab = document.createElement('div');
      tab.className = 'tab';
      tab.setAttribute('data-url', url);

      var title = document.createElement('span');
      title.className = 'title';
      title.innerText = tabName;
      tab.appendChild(title);

      var closeBtn = document.createElement('span');
      closeBtn.innerText = 'X';
      closeBtn.className = 'close-btn';
      if (url === 'page1.html') {
        closeBtn.style.display = 'none';
      } else {
        closeBtn.addEventListener('click', function (event) {
          event.stopPropagation();
          closeTab(tab);
        });
      }
      tab.appendChild(closeBtn);

      // 点击标签页切换内容
      tab.addEventListener('click', function () {
        loadContent(url, tabName);
        setActiveTab(tab);
      });

      tabsContainer.appendChild(tab);
      setActiveTab(tab);
    }

    // 设置活动标签页样式
    function setActiveTab(tab) {
      var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
      tabs.forEach(function (t) {
        t.classList.remove('active');

        // 隐藏标签页对应的内容
        var tabUrl = t.getAttribute('data-url');
        var tabContent = document.getElementById(tabUrl);
        if (tabContent) {
          tabContent.style.display = 'none';
        }
      });

      tab.classList.add('active');
      activeTab = tab;

      // 显示当前标签页对应的内容
      var url = tab.getAttribute('data-url');
      var content = document.getElementById(url);
      if (content) {
        content.style.display = 'block';
      }
    }

    // 关闭标签页
    function closeTab(tab) {
      var isActiveTab = (tab === activeTab);
      var nextActiveTab = tab.previousElementSibling || tab.nextElementSibling;
      var tabUrl = tab.getAttribute('data-url');
      var tabContent = document.getElementById(tabUrl);
      tab.parentNode.removeChild(tab);
      tabContent.parentNode.removeChild(tabContent); // 移除对应的内容
      if (isActiveTab) {
        activeTab = null; // 清空活动标签页
      }
      // 如果关闭的是活动标签页且还有其他标签页存在,则将页面锁定到下一个标签页
      if (isActiveTab && nextActiveTab) {
        setActiveTab(nextActiveTab);
        loadContent(nextActiveTab.getAttribute('data-url'), nextActiveTab.querySelector('.title').innerText);
      }
      // 如果关闭的是活动标签页且没有其他标签页存在,则清空内容和活动标签页
      if (isActiveTab && !nextActiveTab) {
        contentContainer.innerHTML = '';
      }
    }

    // 关闭全部未激活标签页
    function all_close() {
      var confirmation = confirm('是否关闭全部标签页?'); // 显示确认和取消提示框
      if (confirmation) {
        var tabs = Array.from(tabsContainer.getElementsByClassName('tab'));
        tabs.forEach(function (tab) {
          if (!tab.classList.contains('active')) {
            closeTab(tab);
          }
        });
        // 清空内容、活动标签页和标签导航栏
        contentContainer.innerHTML = '';
        activeTab = null;
        tabsContainer.innerHTML = '';
        // 加载默认页面
        loadContent('page1.html', '默认页面');
      } else {
        console.log('取消')
      }
    }


    var isMouseDown = false;
    var startX = 0;
    var scrollLeft = 0;

    tabsContainer.addEventListener('mousedown', function (e) {
      isMouseDown = true;
      startX = e.pageX - tabsContainer.offsetLeft;
      scrollLeft = tabsContainer.scrollLeft;
    });

    tabsContainer.addEventListener('mouseleave', function () {
      isMouseDown = false;
    });

    tabsContainer.addEventListener('mouseup', function () {
      isMouseDown = false;
    });

    tabsContainer.addEventListener('mousemove', function (e) {
      if (!isMouseDown) return;
      e.preventDefault();
      var x = e.pageX - tabsContainer.offsetLeft;
      var walk = (x - startX) * 2; // 调整滚动速度
      tabsContainer.scrollLeft = scrollLeft - walk;
    });
  </script>
  </body>

</html>

注:五、六是文章的最完整版本,六在五的基础上多了默认页面的展示

到了这里,关于前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3中如何实现通过点击不同的按钮切换不同的页面

    完成以上需求,我们可以使用vue中的component标签来实现。 component是Vue.js中一个特殊的标签,用于动态地绑定其它组件。它可以与v-bind:is指令一起使用,来决定要渲染哪个组件。下面是示例代码

    2024年02月09日
    浏览(54)
  • 基于html+js实现轮播图(自动轮播、左右按钮、小圆点点击及切换图片)

    使用html和js实现的一个简单小练习轮播图。大概功能主要是: 1、使用时间函数自动切换图片; 2、在图片及按钮及小圆点的父节点身上绑定事件代理,添加mouseenter及mouseleave事件类型,让鼠标移入,图片暂停,移出,图片恢复轮播; 3、在按钮的父节点身上绑定事件代理,事

    2024年02月11日
    浏览(44)
  • html+js实现输入用户名和密码点击登录跳转页面

    html+js实现: 输入用户名和密码点击登录跳转其他页面 这里主页是index.html 跳转的页面名字是随机点名.html 1.index.html  2.随机点名.html

    2024年02月11日
    浏览(46)
  • 实现html页面插入视频的自动播放、视频播放结束后的事件触发(video标签)

    要实现自动播放需要同时使用autoplay和muted属性,简单示例代码如下: html代码: css代码: 要实现视频播放结束后的事件触发需要使用addEventListener(“ended”, function () {})进行事件监听,简单示例代码如下: html代码: css代码: js代码: (1)菜鸟网址:https://www.runoob.com/tags/t

    2024年02月05日
    浏览(50)
  • 解决element ui中el-tabs标签点击切换闪屏问题

    现象:点击切换 element ui中el-tabs时候,table会出现闪一下的状况; 初始element ui中el-tabs组件代码如下: 使用v-if=\\\"activeName===\\\'first\\\'\\\" 解决闪屏   改造后代码如下:

    2024年02月07日
    浏览(48)
  • 前端vue基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月03日
    浏览(48)
  • CSS样式前端HTML页面常用CSS效果实现及其相关配置信息------前端入门基础教程

    !DOCTYPE html !-- 这是HTML的注释 -- html lang=\\\"en\\\" id=\\\"myHtml\\\"     head         !-- 这里不是设置了编码,而是告诉浏览器,用什么编码方式打开文件避免乱码 --         meta charset=\\\"UTF-8\\\"         meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\"         titleHtmlAll/title         

    2024年02月05日
    浏览(59)
  • 前端 | 一个导航栏点击滑动切换框架

    鼠标滚轮上下滑动切换。 导航栏点击切换。 侧边栏小圆点点击切换。 基本框架就是head头部导航栏+content内容区域。 其中content里头套列表,每个列表对应一个切换页面。 加/减角度就在head里和content里添加 li 。 重置样式 :对页面中各个元素的默认样式进行重置,包括设置页

    2024年02月04日
    浏览(47)
  • Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

    一、背景介绍 ​ 当我们在不想改变后端代码的同时想是纯html页面导出PDF,那么(html2canvas+jspdf)就是无疑最好的选择,导出时它不占用我们服务器的资源,而是由用户本地自行执行js文件下载PDF,不占用我们系统的带宽,所以这无非是最好的选择方式。 二、疑问 1、为什么要

    2024年01月23日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包