欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

实战打造你的京东商城——HTML、CSS和JS项目学习指南

最编程 2024-08-05 20:32:56
...

一言君不定时上线

> > 顺气自然,戒焦戒燥

一、京东商城的项目实践

  • 项目来源

www.bilibili.com/list/watchl…

  • 项目流程

1、项目创建

架构好项目的结构,创建文件目录,分别是css+js+images+index.html;

2、引入css、js

在index.html文件里分别引入css、js,使用link标签;

3、获取icon

获取京东商城官网的icon图标,引入方法www.jd.com/favicon.ico 图片另存为;

4、写好注释

分析网页布局,分模块写代码,先写好必要的注释

例如,
<!-- 头部开始 -->
代码
<!-- 头部结束 -->
5、logo背景图

在设置logo背景图片时出现问题,块级元素的背景图片无法显示的原因是,图片路径是绝对路径时无效,相对路径成功,代码如下:

a {
    display: block;
    width: 100%;
    height: 100%;/* 容器大小为父元素大小 */
    background-image: url("../images/80afe4b365931a5d.jpg");
    background-size: cover;/*设置背景图铺满容器*/
    /*background是简写属性,属性值可以按需写入并任意顺序放置*/
}
6、搜索框

logo设置好了之后,就是搜索框,搜索框又由两部分组成,表单和搜索按钮;

border: none;/*或者border:0px;去掉表单边框*/
outline:none;/*去掉点击表单后的边框*/
border: 0px;/*去掉按钮边框*/

list-style:none;/*去掉列表旁圆点*/
text-decoration: none;/*去掉a标签下划线*/
7、搜索图标

引入搜索图标,图标来源:www.iconfont.cn/ 选中图标,加入购物车,下载代码,解压至项目css文件夹;然后使用,使用方法略

8、模糊查询
//实现模糊查询
let keyword = document.querySelector('.keyword');
let search_helper = document.querySelector('.search_helper');

//定义数组,存储搜索的内容
let searchArr = ['小米手机', '华为手机', '苹果手机', '小米电视', '小米平板', '苹果12', '苹果手表', '苹果13'];

//给输入框绑定内容改变事件
keyword.addEventListener('input', function () {
  search_helper.innerHTML = '';
  for (let i = 0; i < searchArr.length; i++) {

      //这里的判断就是查找数组元素是否有指定的用户输入的内容
      if (searchArr[i].indexOf(keyword.value) != -1) {
          search_helper.innerHTML += '<p>' + searchArr[i] + '</p>';
          search_helper.style.display = 'block';
      }
  }
})
//失去光标,搜索匹配到的内容消失
keyword.addEventListener('blur', function () {
  search_helper.style.display = 'none';
})
9、轮播图
//实现轮播图的切换
let img = document.querySelector('.img');
let prev = document.querySelector('.prev');
let next = document.querySelector('.next');
let slide = document.querySelector('.slide');
let lis = document.querySelectorAll('.banner_btn li');



