[html+css+js] 小米官网首页制作

2023-11-09

实现效果:

0ee9cae4432343b5adc6fcd00006a439.gif

源码及图片素材地址:https://gitee.com/jie_shao1112/xiaomihttps://gitee.com/jie_shao1112/xiaomi

 这里进行一些说明:

在index.html里引入了三个css文件,第一个css文件reset.css是初始化样式表,第二个css文件引入的bootstrap3的css文件,因为用字体图标方便,最后一个css文件就是我们的项目样式文件watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2w5a2m5YmN56uv,size_20,color_FFFFFF,t_70,g_se,x_16

有两个js文件,animate是缓动动画方法,主要用于轮播图的制作

 0ea99b91770b46449d8faca7b6414e71.png

在这个下拉菜单的动画的制作里怎么实现的隐藏呢?

我们不能通过display:none,因为这样的话添加不了过渡效果

我们可以让这个下拉菜单的高度为0,然后再加一个溢出隐藏实现。

 4cb9764a009448a49e6701015d49895d.gif

 在index.js中轮播图的左右按钮的监听事件里,有一个flag,它起的就是节流阀的作用,说白了就是防止点击按钮频率太快,导致图片动画没加载完就跑飞了:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2w5a2m5YmN56uv,size_20,color_FFFFFF,t_70,g_se,x_16

 这里的轮播图是简化版本,没有加底下的小圆点,且不能动态生成,下面附上原生js轮播图的高配版本(带有注释),感兴趣的同学可以自行修改:

window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    var focusWidth = focus.offsetWidth;
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
        clearInterval(timer);
        timer = null; // 清除定时器变量
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
        timer = setInterval(function() {
            //手动调用点击事件
            arrow_r.click();
        }, 2000);
    });
    // 3. 动态生成小圆圈  有几张图片,我就生成几个小圆圈
    var ul = focus.querySelector('ul');
    var ol = focus.querySelector('.circle');
    // console.log(ul.children.length);
    for (var i = 0; i < ul.children.length; i++) {
        // 创建一个小li 
        var li = document.createElement('li');
        // 记录当前小圆圈的索引号 通过自定义属性来做 
        li.setAttribute('index', i);
        // 把小li插入到ol 里面
        ol.appendChild(li);
        // 4. 小圆圈的排他思想 我们可以直接在生成小圆圈的同时直接绑定点击事件
        li.addEventListener('click', function() {
            // 干掉所有人 把所有的小li 清除 current 类名
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己  当前的小li 设置current 类名
            this.className = 'current';
            // 5. 点击小圆圈,移动图片 当然移动的是 ul 
            // ul 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是负值
            // 当我们点击了某个小li 就拿到当前小li 的索引号
            var index = this.getAttribute('index');
            // 当我们点击了某个小li 就要把这个li 的索引号给 num  
            num = index;
            // 当我们点击了某个小li 就要把这个li 的索引号给 circle  
            circle = index;
            // num = circle = index;
            console.log(focusWidth);
            console.log(index);

            animate(ul, -index * focusWidth);
        })
    }
    // 把ol里面的第一个小li设置类名为 current
    ol.children[0].className = 'current';
    // 6. 克隆第一张图片(li)放到ul 最后面
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first);
    // 7. 点击右侧按钮, 图片滚动一张
    var num = 0;
    // circle 控制小圆圈的播放
    var circle = 0;
    // flag 节流阀
    var flag = true;
    arrow_r.addEventListener('click', function() {
        if (flag) {
            flag = false; // 关闭节流阀
            // 如果走到了最后复制的一张图片,此时 我们的ul 要快速复原 left 改为 0
            if (num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            num++;
            animate(ul, -num * focusWidth, function() {
                flag = true; // 打开节流阀
            });
            // 8. 点击右侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放
            circle++;
            // 如果circle == 4 说明走到最后我们克隆的这张图片了 我们就复原
            if (circle == ol.children.length) {
                circle = 0;
            }
            // 调用函数
            circleChange();
        }
    });

    // 9. 左侧按钮做法
    arrow_l.addEventListener('click', function() {
        if (flag) {
            flag = false;
            if (num == 0) {
                num = ul.children.length - 1;
                ul.style.left = -num * focusWidth + 'px';

            }
            num--;
            animate(ul, -num * focusWidth, function() {
                flag = true;
            });
            // 点击左侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放
            circle--;
            // 如果circle < 0  说明第一张图片,则小圆圈要改为第4个小圆圈(3)
            // if (circle < 0) {
            //     circle = ol.children.length - 1;
            // }
            circle = circle < 0 ? ol.children.length - 1 : circle;
            // 调用函数
            circleChange();
        }
    });

    function circleChange() {
        // 先清除其余小圆圈的current类名
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        // 留下当前的小圆圈的current类名
        ol.children[circle].className = 'current';
    }
    // 10. 自动播放轮播图
    var timer = setInterval(function() {
        //手动调用点击事件
        arrow_r.click();
    }, 2000);

})

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[html+css+js] 小米官网首页制作 的相关文章

