用原生JS实现爱奇艺首页导航栏代码实例


Posted in Javascript onSeptember 19, 2019

最近接到领导的任务,要给外面的学生上几节前端课,备课的时候准备了一些小项目,在此记录一下。

以下是爱奇艺首页的一个导航栏,用原生js写的,静态页面效果如下:

代码如下:

<html>
<head>
  <title>爱奇艺</title>
  <meta charset="utf-8">
  <style type="text/css">
    * {
      padding: 0;
      margin: 0;
    }
    .wrap {
      height: 520px;
      background-color: #000;
      width: 100%;
    }
    .wrap .img-wrap {
      height: 100%;
      margin: 0 auto;
      background-image: url('1.jpg');
      background-repeat: no-repeat;
      background-position: 50% 50%;
      background-size: auto 100%;
      position: relative;
    }
    /* 媒体查询 */
    @media screen and (max-width: 2000px) {
      .wrap .img-wrap .item-list {
        right: 10%;
      }
    }
    @media screen and (max-width: 1600px) {
      .wrap .img-wrap .item-list {
        right: 8%;
      }
    }
    @media screen and (max-width: 1300px) {
      .wrap .img-wrap .item-list {
        right: 5%;
      }
    }
    .wrap .img-wrap .item-list {
      box-sizing: border-box;
      height: 100%;
      background-color: rgba(0,0,0,0.7);
      width: 280px;
      position: absolute;
      
      list-style: none;
      padding: 10px 0;
    }
    .wrap .img-wrap .item-list li {
      padding: 0 15px;
    }
    .wrap .img-wrap .item-list li.active {
      /*background-color: -webkit-linear-gradient(left, rgba(0,0,0,.3), rgba(0,0,0,0.1));*/
      background: linear-gradient(to right, rgba(0,0,0,.5), rgba(0,0,0,0));
      cursor: pointer;
    }
    .wrap .img-wrap .item-list li span {
      line-height: 40px;
      color: #eee;
      font-size: 16px;
    }
    .wrap .img-wrap .item-list li.active span {
      color: #00be06;
      display: block;
    }
    .wrap .img-wrap .item-list li.active span:nth-child(1) {
      font-size: 24px;
      transition: font-size 0.2s;
    }
    .wrap .img-wrap .item-list li.active span:nth-child(2) {
      display: none;
    }
  </style>
