JS实现网页页面的框架(demo)

简介: JS实现网页页面的框架(demo)

采用JS实现网页页面的框架

采用的技术点有html,css,JS,jQuery


成品:




HTML:


<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <link rel="stylesheet" href="./css/home.css">
  <link rel="stylesheet" href="./css/aaaaaaa.css">
 
  <script src="js/jquery-3.7.0.js"></script>
  </head>
  <body>
  <!-- 注释的东西到时候可以添加导航栏 -->
  <div class="frame">
    <div class="frame_left">
    <!-- 头部一会要换掉 -->
    <div class="frame_left_title">
      <img src="./img/bcb1ecb0-f75d-4ff9-8fde-c0213535183d.png" alt="">
      <p class="left_show">礼盒商城</p>
    </div>
    <div class="frame_list">
      <div class="frame_item">
      <div class="frame_item_prent" onclick="listOpen(event)">
        <div>
        <img src="./img/123.png" alt="">
        <p class="left_show">账号管理</p>
        </div>
        <img class="left_show" src="./img/向上箭头.png" alt="">
      </div>
      <div class="frame_item_child">
        <div class="frame_child_item">
        <img src="./img/123.png" alt="">
        <p>人员管理</p>
        </div>
        <div class="frame_child_item">
        <img src="./img/123.png" alt="">
        <p>人员管理</p>
        </div>
        <div class="frame_child_item">
        <img src="./img/123.png" alt="">
        <p>人员管理</p>
        </div>
      </div>
      </div>
    </div>
    </div>
    <div class="frame_top">
    <div class="frame_info">
      <div class="frame_info_i">
      <img src="./img/展开列.png" alt="" onclick="isToggle()">
      <p>数据统计</p>
      </div>
      <div class="frame_info_in">
      <div class="frame_fr">
        <img src="./img/搜索 (2).png" alt="">
        <img src="./img/文字.png" alt="">
        <img src="./img/日间模式.png" alt="">
        <img src="./img/设置.png" alt="">
        <div class="zzzz">
        <div>admin</div>
        <img src="./img/0775639c-c82c-4a29-937f-d2a3bae5151a.png" alt="" width="40px"
          height="40px" id="touxiang">
        <button id="quit">退出登录</button>
        </div>
      </div>
      </div>
    </div>
    <div class="frame_nav">
      <div class="nav_home" onclick="isHref('数据统计','/','')">数据统计</div>
      <div class="nav_list">
      <!-- <div class="nav_item">
        <p>页面</p>
        <img src="./img/删除.png" alt="">
      </div>
      <div class="nav_item">
        <p>页面</p>
        <img src="./img/删除.png" alt="">
      </div>
      <div class="nav_item">
        <p>页面</p>
        <img src="./img/删除.png" alt="">
      </div> -->
      </div>
    </div>
    </div>
    <div class="frame_content">
   
  
   
    </div>
  </div>
  <!-- 退出登录 -->
  <div class="box_x" style="display: none;">
    <div id="xiugai"
    style="background-color: #000;opacity: 40%;width: 100%;height: 100%;position: fixed;top: 0;left: 0; z-index: 5;">
    </div>
    <div class="hint">
    <div class="hint-h">
      <p>提示操作</p>
    </div>
    <div class="hint-i">
      <img src="./img/307感叹号-圆框.png" alt="" width="20px" height="20px">
      <p>您确定要退出运营管理公司?</p>
    </div>
    <div class="hint-n">
      <button id="quxiao">取消</button>
      <button id="queding">确定</button>
    </div>
    </div>
  </div>
  <script src="js/home.js"></script>
  </body>
</html>


CSS:


/* 注释的东西到时候可以添加导航栏 */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.frame {
  width: 100%;
  height: 100vh;
  overflow: hidden;
  position: relative;
}
.frame_left {
  width: 220px;
  height: 100%;
  background-color: #eeeeee;
  overflow-y: scroll;
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1;
  scrollbar-width: none;
  -ms-overflow-style: none;
  transition: all 1s;
}
.frame_left ::-webkit-scrollbar {
  display: none;
}
.frame_left_title {
  width: 240px;
  height: 60px;
  display: flex;
  /* justify-content: center; */
  align-items: center;
}
.frame_left_title img {
  width: 60px;
  /* height: 60px; */
}
.frame_left_title p {
  font-size: 20px;
  margin-left: 10px;
}
.frame_list {
  width: 100%;
  width: 220px;
}
.frame_item_prent {
  width: 100%;
  height: 70px;
  display: flex;
  justify-content: space-between;
  padding: 0 20px;
  align-items: center;
}
.frame_item_prent:hover {
  background-color: #CCCCCC;
  color: #fff;
}
.frame_item_prent div {
  display: flex;
}
.frame_item_prent img {
  width: 30px;
}
.frame_item_prent p {
  line-height: 30px;
  margin-left: 20PX;
}
.frame_item_prent>img {
  width: 18px;
  transform: rotate(180deg);
}
.frame_item {
  width: 100%;
  position: relative;
}
.frame_item_hover {
  display: none;
  position: absolute;
  z-index: 10;
  top: 0px;
  left: 70px;
  background-color: #fff;
  box-shadow: 0px 2px 5px 2px #b5b5b5;
}
.frame_item_hover .frame_child_item {
  padding: 0px 20px;
}
.frame_child_item:hover {
  background-color: #cccccc;
  color: #3796FF;
}
.frame_item_child {
  width: 100%;
  display: none;
  white-space: nowrap;
}
.frame_child_item {
  width: 100%;
  padding-left: 40px;
  height: 50px;
  display: flex;
  align-items: center;
}
.frame_child_item img {
  width: 30px;
  height: 30px;
}
.frame_child_item p {
  margin-left: 10px;
  white-space: nowrap;
}
.frame_top {
  width: calc(100% - 220px);
  height: 50px;
  /* line-height: 60px; */
  background-color: #EEEEEE;
  position: absolute;
  top: 0;
  right: 0;
  z-index: 5;
  transition: all 1s;
  /*  display: flex;
  justify-content: space-between; */
}
.frame_info {
  width: 100%;
  height: 50px;
  /* background-color: #eeeeee; */
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* border-bottom: 1px solid #DCDFE6; */
  /* position: absolute; */
}
.frame_info img {
  width: 25px;
  height: 25px;
  margin: 10px 20px;
}
.frame_info_i {
  width: 160px;
  display: flex;
  /* justify-content: space-between; */
  align-items: center;
}
/* 
.frame_fr{
  display: flex;
  justify-content: space-between;
} */
.frame_info_in {}
.frame_fr {
  padding-right: 1%;
  display: flex;
  width: 450px;
  justify-content: space-evenly;
  align-items: center;
}
/* 退出弹窗 */
.zzzz {
  width: 100px;
  display: flex;
  justify-content: space-between;
  position: relative;
  align-items: center;
}
#quit {
  background-color: white;
  box-shadow: 5px 5px 20px #2c3e50;
  width: 90px;
  height: 35px;
  border: 1px solid #e2e2e2;
  opacity: 0;
  transition: 0.5s;
  top: 50px;
  position: absolute;
  right: 5px;
  z-index: 4;
  border-radius: 5px;
}
/* 提示弹窗 退出登录 批量删除 */
.hint {
  background-color: white;
  width: 450px;
  height: 150px;
  position: fixed;
  top: 45%;
  left: 40%;
  border-radius: 10px;
  z-index: 6;
}
.hint-h p {
  padding: 10px;
  font-size: 22px;
}
.hint-i {
  display: flex;
  padding: 10px;
}
.hint-i p {
  margin-left: 15px;
}
.hint-n {
  padding: 10px;
  margin-left: 60%;
}
.hint-n button {
  width: 72px;
  height: 35px;
  border-radius: 5px;
  border: 1px solid #e2e2e2;
}
#queding {
  background-color: #409EFF;
  color: white;
}
.frame_nav {
  /* top: 60px; */
  width: 100%;
  height: 50px;
  display: flex;
  /* line-height: 50px; */
  /* position: fixed; */
  /* padding: 0 20px; */
  /* margin-top: 15px; */
  background-color: #eeeeee;
}
.frame_content {
  width: calc(100% - 220px);
  height: calc(100% - 100px);
  /* 原本为100高度,现在为50,删除了导航栏的高度 */
  background-color: #F2F3F5;
  position: absolute;
  bottom: 0;
  right: 0;
  z-index: 1;
  padding: 20px;
  transition: all 1s;
  /* overflow: scroll; */
}
/* 面包屑,头顶导航栏 */
.nav_list {
  /* width: 100%; */
  height: 50px;
  padding: 5px 0;
  display: flex;
}
.nav_item {
  padding: 0 10px;
  display: flex;
  align-items: center;
  margin-right: 10px;
  background-color: #ccc;
}
.nav_item img {
  width: 20px;
}
.nav_item p {
  /* margin-right: 8px; */
}
.nav_home {
  padding: 0 10px;
  display: flex;
  justify-content: center;
  align-items: center;
  margin-right: 10px;
  background-color: #ccc;
  height: 40px;
  line-height: 40px;
  margin: 5px 5px;
}
.nav_home img {
  width: 20px;
}
.nav_home p {
  margin-right: 8px;
}
.active {
  background-color: #fff;
  color: #3796FF;
}


