学习记录-css&js-综合复习案例(一)

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

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

商城单个商品页实现步骤

1.数据准备

项目包的结构
1. assets中images中放logo和二维码之类固定内容的图片,upholds中放可以替换的商品类图片
2. html,css,js,less中放各个板块的对应文件
在这里插入图片描述
2.渲染的数据

	const initData = [
  {
    id: 1,
    name: '绿色吊带裙',
    price: 199,
    discount: '100',
    src: '../assets/upholds/otherContent1.png',
    status: '特价'
  },
  {
    id: 2,
    name: '黑色吊带裙',
    price: 299,
    discount: '',
    src: '../assets/upholds/otherContent2.png',
    status: ''
  },
  {
    id: 3,
    name: '红色吊带裙',
    price: 199,
    discount: '',
    src: '../assets/upholds/otherContent3.png',
    status: ''
  },
  {
    id: 4,
    name: '粉色吊带裙',
    price: 299,
    discount: '190',
    src: '../assets/upholds/otherContent4.png',
    status: '特价'
  },
  {
    id: 5,
    name: '白色吊带裙',
    price: 199,
    discount: '',
    src: '../assets/upholds/otherContent4.png',
    status: ''
  },
  {
    id: 6,
    name: '蓝色吊带裙',
    price: 299,
    discount: '',
    src: '../assets/upholds/otherContent4.png',
    status: '售完'
  },
  {
    id: 7,
    name: '黄色吊带裙',
    price: 199,
    discount: '99',
    src: '../assets/upholds/otherContent3.png',
    status: '特价'
  },
  {
    id: 8,
    name: '紫色吊带裙',
    price: 299,
    discount: '',
    src: '../assets/upholds/otherContent4.png',
    status: '售完'
  },
  {
    id: 9,
    name: '棕色吊带裙',
    price: 199,
    discount: '100',
    src: '../assets/upholds/otherContent3.png',
    status: '特价'
  },
  {
    id: 10,
    name: '灰色吊带裙',
    price: 299,
    discount: '',
    src: '../assets/upholds/otherContent1.png',
    status: '售完'
  },
  {
    id: 11,
    name: '银色吊带裙',
    price: 199,
    discount: '',
    src: '../assets/upholds/otherContent1.png',
    status: ''
  },
  {
    id: 12,
    name: '黑色吊带裙',
    price: 299,
    discount: '',
    src: '../assets/upholds/otherContent2.png',
    status: '售完'
  }
]

2. 搭建html框架

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

