当前位置: 首页 > news >正文

学习记录-cssjs-综合复习案例(二)

目录

  • 商城复合案例功能实现(二)
  • 商城首页实现步骤
      • 1.准备工作
      • 2. 搭建html框架
      • 3. 编写js代码
  • 完整实例代码
  • 完整项目心得

商城复合案例功能实现(二)

  1. 使用html,css,基于bootstrap框架以及媒体查询搭建响应式布局页面
  2. 案例共三页,包括首页板块,女装板块,以及单个商品板块,单击互相跳转
  3. 女装页包括tab栏,映射,数据筛选等功能,单个商品页包括轮播图,tab栏,商品放大镜,映射等功能,首页包含轮播图,映射等功能

商城首页实现步骤

1.准备工作

  1. 首页与女装页放在同一页面,通过tab栏切换各个板块的dispaly,实现切换页面的效果
  2. 女装页和男装,特惠,其它页面结构相似,可以只进行标题的修改,剩下照搬

2. 搭建html框架

商品首页
在这里插入图片描述

代码

		<div class="container home page">
    <div class="slider">
      <img src="../assets/upholds/slider0.png" alt="">
      <ul>
        <li data-id="0" class="active"></li>
        <li data-id="1"></li>
        <li data-id="2"></li>
      </ul>
      <button>购买</button>
    </div>
    <div class="topic-one">
      <h3>私人定制,纯手工打造</h3>
      <div>精选优选自中国新疆阿克苏的高纯白棉花制造的面料,来自英国服装设计大量大卫团队精心设计,时尚而又舒适</div>
    </div>
    <div class="home-content row">
      <div class="col-12 col-xl-6 col-lg-6"><a href="javascript:;"
          style="background: url(../assets/upholds/home-content1.png) -50px;">
          <div class="mb">男装</div>
        </a></div>
      <div class="col-6 col-xl-3 col-lg-3 class=" col-12 col-md-12""><a href="javascript:;"
          style="background: url(../assets/upholds/home-content3.png) -50px;">
          <div class="mb">推荐</div>
        </a></div>
      <div class="col-6 col-xl-3 col-lg-3"><a href="javascript:;"
          style="background: url(../assets/upholds/home-content4.png) -50px;">
          <div class="mb">首页</div>
        </a></div>
      <div class="col-6 col-xl-3 col-lg-3"><a href="javascript:;"
          style="background: url(../assets/upholds/home-content6.png) -50px;">
          <div class="mb">特价</div>
        </a></div>
      <div class="col-6 col-xl-3 col-lg-3"><a href="javascript:;"
          style="background: url(../assets/upholds/home-content5.png) -50px;">
          <div class="mb">箱包</div>
        </a></div>
      <div class="col-12 col-xl-6 col-lg-6"><a href="javascript:;"
          style="background: url(../assets/upholds/home-content2.png) -50px;">
          <div class="mb">女装</div>
        </a></div>
    </div>
    <div class="topic-two">
      <h3>今年流行</h3>
    </div>
    <!-- 其他服饰 -->
    <div class="other-content">
      <div class="other-costume">
        <ul class="row">

        </ul>
      </div>
    </div>
    <div class="topic-three">
      <h3>最新时装介绍</h3>
    </div>
    <div class="home-new row">
      <div class="col-12 col-md-4 col-lg-4"><a href="javascript:;"
          style="background: url(../assets/upholds/new-content1.png);">
          <div class="mb">
            <div class="content">穿着自己最喜爱的时尚衣服去喝
              咖啡,咖啡的味道如此美好...</div>
            <div class="date">2018-7-16</div>
          </div>
        </a></div>
      <div class="col-12 col-md-4 col-lg-4"><a href="javascript:;"
          style="background: url(../assets/upholds/new-content2.png);">
          <div class="mb">
            <div class="content">穿着自己最喜爱的时尚衣服去看大海
              大海是如此的美好...</div>
            <div class="date">2018-7-16</div>
          </div>
        </a></div>
      <div class="col-12 col-md-4 col-lg-4"><a href="javascript:;"
          style="background: url(../assets/upholds/new-content3.png);">
          <div class="mb">
            <div class="content">穿着自己最喜爱的时尚衣服去户外
              生活是如此的美好...</div>
            <div class="date">2018-7-16</div>
          </div>
        </a></div>
    </div>
    <div class="register">
      <h3>注册送大礼</h3>
      <div>注册我们网站的新用户,我们将送一份礼物给你,你只需注册后留下地址和手机号码即可</div>
      <div class="search">
        <input type="text" placeholder="你的邮箱">
        <button>订阅</button>
      </div>
    </div>
  </div>

实现效果
在这里插入图片描述

3. 编写js代码

首页轮播图
事件委托自定义属性

	const slider = document.querySelector('.home .slider')
	const img = document.querySelector('.slider img')
	const lis = document.querySelectorAll('.slider li')
	let timer
	let num = 0
	function autoPlay() {
	  timer = setInterval(() => {
	    num++
	    if (num >= 3) {
	      num = 0
	    }
	    img.src = `../assets/upholds/slider${num}.png`
	    lis.forEach(li => {
	      li.classList.remove('active')
	    })
	    lis[num].classList.add('active')
	  }, 2000)
	}
	slider.addEventListener('mouseenter', () => {
	  clearInterval(timer)
	})
	slider.addEventListener('mouseleave', () => {
	  autoPlay()
	})
	autoPlay()
	slider.addEventListener('click', (e) => {
	  if (e.target.tagName === 'LI') {
	    img.src = `../assets/upholds/slider${e.target.dataset.id}.png`
	    lis.forEach(li => {
	      li.classList.remove('active')
	    })
	    lis[e.target.dataset.id].classList.add('active')
	  }
	})