随机推荐

  • mysql查询两列的总和,null值处理

    mysql中需要用sum 函数计算两列或者多列的总和时 可参考以下写法 select SUM IFNULL c1 0 IFNULL c2 0 from tb mytable sum c1 c2 c3 函数是计算多列的总和 ifnull c1
  • Java项目-博客管理系统介绍

    目录 一 项目背景 二 相关技术准备 1 网络通信三要素 2 Jsp简介 3 Servlet简介 4 Tomcat服务器 三 系统需求分析 1 易用性分析 2 安全性分析 四 数据库设计和实现 1 创建数据库和相关表 2 使用JDBC连接数
  • Eclipse中Debug时,设置条件断点,运行额外代码

    目录 1 设置条件断点 2 运行额外代码 1 设置条件断点 右键断点位置 选择 Breakpoint Properties 设置条件 设置后的效果 当然 也可以直接在这里进行设置 2 运行额外代码 debug时 在Debug Shell中写
  • Java Web开发技术体系

    Course Java web 开发技术 Author 涛哥B站视频资料 千锋教育 Java Web开发视频教程 一 Java web是什么 1 1 Java web概念 Java web指的是使用Java语言进行web互联网领域项目开发的
  • 现在人工智能在教育方面的应用

    现代教育中 利用人工智能可以实现师资资源重新分配 传统教育模式中 存在严重的师资力量分配不均匀的问题 也导致了教育的不均衡 不平等 格物斯坦表示人工智能在教育方面的用途非常广泛 具体要求要因地制宜 才能发挥最大效果 当投入了人工智能教育以后
  • USB转串口CH340接线方法

    https blog csdn net wangjiaweiwei article details 49612207 USB转串口模块可以使用5V电压供电 需要将跳帽按下图安装 USB转串口模块可以使用3 3V电压供电 需要将跳帽按下图安装
  • Vue概念

    Vue 是一套用于构建用户界面的渐进式框架 自底层向上应用 Vue的核心库只关注视图层 容易入门 可以和第三方库或者已有的项目进行整合 可以做复杂的单页应用 同时与React Angular称三大主流框架 中文官网 v2 cn vuejs
  • C语言交换 a与b 的值的 3种方法

    第一种方法 给定两个整形变量的值 创建两个临时变量将两个值的内容进行交换 int a 2 int b 3 int c 0 printf 原来的 na d b d n a b c a a b b c printf 现在的 na d b d a
  • Unity中如何用代码实现场景切换

    Unity中如何用代码实现场景切换 创建场景 场景切换 Unity3D创建游戏可以这么理解 一款完整的游戏就是一个Project 项目工程 游戏中不同的地图对应的是项目下面的不同场景 Scene 一款游戏可以包含很多地图 因此一个项目工程下
  • 浏览器及手机版本型号判断

    Navigator 对象 包含有关浏览器的信息 所有浏览器都支持该对象 对象属性参考 https www w3school com cn jsref dom obj navigator asp 属性 描述 appCodeName 返回浏览器
  • 【一些用得到的概念】

    C语言的四种变量类型 C C 四种变量类型 变量声明 包括const变量能被其他文件使用的操作 关于变量声明 多文件的例子 Linux下使用生成 so并调用 关于 so调用出现错误的解释
  • 老卫带你学---华为机试(7.取近似值)

    华为机试 7 取近似值 问题 题目描述 写出一个程序 接受一个正浮点数值 输出该数值的近似整数值 如果小数点后数值大于等于5 向上取整 小于5 则向下取整 输入描述 输入一个正浮点数值 输出描述 输出该数值的近似整数值 示例1 输入 5 5
  • typora的基本使用技巧汇总

    原文链接 https www jianshu com p 380005c8f104 Typora是一款所见即所得的Markdown文本编辑工具 在你输入相应的标记符号后 系统会自动对所标记的文本进行渲染 设置成相应的格式 因此 写作过程与渲
  • matlab由频率响应计算差分方程,现代线性系统:使用MATLAB

    中译本出版者的话 译者的话 出版者的话 符号一览表 全书内容简介 前 言 第1章 信号与序列 概述 基本概念与解说题 信号 序列和系统 IP1 1 描述连续时间信号 IP1 2 序列表述 连续和离散信号之间的转换 采样定理 本书梗概 兼学习
  • PyTorch深度学习实战(6)——神经网络性能优化技术

    PyTorch深度学习实战 6 神经网络性能优化技术 0 前言 1 数据准备 1 1 数据集分析 1 2 数据集加载 2 使用 PyTorch 训练神经网络 2 1 神经网络训练流程 2 2 PyTorch 神经网络训练 3 缩放数据集 4
  • 可以白嫖的语音识别开源项目whisper的搭建详细过程

    原文来自我个人的博客 1 前提条件 服务器为GPU服务器 点击这里跳转到我使用的GPU服务器 我搭建 whisper 选用的是 NVIDIA A 100显卡 4GB显存 Python版本要在3 8 3 11之间 输入下面命令查看使用的Pyt
  • origin图上显示数据标签_origin中如何在图中添加标签

    展开全部 方法步骤如下 1 首先打开计算机 在计算机内进入origin 在里面新建一个三维表面图与标注数据点的初始数据 62616964757a686964616fe58685e5aeb931333431353866 2 选中所有数据 执行
  • element ui el-date-picker 组件默认值

    element ui el date picker 组件默认当前月份 1 html 代码
  • 已解决(Python爬虫requests库报错 请求异常SSL错误,证书认证失败问题)requests.exceptions.SSLError: HTTPSConnectionPool

    成功解决 Python爬虫requests库报错 请求异常 SSL错误 证书认证失败问题 requests exceptions SSLError HTTPSConnectionPool host httpbin org port 443
  • [html+css+js] 小米官网首页制作

    实现效果 源码及图片素材地址 https gitee com jie shao1112 xiaomihttps gitee com jie shao1112 xiaomi 这里进行一些说明 在index html里引入了三个css文件 第一