代码
1. logo制作要用logo>a,a中写logo名称,a设置为块元素,且文字大小为0
2. 页面中的版心居中可以用bootstrap中container类名,栅格化可以用row,配合col类名
3. 可以将通用组件样式封装在common.css中可以减少代码量

		<!-- 导航栏 -->
  <div class="nav container">
    <div class="logo">
      <a href="">优质商城</a>
    </div>
    <ul>
      <li><a data-id="0" href="javascript:;" class="active">首页</a></li>
      <li><a data-id="1" href="javascript:;">女装</a></li>
      <li><a data-id="2" href="javascript:;">男装</a></li>
      <li><a data-id="3" href="javascript:;">箱包</a></li>
      <li><a data-id="4" href="javascript:;">特价</a></li>
    </ul>
    <div class="shopping">
      <span class="iconfont icon-shopping-bag-3-fill"></span>
      <div class="shopNum">
        <span>1</span>
      </div>
    </div>
  </div>
  <!-- 服装内容 -->
  <div class="costume-content container">
    <div class="left slider col-xl-6 col-lg-12 col-sm-12 col-12">
      <div class="jdk">

      </div>
      <img src="../assets/upholds/content0.png" alt="">
      <ul>
        <li><a data-id="0" href="javascript:;" class="active"></a></li>
        <li><a data-id="1" href="javascript:;"></a></li>
        <li><a data-id="2" href="javascript:;"></a></li>
      </ul>
    </div>
    <div class="right col-xl-6 col-lg-12 col-sm-12 col-12">
      <div class="largePic">
        <div class="pic">

        </div>
      </div>
      <div class="tag">碎花系列</div>
      <h3>2018夏季青春红色吊带裙</h3>
      <p>2018上新的夏季青春少女酒红碎花系列红色吊带裙,由英国时尚潮人服装大师大卫精心设计制作,纯手工制作,匠心打造!</p>
      <ul>
        <li><span class="price">价格:¥<strong>1999</strong></span></li>
        <li>
          <select name="" id="">
            <option value="">数量</option>
            <option value="">1</option>
            <option value="">2</option>
            <option value="">3</option>
          </select>
        </li>
        <li>
          <select name="" id="">
            <option value="">大小</option>
            <option value="">s</option>
            <option value="">m</option>
            <option value="">xl</option>
            <option value="">xxl</option>
            <option value="">定制</option>
          </select>
        </li>
        <li>
          <select name="" id="">
            <option value="">颜色</option>
            <option value="">红色</option>
            <option value="">蓝色</option>
            <option value="">绿色</option>
          </select>
        </li>
        <li>
          <button class="buy">立即购买</button><button class="addShopCart">加入购物车</button>
        </li>
      </ul>
    </div>

    <!-- 其他服饰 -->
    <div class="other-content">
      <h3>您也可能喜欢</h3>
      <div class="other-costume">
        <ul class="row">
          <li class="col-xl-3 col-md-6 col-sm-6 col-12">
            <div class="staus out"><span>售完</span></div>
            <img src="../assets/upholds/otherContent1.png" alt="">
            <div class="name">连衣裙</div>
            <h3>绿色吊带裙</h3>
            <!-- 如果有打折,价钱出现中划线 -->
            <div class="price"><span class="normal">390.00</span> <span class="discount">200</span> </div>
          </li>
          <li class="col-xl-3 col-md-6 col-sm-6 col-12">
            <div class="staus out"><span>售完</span></div>
            <img src="../assets/upholds/otherContent2.png" alt="">
            <div class="name">连衣裙</div>
            <h3>蓝色性感裙子</h3>
            <div class="price"><span class="normal">390.00</span> <span class="discount"></span></div>
          </li>
          <li class="col-xl-3 col-md-6 col-sm-6 col-12">
            <div class="staus free"><span>特价</span></div>
            <img src="../assets/upholds/otherContent3.png" alt="">
            <div class="name">连衣裙</div>
            <h3>弹力羊毛连衣裙</h3>
            <div class="price"><span class="normal">390.00</span> <span class="discount"></span></div>
          </li>
          <li class="col-xl-3 col-md-6 col-sm-6 col-12">
            <div class="staus out"><span>售完</span></div>
            <img src="../assets/upholds/otherContent4.png" alt="">
            <div class="name">连衣裙</div>
            <h3>紫色吊带裙</h3>
            <div class="price"><span class="normal">390.00</span> <span class="discount">200</span></div>
          </li>
        </ul>
      </div>
    </div>
  </div>
  <!-- 底部 -->
  <div class="footer container">
    <ul class="row">
      <li class="col-xl-3 col-lg-3 col-md-6 col-sm-6 col-12">
        <p class="copy">© 2018 Copyright fengcolor.com
          All Rights Reserved.</p>
        <p class="tel">020-8525866 info@fengcolor.com</p>
        <p class="address">中国
          广州市白云区丰彩服装定制工作室
          510000</p>
      </li>
      <li class="col-xl-3 col-lg-3 col-md-6 col-sm-6 col-12">
        <dl>
          <dd><a href="">男性专区</a></dd>
          <dd><a href="">女性专区</a></dd>
          <dd><a href="">箱包专区</a></dd>
          <dd><a href="">鞋子专区</a></dd>
          <dd><a href="">特价专区</a></dd>
        </dl>
      </li>
      <li class="col-xl-3 col-lg-3 col-md-6 col-sm-6 col-12">
        <dl>
          <dd><a href="">关于我们</a></dd>
          <dd><a href="">运费说明</a></dd>
          <dd><a href="">常见问题</a></dd>
          <dd><a href="">联系我们</a></dd>
          <dd><a href="">售后服务</a></dd>
        </dl>
      </li>
      <li class="col-xl-3 col-lg-3 col-md-6 col-sm-6 col-12"><img src="../assets/images/code.png" alt=""></li>
    </ul>

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

3. 编写js代码

tab栏
事件委托自定义属性

	const nav = document.querySelector('.nav')
	nav.addEventListener('click', function (e) {
	  if (e.target.tagName === 'A') {
	    document.querySelector('.nav .active').classList.remove('active')
	    e.target.classList.add('active')
	  }
	})

实现效果
在这里插入图片描述
轮播图
数据获取,事件委托自定义属性

		const detail = JSON.parse(localStorage.getItem('detail'))
	console.log(detail)
	const signal = document.querySelector('.tag')
	signal.nextElementSibling.innerHTML = detail.name
	const signalPrice = document.querySelector('.right .price')
	console.log(signalPrice)
	signalPrice.children[0].innerHTML = detail.price
	const img = document.querySelector('.slider img')
	const sliderLis = document.querySelectorAll('.slider li')
	let sliderTimer
	let num = 0
	function play() {
	  sliderTimer = setInterval(() => {
	    num++
	    if (num >= 3) {
	      num = 0
	    }
	    img.src = `../assets/upholds/content${num}.png`
	    for (let i = 0; i < sliderLis.length; i++) {
	      sliderLis[i].children[0].classList.remove('active')
	    }
	    sliderLis[num].children[0].classList.add('active')
	  }, 2000)
	}
	play()
	const slider = document.querySelector('.slider')
	slider.addEventListener('mouseenter', () => {
	  clearInterval(sliderTimer)
	})
	slider.addEventListener('mouseleave', () => {
	  play()
	})
	slider.addEventListener('mouseover', (e) => {
	  if (e.target.tagName === 'A') {
	    document.querySelector('.slider .active').classList.remove('active')
	    for (let i = 0; i < sliderLis.length; i++) {
	      sliderLis[e.target.dataset.id].children[0].classList.add('active')
	      img.src = `../assets/upholds/content${e.target.dataset.id}.png`
	    }
	  }
	})