</head>
<body>
  <div class="wrap">
    <div class="img-wrap">
      <ul class="item-list">
      </ul>
    </div>
  </div>
  <script type="text/javascript">
    let items = [
        {
          title: '遇见幸福',
          desc: '24点体会人生百味',
          url: '1.jpg'
        },
        {
          title: '中国达人秀',
          desc: '真假岳岳在线劈叉',
          url: '2.jpg'
        },
        {
          title: '中国新说唱',
          desc: '全国4强诞生!',
          url: '3.jpg'
        },
        {
          title: '做家务',
          desc: '魏大勋花钱做音乐',
          url: '4.jpg'
        },
        {
          title: '扫毒2',
          desc: '刘德华硬战古天乐',
          url: '5.jpg'
        },
        {
          title: '加油',
          desc: '郝泽宁隔屏告白福子',
          url: '6.jpg'
        },
        {
          title: '小欢喜',
          desc: '宋倩乔卫东重归于好',
          url: '7.jpg'
        },
        {
          title: '谋爱上瘾',
          desc: '契约夫妇遇感情危机',
          url: '8.jpg'
        },
        {
          title: '此食此客',
          desc: '啤酒花蛤夏日绝配',
          url: '9.jpg'
        },
        {
          title: '爱奇艺特别策划',
          desc: '我们的70年',
          url: '10.jpg'
        }
    ];  // 需要展示的数据,通常从后端获取

    let curIndex = 0;  // 当前索引
    let isAutoMove = true; // 是否可以自动改变图片    
    let interval = 1000; // 自动轮播的间隔时间
    // 封装函数:生成新的标签
    function createTag(tag) {
      return document.createElement(tag);
    }
    // 封装函数:生成文本节点
    function createText(text) {
      return document.createTextNode(text);
    }
    // 封装函数:初始化列表
    function initItemList() {
      let ul = document.getElementsByClassName('item-list')[0];
      
      for (let i = 0; i < items.length; i++) {
        let li = createTag('li');
        if (i == 0) { li.classList.add('active') }
        let span1 = createTag('span');
        let span2 = createTag('span');
        let span3 = createTag('span');
        let text1 = createText(items[i].title);
        let text2 = createText(':');
        let text3 = createText(items[i].desc);
        span1.appendChild(text1);
        span2.appendChild(text2);
        span3.appendChild(text3);
        li.appendChild(span1);
        li.appendChild(span2);
        li.appendChild(span3);
        ul.appendChild(li);
        addHoverListener(li, i);
      } 
    }
    // 鼠标hover右侧栏时改变背景图片及文字样式
    function addHoverListener(trigger, index) {
      trigger.addEventListener('mouseenter', function () {
        curIndex = index;  // 保存当前索引
        changeImage();
        activeText();
      });
    }
    // 根据index改变背景图片
    function changeImage() {
      console.log('curIndex: ', curIndex);
      let imgUrl = items[curIndex].url;
      let imgWrap = document.getElementsByClassName('img-wrap')[0];
      imgWrap.style.cssText = "background-image: url('" + imgUrl + "')";
    }
    // 根据index改变右侧激活文本的样式
    function activeText() {
      let activeObj = document.getElementsByClassName('active')[0];
      let li = document.getElementsByTagName('li')[curIndex];
      if (activeObj) {
        activeObj.classList.remove('active');
      }
      li.classList.add('active');
    }
    // 鼠标移入移出wrap区域时响应关闭、开启自动轮播
    function addEnterListener() {
      let wrap = document.getElementsByClassName('wrap')[0];
      wrap.addEventListener('mouseenter', function () {
        isAutoMove = false;
      });
      wrap.addEventListener('mouseleave', function () {
        isAutoMove = true;
      });
    }
    // 定时切换图片:使用定时器setInterval(function(){}, time)
    function autoMove() {
      let timer = setInterval(function () {
        if (isAutoMove) {
          if (curIndex < 9) {
            curIndex ++;
          } else {
            curIndex = 0;
          }
          changeImage();
          activeText();
        }
      }, interval);
    }
    window.onload = function () {
      initItemList();
      addEnterListener();
      autoMove();
    }
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
javascript开发技术大全-第3章 js数据类型
Jul 03 Javascript
提取字符串中年月日的函数代码
Nov 05 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
详解AngularJS中的http拦截
Feb 09 Javascript
基于jQuery实现的幻灯图片切换
Dec 02 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 Javascript
JS 仿支付宝input文本输入框放大组件的实例
Nov 14 Javascript
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
vue简单练习 桌面时钟的实现代码实例
Sep 19 #Javascript
JS实现滚动条触底加载更多
Sep 19 #Javascript
Vue v-text指令简单使用方法示例
Sep 19 #Javascript
Vue.set 全局操作简单示例
Sep 19 #Javascript
layui对工具条进行选择性的显示方法
Sep 19 #Javascript
基于js实现抽红包并分配代码实例
Sep 19 #Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 #Javascript
You might like
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
chrome不支持form.submit的解决方案
2015/04/28 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python scipy卷积运算的实现方法
2019/09/16 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
测试工程师职业规划书
2014/02/06 职场文书
2014年小班元旦活动方案
2014/02/16 职场文书
职务说明书范文
2014/05/07 职场文书
廉洁教育学习材料
2014/05/19 职场文书
旷课检讨书500字
2014/10/14 职场文书
副总经理岗位职责
2015/02/02 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
放假通知怎么写
2015/08/18 职场文书
安全生产学习心得体会
2016/01/18 职场文书
建立共青团委员会的请示
2019/04/02 职场文书