JS:


// 所有的名称是下划线还是横线要注意
// 二级列表展开事件
function listOpen(e) {
  $(e.target).next(".frame_item_child").toggle(500);
}
// 菜单折叠事件
function isToggle() {
  if ($(".frame_left").width() < 220) {
  $(".frame_left").css('width', '220px');
  $(".frame_top").css('width', 'calc(100% - 220px)');
  $(".frame_content").css('width', 'calc(100% - 220px)');
  $(".left_show").show()
  $(".frame_left").css({
    'z-index': '1',
    'overflow-y': 'scroll'
  });
  $(".frame_left_title").css('width', '220px');
  $(".frame_item").css('width', '220px');
  $(".frame_item_hover").hide()
  $(".frame_item_hover").attr('class', 'frame_item_child');
  } else {
  $(".frame_left").css('width', '80px');
  $(".frame_top").css('width', 'calc(100% - 80px)');
  $(".frame_content").css('width', 'calc(100% - 80px)');
  $(".left_show").hide();
  $(".frame_left").css({
    'z-index': '9',
    'overflow-y': 'visible'
  });
  $(".frame_left_title").css('width', '80px');
  $(".frame_item").css('width', '80px');
  $(".frame_item_child").hide();
  $(".frame_item_child").attr('class', 'frame_item_hover');
  }
}
// 这是一个登录请求的接口,请求成功后返回一个树形菜单的数组,下面需要用到
let list = []
$.ajax({
  type: "POST",
  url: 地址
  data: {
  需要请求的参数
  },
  success: (res) => {
  console.log(res);
  list = res.data.menu;
  console.log(list);
  renders()
  }
})
function renders() {
  let name = sessionStorage.getItem("name") || '';
  let parent = sessionStorage.getItem("parent") || '';
  console.log(list);
  let str = '';
  for (let i = 0; i < list.length; i++) {
  if (list[i].children && list[i].children.length > 1) {
    str += `
    <div class="frame_item">
      <div class="frame_item_prent ${list[i].meta.locale == name && parent != name ? 'active' : ''}" onclick="listOpen(event)">
      <div>
        <img src="./img/123.png" alt="">
        <p class="left_show">${list[i].meta.locale}</p>
      </div>
      <img class="left_show" src="./img/向上箭头.png" alt="">
      </div>
      <div class="frame_item_child" style="display:${parent == list[i].meta.locale ? 'block' : 'none'}">
    `;
    for (let k = 0; k < list[i].children.length; k++) {
    str += `
      <div class="frame_child_item ${list[i].children[k].meta.locale == name ? 'active' : ''}" onclick="isHref('${list[i].children[k].meta.locale}','${list[i].children[k].meta.path}','${list[i].meta.locale}')">
      <img src="./img/123.png" alt="">
      <p>${list[i].children[k].meta.locale}</p>
      </div>
    `;
    }
    str += `</div>
      </div>`;
  } else {
    str += `
    <div class="frame_item" onclick="isHref('${list[i].meta.locale}','${list[i].meta.path}','${list[i].meta.locale}')">
      <div class="frame_item_prent ${list[i].meta.locale == name ? 'active' : ''}">
      <div>
        <img src="./img/123.png" alt="">
        <p class="left_show">${list[i].meta.locale}</p>
      </div>
      </div>
    </div>
    <div class="frame_item_child"></div>
    `;
  }
  }
  $('.frame_list').html(str);
  a ()
}
function a (){
  for (let i = 0; i < $('.frame_item').length; i++) {
  $('.frame_item').eq(i).on('mouseover', function() {
    $('.frame_item_hover').eq(i).show()
  })
  $('.frame_item').eq(i).on('mouseout', function() {
    $('.frame_item_hover').eq(i).hide()
  })
  }
}
function isHref(name,path,parent){
  if (path == '/') {
  location.href = './home.html';
  return
  }
  let nav = JSON.parse(sessionStorage.getItem('nav')) || [];
  let status = false;
  sessionStorage.setItem("name", name);
  sessionStorage.setItem("parent", parent);
  for (let i = 0; i < nav.length; i++) {
  if (nav[i].name == name) {
    status = true;
    break;
  }
  }
  if (!status) {
  nav.push({
    name: name,
    path: path,
    parent: parent
  })
  sessionStorage.setItem("nav", JSON.stringify(nav));
  }
  location.href = '.' + path + '.html';
  console.log(name);
  console.log(path);
}
renderNav()
function renderNav() {
  let name = sessionStorage.getItem("name") || '';
  let nav = JSON.parse(sessionStorage.getItem('nav')) || [];
  let str = '';
  for (let i = 0; i < nav.length; i++) {
  str += `
  <div class="nav_item ${name == nav[i].name ? 'active' : ''}">
    <p onclick="isHref('${nav[i].name}','${nav[i].path}','${nav[i].parent}')">${nav[i].name}</p>
    <img src="./img/删除.png" alt="" onclick="del(${i})">
  </div>
  `;
  }
  document.getElementsByClassName("nav_list")[0].innerHTML = str;
  if (name == '数据统计') {
  $(".nav_home").addClass("active");
  } else {
  $(".nav_home").removeClass("active");
  }
}
// 删除
function del(i) {
  let nav = JSON.parse(sessionStorage.getItem('nav')) || [];
  nav.splice(i, 1);
  sessionStorage.setItem("nav", JSON.stringify(nav));
  let name, parent;
  if (nav[i - 1]) {
  name = nav[i - 1].name;
  parent = nav[i - 1].parent;
  } else if (nav[0]) {
  name = nav[0].name;
  parent = nav[0].parent;
  } else {
  name = '数据统计';
  parent = '';
  }
  sessionStorage.setItem("name", name);
  sessionStorage.setItem("parent", parent);
  renderNav();
  renders();
}
// 退出登录、切换登录
let quit = document.getElementById("quit");
let zzzz = document.getElementsByClassName("zzzz")[0];
let box = document.getElementsByClassName("box_x")[0];
// 鼠标放上去显示退出登录
zzzz.addEventListener("mouseenter", () => {
  quit.style.opacity = "1"
})
zzzz.addEventListener("mouseleave", () => {
  quit.style.opacity = "0"
})
// 退出登录/切换用户
quit.addEventListener("click", () => {
  box.style.display = "block"
})
quxiao.addEventListener("click", () => {
  box.style.display = "none"
})
xiugai.addEventListener("click", () => {
  box.style.display = "none"
})
queding.addEventListener("click", () => {
  sessionStorage.removeItem('nav')
  sessionStorage.removeItem('info')
  location.href = './index.html'
})