实现效果
在这里插入图片描述
商品放大镜
商品放大镜算法,原理见我的主页内容

		const jdk = document.querySelector('.left .jdk')
	const left = document.querySelector('.left')
	const largePic = document.querySelector('.right .largePic')
	const pic = document.querySelector('.largePic .pic')
	let fdjTimer = 1
	function out() {
	  clearInterval(fdjTimer)
	  largePic.style.display = 'block'
	  jdk.style.display = 'block'
	}
	function none() {
	  fdjTimer = setTimeout(() => {
	    largePic.style.display = 'none'
	  }, 200)
	  jdk.style.display = 'none'
	}
	const i = document.documentElement
	console.log(i.scrollTop)
	left.addEventListener('mouseenter', out)
	left.addEventListener('mouseleave', none)
	largePic.addEventListener('mouseenter', out)
	largePic.addEventListener('mouseleave', none)
	left.addEventListener('mousemove', (e) => {
	  const img = document.querySelector('.left img')
	  pic.style.backgroundImage = `url(${img.src})`
	  const mouseX = e.pageX - left.getBoundingClientRect().left
	  const mouseY = e.pageY - left.getBoundingClientRect().top
	  let jdkX = mouseX - jdk.offsetWidth / 2
	  let jdkY = mouseY - jdk.offsetHeight / 2
	  jdk.style.left = `${jdkX}px`
	  jdk.style.top = `${jdkY}px`
	  if (jdkX < 0) {
	    jdkX = 0
	    jdk.style.left = jdkX
	  }
	  if (jdkY < 0) {
	    jdkY = 0
	    jdk.style.top = jdkY
	  }
	  if (jdkX > left.offsetWidth - jdk.offsetWidth) {
	    jdkX = left.offsetWidth - jdk.offsetWidth
	    console.log(jdkX)
	    jdk.style.left = `${jdkX}px`
	  }
	  if (jdkY > left.offsetHeight - jdk.offsetHeight) {
	    jdkY = left.offsetHeight - jdk.offsetHeight
	    console.log(jdkY)
	    jdk.style.top = `${jdkY}px`
	  }
	  // 所占比例
	  bili = 320 / left.offsetWidth
	  pic.style.backgroundPosition = `-${jdkX * bili}px -${jdkY * 2}px`
	})

实现效果
在这里插入图片描述
随机商品渲染
定义随机数,从数据中抽取4个随机数据,并进行渲染

	const ul = document.querySelector('.other-costume .row')
	function addData(arr) {
	  let str = ''
	  arr.filter(({ name, price, discount, src, status }) => {
	    let soldStatus
	    if (status === '售完') {
	      soldStatus = 'out'
	    } else if (status === '特价') {
	      soldStatus = 'free'
	    } else {
	      soldStatus = ''
	    }
	    const arr = `<li class="col-xl-3 col-md-6 col-sm-6 col-12">
	            <div class="staus ${soldStatus}"><span>${status}</span></div>
	            <img src="${src}" alt="">
	            <div class="name">连衣裙</div>
	            <h3>${name}</h3>
	            <!-- 如果有打折,价钱出现中划线 -->
	            <div class="price"><span class="normal">${price}</span> <span class="discount">${discount}</span> </div>
	          </li>`
	    return str += arr
	  })
	  ul.innerHTML = str
	}
	const randomArr = []
	for (let i = 0; i < 4; i++) {
	  const random = Math.floor(Math.random() * initData.length)
	  randomArr.push(initData[random])
	}
	addData(randomArr)

实现效果
在这里插入图片描述
点击进入单个商品
进入单个商品后记录其图片,名称,价钱等数据,再进行动态渲染

const lis = document.querySelectorAll('.other-costume li')
lis.forEach(li => {
  li.addEventListener('click', () => {
    const img = li.querySelector('img')
    const src = img.getAttribute('src')
    const name = li.querySelector('h3').textContent
    const price = li.querySelector('.price .normal').textContent
    const discount = li.querySelector('.price .discount').textContent
    const status = li.querySelector('.staus span').textContent
    const detail = {
      src,
      name,
      price,
      discount,
      status
    }
    localStorage.setItem('detail', JSON.stringify(detail))
    location.href = '../html/signalCostume.html'
  })
})

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

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值