实现效果
在这里插入图片描述

鼠标移入出现蒙版

	const masks = document.querySelectorAll('.home-content a')
	console.log(masks)
	masks.forEach(mask => {
	  mask.addEventListener('mouseenter', () => {
	    mask.children[0].style.display = 'block'
	  })
	  mask.addEventListener('mouseleave', () => {
	    mask.children[0].style.display = 'none'
	  })
	})

实现效果
在这里插入图片描述

tab栏切换板块

  1. 因为商品板块全都是映射得来的,所以在每次渲染完页面后都要重复进行部分js操作,最好将部分js步骤给封装起来,方便复用
	const nav = document.querySelector('.nav')
	const pages = document.querySelectorAll('.page')
	nav.addEventListener('click', function (e) {
	  if (e.target.tagName === 'A') {
	    const randomArr = []
	    for (let i = 0; i < 12; i++) {
	      const random = Math.floor(Math.random() * initData.length)
	      randomArr.push(initData[random])
	    }
	    document.querySelector('.nav .active').classList.remove('active')
	    e.target.classList.add('active')
	    pages.forEach(items => {
	      items.style.display = 'none'
	    })
	    pages[e.target.dataset.id].style.display = 'block'
	    addData(randomArr)
	    addImg()
	  }
	})

实现效果
在这里插入图片描述
tab栏数据筛选

const femaleNav = document.querySelectorAll('.female-nav')
femaleNav.forEach(nav => {
  nav.addEventListener('click', (e) => {
    femaleNav[0].classList.add('active')
    if (e.target.tagName === 'A') {
      document.querySelectorAll('.female-nav .active').forEach(item => {
        item.classList.remove('active')
      })

      e.target.classList.add('active')
      if (e.target.dataset.id === '0') {
        addData(initData)
        cx()
      }
      if (e.target.dataset.id === '1') {
        const arr = initData.filter(item => {
          return item.status === '特价'
        })
        addData(arr)
        cx()
      }
      if (e.target.dataset.id === '2') {
        const arr = initData.filter(item => {
          return item.status === ''
        })
        addData(arr)
        cx()
      }
      if (e.target.dataset.id === '3') {
        const arr = initData.filter(item => {
          return item.price < 200 && item.discount !== ''
        })
        addData(arr)
        cx()
      }
      if (e.target.dataset.id === '4') {
        const arr = initData.filter(item => {
          return item.price < 150 || item.discount < 150 && item.discount !== ''
        })
        addData(arr)
        cx()
      }
    }
  })
})

实现效果
在这里插入图片描述

商品渲染进阶
当所得数据存在discount时,price所在数字出现中划线

		function cx() {
	  const price = document.querySelectorAll('.other-costume .price')
	  const discount = document.querySelectorAll('.other-costume .discount')
	  for (let i = 0; i < price.length; i++) {
	    if (discount[i].innerHTML !== '') {
	      price[i].children[0].style.textDecoration = 'line-through'
	    }
	  }
	}
	window.onload = cx

当所得数据的status为特价或者售完,会将其标识在商品左上角中

	arr.filter(({ name, price, discount, src, status }) => {
	    let soldStatus
	    if (status === '售完') {
	      soldStatus = 'out'
	    } else if (status === '特价') {
	      soldStatus = 'free'
	    } else {
	      soldStatus = ''
	    }

完整实例代码

见所上传资料

完整项目心得

通过此次项目,我复习了css,less,bootstrap栅格化,媒体查询等知识,使自己可以还原百分之八十以上的静态页面,同时,我也使用了最近学过的轮播图,tab栏,数据筛选,等所有知识,我深刻的了解到了框架的重要性,如果只使用原生代码,会导致包括变量名冲突等一系列问题,接下来我将继续学习,会记录一些前端面试题,同时准备接下来的暑期实习。

相关文章:

  • 【从零开始学习计算机科学与技术】系统工程概论(四)系统仿真 与 系统评估
  • 微服务聚合架构是什么
  • MySQL 表分区实践案例:基于 ERP 订单系统的租户分区
  • Java 第十一章 GUI编程(3)
  • golang接口用法-代码案例
  • 基于SpringBoot的在线学习平台
  • C++的构造函数和析构函数
  • electron-builder创建桌面应用
  • Visual Studio2022 中的隐形用法
  • 使用命令行工具控制wireshark对抓包文件进行针对性处理的总结
  • 代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字
  • 嵌入式硬件工程师从小白到入门-原理图(三)
  • lecode2680. 最大或值-medium
  • <el-autocompoete>下拉列表,点击选择之后的操作事件
  • 【人工智能】LM Studio 的 GPU 加速:释放大模型推理潜能的极致优化
  • 源码分析之Leaflet中dom模块DomEvent.DoubleTap的实现原理
  • STM32标准库之I2C示例代码
  • mac系统conda的python环境下安装uWSGI报缺少libpython3.9.a问题解决方法
  • Linux:gsd-account进程异常内存泄漏排查
  • 一个免费 好用的pdf在线处理工具
  • 融创中国:境外债务重组计划聆讯定于9月15日召开
  • 京东美团饿了么等外卖平台被约谈
  • 外交部亚洲司司长刘劲松会见印度驻华大使罗国栋
  • 明查|印度空军“又有一架战机被巴基斯坦击落,飞行员被俘”?
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营
  • 2025年上海好护士揭晓,上海护士五年增近两成达12.31万人