相关文章
|
8天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
30天前
|
存储 JavaScript 前端开发
使用JavaScript构建动态交互式网页:从基础到实践
【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
69 1
|
1月前
|
JavaScript 前端开发 API
Vue.js:现代前端开发的强大框架
【10月更文挑战第11天】Vue.js:现代前端开发的强大框架
65 41
|
11天前
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
20 2
|
14天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
35 4
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
15 1
【JavaScript】网页交互的灵魂舞者
|
21天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的完美结合
【10月更文挑战第21天】本文将引导你走进Node.js和Express框架的世界,探索它们如何共同打造一个高效、可扩展的后端服务。通过深入浅出的解释和实际代码示例,我们将一起理解这一组合的魅力所在,并学习如何利用它们来构建现代Web应用。
40 1
|
9天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实践
【10月更文挑战第33天】在数字化时代的浪潮中,后端服务的效率和可靠性成为企业竞争的关键。本文将深入探讨如何利用Node.js和Express框架构建高效且易于维护的后端服务。通过实践案例和代码示例,我们将揭示这一组合如何简化开发流程、优化性能,并提升用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
11天前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的融合之道
【10月更文挑战第31天】在追求快速、灵活和高效的后端开发领域,Node.js与Express框架的结合如同咖啡遇见了奶油——完美融合。本文将带你探索这一组合如何让后端服务搭建变得既轻松又充满乐趣,同时确保你的应用能够以光速运行。
20 0
|
1月前
|
JavaScript 前端开发 API