let imgArr = ['1.webp', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg'];

let count = 0;

//定义函数,切换图片的路径
function cutImg() {
  img.src = './images/' + imgArr[count];
  //将其他小圆点active样式全部去掉
  for (let i = 0; i < lis.length; i++) {
      lis[i].className = 'active';
  }
  //唯独被点击的小圆点亮起
  lis[count].className = 'active';
}
//设置定时器,每隔3秒自动切换图片
let timer = setInterval(function () {
  count++;
  if (count > imgArr.length - 1) {
      count = 0;
  }
  cutImg();
}, 4000)
//点击上一张切换图片
prev.addEventListener('click', function () {
  count--;
  if (count < 0) {
      count = imgArr.length - 1;
  }
  cutImg();
})
//点击下一张切换图片
next.addEventListener('click', function () {
  console.log(1111);
  count++;
  if (count > imgArr.length - 1) {
      count = 0;
  }
  cutImg();
})
//当鼠标放在图片,图片不切换
slide.addEventListener('mouseover', function () {
  clearInterval(timer);
})
//鼠标滑出图片,定时器重新跑,重新赋值
slide.addEventListener('mouseout', function () {
  timer = setInterval(function () {
      count++;
      if (count > imgArr.length - 1) {
          count = 0;
      }
      cutImg();
  }, 2000)
})
//给li绑定点击事件,点击li小圆点,跳转图片
for (let i = 0; i < lis.length; i++) {
  lis[i].addEventListener('click', function () {
      count = i;
      cutImg();
  })
}
10、楼层定位切换(页面小电梯)
//楼层定位切换
let header = document.querySelector('.header');
let banner = document.querySelector('.banner');
let elevator = document.querySelector('.elevator');
let items = document.querySelectorAll('.item');
let elevatorA = document.querySelectorAll('.elevator a');

//获取header的高度
let headerHeight = header.offsetHeight;
let bannerHeight = banner.offsetHeight;

//一个数组,放每个板块对应的截止高度
let elevatorArr = [];

//基础的高度,头部加上版心的高度
let base = headerHeight + bannerHeight;
for (let i = 0; i < items.length; i++) {
    base = base + items[i].offsetHeight + 30;
    elevatorArr.push(base);
}

function clearColor() {
    for (let i = 0; i < elevatorA.length; i++) {
        elevatorA[i].style.color = '';
    }
}

document.addEventListener('scroll', function () {
    //获取滚动条垂直方向滚了多少距离
    let top = document.documentElement.scrollTop || document.body.scrollTop;

    //当滚动距离大于头部和版心高度之和,将楼层的定位改为固定定位
    if (top > headerHeight + bannerHeight) {
        elevator.className = 'elevator elevator-fix';
    } else {
        elevator.className = 'elevator';
    }

    //实现楼层滚动,文字变色的效果
    if (top < headerHeight + bannerHeight) {
        clearColor();
    } else if (top >= headerHeight + bannerHeight && top < elevatorArr[0]) {
        clearColor();
        elevatorA[0].style.color = 'red';
    } else if (top >= elevatorArr[0] && top < elevatorArr[1]) {
        clearColor();
        elevatorA[1].style.color = 'red';
    } else if (top >= elevatorArr[1] && top < elevatorArr[2]) {
        clearColor();
        elevatorA[2].style.color = 'red';
    } else if (top >= elevatorArr[2]) {
        clearColor();
        elevatorA[3].style.color = 'red';
    }
})
11、头部吸顶效果
//当滚动距离大于头部和版心高度之和,将楼层的定位改为固定定位
    if (top > headerHeight + bannerHeight) {
        elevator.className = 'elevator elevator-fix';
        search.className = 'search  search-fix';
        searchM.style.height = '50px';
        form.style.top = '8px';
        search_logo.style.display = 'block';
    } else {
        elevator.className = 'elevator';
        search.className = 'search';
        searchM.style.height = '60px';
        form.style.top = '25px';
        search_logo.style.display = 'none';
    }
12、商品详情页布局

新增detail.html+detail.css+detail.js

13、实现详情页左边板块的前进和后退小图片效果
//实现上一张下一张小图片的切换
let prev = document.querySelector('.prev');
let next = document.querySelector('.next');
let ul = document.querySelector('.spec-items ul');

prev.addEventListener('click', function () {
    ul.style.left = '0';
    //说明一下图片路径,不能从这个js文件去找图片路径
    //而是应该从html文件出发找路径,因为最终背景图片的样式是应用到html
    prev.style.background = 'url(./images/disabled-prev.png)';
})

next.addEventListener('click', function () {
    ul.style.left = '-116px';
})
14、实现详情页左边板块的点击小图显示对应中图效果
//实现显示中图的效果
for (let i = 0; i < lis.length; i++) {
    lis[i].addEventListener('click', function () {
        for (let j = 0; j < lis.length; j++) {
            lis[j].className = '';
        }
        lis[i].className = 'img-hover';
        img.src = lis[i].children[0].src; //获取li里面的img的路径
        // img.src = imgs[i].src; //或者用这种方法

    })
}
15、实现图片放大镜效果
//实现放大镜
mainImg.addEventListener('mouseover', function () {
    zoomPup.style.display = 'block';
    zoomDiv.style.display = 'block';
})

mainImg.addEventListener('mouseleave', function () {
    zoomPup.style.display = 'none';
    zoomDiv.style.display = 'none';
})

mainImg.addEventListener('mousemove', function (e) {
    //获取鼠标距离文档顶部的距离
    let pageY = e.pageY;
    //获取鼠标距离文档左侧的距离
    let pageX = e.pageX;
    //获取中图距离文档顶部的距离
    let offsetTop = mainImg.offsetTop;
    //获取中图距离文档左侧的距离
    let offsetLeft = mainImg.offsetLeft;
    //获取放大镜(粉块)的高度的一半
    let h = zoomPup.clientHeight / 2;
    //获取放大镜(粉块)的宽度的一半
    let w = zoomPup.clientWidth / 2;
    //因为鼠标移动的时候,粉色方块也是跟着移动的,所以,鼠标指针处于块中心
    let top = pageY - offsetTop - h;
    let left = pageX - offsetLeft - w;

    if (top <= 0) {
        top = 0;
    } else if (mainImg.clientHeight - zoomPup.clientHeight) {
        top = mainImg.clientHeight - zoomPup.clientHeight;
    }

    if (left <= 0) {
        left = 0;
    } else if (left > mainImg.clientWidth - zoomPup.clientWidth) {
        left = mainImg.clientWidth - zoomPup.clientWidth;
    }

    zoomPup.style.top = top + 'px';
    zoomPup.style.left = left + 'px';

    //一个等比例公式,top/图片盒子高-粉色方块高=大图往上移出去的距离/大图原高-大图显示的图高
    let y = top / (mainImg.clientHeight - zoomPup.clientHeight);
    bigImg.style.top = -(y * (800 - 540)) + 'px';
    //水平方向的放大
    let x = left / (mainImg.clientWidth - zoomPup.clientWidth)
    bigImg.style.left = -(x * (800 - 540)) + 'px';
16、实现购物车数字计算效果
//实现购物车数字计算
reduce.addEventListener('click', function () {
    buyNum.value--;
    if (buyNum.value <= 1) {
        buyNum.value = 1;
        reduce.className = 'reduce disabled';
    }
})

add.addEventListener('click', function () {
    buyNum.value++;
    if (buyNum.value > 1) {
        reduce.classList.remove('disabled');
    }
})
17、我的源码链接
https://gitee.com/selling-the-earth/myItems.git
18、练后感
听懂比实现更重要,最好还是先听了,然后尝试自己写;
简单来说就是,带脑子,不盲目抄代码。认真的话其实可以一天完成,不过这个是在有一定基础下。
总之,不要畏惧去开始一件事。

二、查漏补缺

1、重温一下五种定位(position值)

① static 默认 静态 正常文档流

② relative 相对 不脱离文档流 只改变自身位置

③ absolute 绝对 相对于最近仅为的父元素 脱离文档流

④ fixed 固定 相对于浏览器窗口 脱离文档流

2、关于项目中用到的几个简写属性

  1. background

  2. box-shadow

  3. transition

  4. boder-radius

  5. animation

  6. client系列属性

  7. scroll系列属性

  8. offset系列属性

3、一些注意小点

1、写样式的时候,要小心选择器优先级问题,以及必要的时候使用z-index

2、写文档笔记的时候,目录结构很重要,最好简明清晰

3、写类名的时候可以使用-连接,写dom元素名的时候可以驼峰