首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript实现 满天星 导航栏

JavaScript实现 满天星 导航栏

作者头像
FEWY
发布于 2019-05-27 00:27:00
发布于 2019-05-27 00:27:00
1.1K00
代码可运行
举报
文章被收录于专栏:FEWYFEWY
运行总次数:0
代码可运行

解释

实现这个效果,需要掌握的知识不用很多,知道简单的CSS,会用JS 获取元素, 能绑定事件基本就足够了。 好的,我们直接来看代码,注释已经写的很详细了,不想看有注释的,点这里

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <style>
body {
  background-color: #000;
  /* 防止出现左右的滚动条 */
  overflow: hidden;
  margin: 0;
  padding: 0;
}
.wrapper {
  width: 100%;
  height: 100px;
}
.wrapper .nav {
  list-style: none;
  width: 800px;
  height: 100px;
  padding: 0;
  margin: 0 auto;
}
.wrapper .nav li {
  width: 25%;
  height: 50px;
  float: left;
  margin-top: 25px;
}
.wrapper .nav li a {
  text-decoration: none;
  color: #fff;
  text-align: center;
  line-height: 50px;
  display: block;
  font-size: 20px;
  font-family: "KaiTi";
}

/* 闪烁的星星 的基本样式 */
.star {
  width: 5px;
  height: 5px;
  background: #fff;
  position: absolute;
  z-index: -1;
}

/*  闪烁动画,改变透明度  */
@keyframes blink {
  from {
    opacity: 0.2;
  }
  to {
    opacity: 1;
  }
}
</style>
 </head>
 <body>
        <div class="wrapper">
            <ul class="nav">
                <li><a href="#">导航1</a></li>
                <li><a href="#">导航2</a></li>
                <li><a href="#">导航3</a></li>
                <li><a href="#">导航4</a></li>
            </ul>
        </div>
<script>

// 定义一个 starrySky 对象
var starrySky = {
  // 星星的数量
  starNum: 100,

  // 星星的大小,返回一个 2 ~ 12 的随机数
  starSize () { return 2 + Math.trunc(Math.random() * 10) },

  // 星星的颜色 
  starColor: "#fff",

  // 线的颜色,鼠标进入导航区域,星星会连成一条线
  lineColor: "#fff",

  // 线的高度
  lineHeight: "3px",

  // 星星连成线的时间
  changeTime: "1s",

  // 初始化方法,生成需要的星星,并调用需要的方法
  init () {
    var html = "";
    // 循环生成星星
    for (var i = 0; i < this.starNum; i++) {
      html += "<div class='star' id='star" + i + "'></div>";
    }
    // 拼接到 元素wrapper 中
    document.querySelector(".wrapper").innerHTML += html;

    // 调用 星星分散 的方法
    this.disperse();

    // 调用 星星聚合连成线 的方法 
    this.combine();
  },
  disperse () {
    // 这个that 保存的是 starrySky 对象
    var that = this;

    // 获取 元素wrapper 的宽度
    var width = document.querySelector('.wrapper').offsetWidth;
    // 获取 元素wrapper 的高度
    var height = document.querySelector('.wrapper').offsetHeight;
    // 循环,开始在元素wrapper 区域内,生成规定数量的 星星,
    for (var i = 0; i < that.starNum; i++) {
      // 星星的 top值,0 ~ 元素wrapper 高度的随机数
      var top = Math.trunc(height * Math.random());
      // 星星的 left值,0 ~ 元素wrapper 宽度的随机数
      var left = Math.trunc(width * Math.random());
      // 星星的大小,调用 starrySky对象的starSize()方法
      var size = that.starSize();
      // 设置分散时每个星星样式
      document.querySelector("#star" + i).style.cssText += `
                        top:${top}px;
                        left:${left}px;
                        width:${size}px;
                        height:${size}px;
                        background:${that.starColor};
                        opacity:${Math.random()};
                        border-radius:50%;
                        animation:blink 1s ${Math.random() * 2}s infinite alternate;
                    `;
    }
  },
  combine () {
    // 这个that 保存的是 starrySky 对象
    var that = this;
    // 查找导航栏 里所有的 a元素,遍历他们,每个都绑定上 鼠标进入 和 鼠标移出 事件
    document.querySelectorAll(".nav li a").forEach(function (item) {
      item.addEventListener("mouseover", function (e) {
        // 这里的this 是触发事件的当前节点对象,就是鼠标进入时候的 a元素
        // 当前a元素的宽度 / 星星数 = 最后连成线时,星星的宽度
        var width = this.offsetWidth / that.starNum;
        // 遍历,为每个星星修改样式,开始连成线
        for (var i = 0; i < that.starNum; i++) {
          // 星星的top 值就是,当前a元素的距离顶部的值 + 当前a元素的高度
          var top = this.offsetTop + this.offsetHeight;
          // 星星的left 值就是,当前a元素的距离左边界的值 + 第i个星星 * 星星的宽度
          var left = this.offsetLeft + i * width
          //  设置每个星星连成线时的样式
          document.querySelector("#star" + i).style.cssText += `
                                    width:${width}px;
                                    top:${top}px;
                                    left:${left}px;
                                    height:${that.lineHeight};
                                    background:${that.lineColor};
                                    opacity:1;
                                    border-radius:0;
                                    transition:${that.changeTime};
                                    animation:blink 1s infinite alternate;
                                `;
        }
      });
      // 鼠标移出 调用 星星分散 的方法
      item.addEventListener("mouseout", function () {
        that.disperse();
      });
    }
    );
  },

}
// 调用 starrySky对象的 init方法,实现满天星效果
starrySky.init();
</script>
 </body>
</html>

注意:如果需要修改样式,不要把 nav元素 和 nav 里面的 li元素,给定位了,因为最后线的位置是根据 a元素的 offsetHeight 和 offsetLeft 定位的,如果 nav元素 和 nav 里面的 li元素 定位了,会改变 a元素的offsetParent元素,位置就不对了。

总结

实现这个效果,就是做了一个 starrySky对象,定义好一些必须的属性,主要靠 disperse() 和 combine() 两个方法,需要星星分散的时候调用disperse(),需要星星连成线的时候调用combine(),好的就这样了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年03月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
❤️使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)❤️
在我们开始编写代码之前。虽然它不是 Nodejs 应用程序,但我们至少应该看到它的文件夹结构。
海拥
2021/09/22
8.8K0
❤️使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)❤️
每日分享html特效篇之一个菜单栏、一个渐变背景、一个加载特效、七个导航栏特效
1.前端工程师主要利用HMTL与CSS建构页面(其中html构建骨架,css构建样式),用JavaScript获取后端数据以及完善交互以及用户体验。 2.通俗来讲,前端在一个项目里,拿到UI设计师设计的设计稿,然后实现UI设计师设计稿,调用后端程序员给的数据接口以获取数据,然后测试,最后部署上线。 3.前端可以对设计图负责,大部分情况下,不需要特别的去理解业务逻辑,因为我们90后都是玩着十几年手机电脑长大的,十几年的经验足够我们在潜意识里想明白应该怎么做,怎么去一步步实现,会有什么意外情况。 4.我感觉前端发展有个很大的缺陷----晋升问题. 正如第三点所言,作为领导必须对项目有足够的了解,显然是要重点包括业务逻辑,这点上,后端开发者需要涉及数据库逻辑,是必须要跟业务逻辑打交道的(重中之重),因此,大部分的领导岗位都是后端开发者更有晋升的机会。当然,个别公司有专门的前端组长(这也不算什么),如果说前端开发者在自己工作范围之外还要腾出时间去研究业务逻辑,属实是觉得出力不讨好(因为这样的操作需要持续很久才能看出效果),而且再怎么研究业务逻辑也不会比每时每刻跟业务逻辑打交道的后端开发者了解更多。说实在的,大部分情况下,前端在配合后端进行开发.后端需要了解业务逻辑,要跟领导和客户商量细节,露脸机会很大,在老板面前刷脸次数众多。这些都是拉开前后端程序员晋升机会差距的因素。
淼学派对
2022/11/20
2.6K0
每日分享html特效篇之一个菜单栏、一个渐变背景、一个加载特效、七个导航栏特效
每日分享html特效篇1个侧边栏菜单+2个导航栏+1个登录页面+6个加载
1.前端工程师主要利用HMTL与CSS建构页面(其中html构建骨架,css构建样式),用JavaScript获取后端数据以及完善交互以及用户体验。 2.通俗来讲,前端在一个项目里,拿到UI设计师设计的设计稿,然后实现UI设计师设计稿,调用后端程序员给的数据接口以获取数据,然后测试,最后部署上线。 3.前端可以对设计图负责,大部分情况下,不需要特别的去理解业务逻辑,因为我们90后都是玩着十几年手机电脑长大的,十几年的经验足够我们在潜意识里想明白应该怎么做,怎么去一步步实现,会有什么意外情况。 4.我感觉前端发展有个很大的缺陷----晋升问题. 正如第三点所言,作为领导必须对项目有足够的了解,显然是要重点包括业务逻辑,这点上,后端开发者需要涉及数据库逻辑,是必须要跟业务逻辑打交道的(重中之重),因此,大部分的领导岗位都是后端开发者更有晋升的机会。当然,个别公司有专门的前端组长(这也不算什么),如果说前端开发者在自己工作范围之外还要腾出时间去研究业务逻辑,属实是觉得出力不讨好(因为这样的操作需要持续很久才能看出效果),而且再怎么研究业务逻辑也不会比每时每刻跟业务逻辑打交道的后端开发者了解更多。说实在的,大部分情况下,前端在配合后端进行开发.后端需要了解业务逻辑,要跟领导和客户商量细节,露脸机会很大,在老板面前刷脸次数众多。这些都是拉开前后端程序员晋升机会差距的因素。
淼学派对
2022/11/20
3.6K0
每日分享html特效篇1个侧边栏菜单+2个导航栏+1个登录页面+6个加载
JavaScript 基本知识
内嵌式:把代码书写在一个script标签对内(这种不需要任何行为会自动执行JS代码)
全栈程序员站长
2022/11/01
2.4K0
JavaScript 基本知识
也许vue+css3做交互特效更简单
做项目就难免会开发交互效果或者特效,而我最近开发的项目一直在使用vue,开发技术栈方面,理所当然就使用了vue+css3开发,过程中发现使用vue+css3开发特效,和javascript/jquery+css3的思维方式不一样,但是比javascript/jquery+css3简单一点点。今天就分享三个简单的小实例,希望能起到拓展思维的作用,让大家明白vue+css3应该怎样开发交互效果!如果大家有什么好的建议,或者觉得我哪里写错了,欢迎指出!
守候i
2018/08/22
6790
也许vue+css3做交互特效更简单
原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)
咕咕了好久啦,今天使用原生HTML+CSS+JS做一个很简单的个人定制的导航主页吧!
全栈程序员站长
2022/09/15
7.3K2
原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)
母亲节祝福网页制作
杨校
2025/05/10
4410
母亲节祝福网页制作
手把手教你超可爱的导航栏
嘿!大家好哇。今天来带大家做一个可爱?的滑动导航栏效果,这个demo很基础,但是使用场景非常广泛噢!作为前端大白,今天就手把手一步一步教你实现它吧!❤️ 实现效果 看!这个滑动的效果很有趣吧!这样的滑
小丞同学
2021/08/16
8530
第8天:CSS制作导航栏
今天主要学习了网页导航栏的制作。注意:引入外部CSS样式时,如果使用background:url(../images/1.png),一定记得用..跳出当前文件夹,回到上级目录。
半指温柔乐
2018/09/11
2.2K0
第8天:CSS制作导航栏
光标有反转效果的侧边导航(附源代码)
这是一个侧边导航效果,这个展开的效果给人一种很柔和的感觉,展开后菜单内容依次显示,最后是增加了一个聚焦的圆跟随光标移动,当遇到菜单内容时会放大圆形并反转显示菜单文字,加深了对导航的交互,这里的反转色基于 mix-blend-mode: difference 实现。这个效果还有两个主题色切换,有兴趣的可以在线看效果。
半夜喝可乐
2024/10/10
2050
光标有反转效果的侧边导航(附源代码)
魔改笔记六:twikoo及导航栏美化
顶栏动效曾令我费尽心思,眼见鱼鱼和洪哥的导航栏动画如此流畅,随着页面的上下切换标题和菜单,我感到无比畅快。然而,我发现的教程中都未能实现如此平滑的过渡。因此,我使用所学知识,在他人基础上进行改进,最终达成了我心目中的效果。至于 Twikoo 的美化,一开始我觉得原版实在不够美观,于是决定自行修改。在修改过程中,我也参考了一些小伙伴的内容,你可以在下方的引用链接中查看。
柳神
2024/05/30
3370
魔改笔记六:twikoo及导航栏美化
JavaScript案例:筋斗云
案例分析 利用动画函数做动画效果 原先筋斗云的起始位置是0 鼠标经过某个小li,把当前小li的offsetLeft位置做为目标值即可 鼠标离开某个小li,就把目标值设为0 如果点击了某个小li,就把li当前的位置存储起来,做为筋斗云的起始位置 代码实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
岳泽以
2022/10/26
5610
JavaScript案例:筋斗云
实现拼图滑动验证码
拼图滑动验证码的纯前端简单实现,重要部分都已标注注释,如果需要配合后端可以参考此思路,后端处理图片生成一个带缺口的背景图与一个符合缺口的拼图,并将取得拼图块的位置记录到SESSION,将图片与拼图传给前端展示,当用户拖动并松开鼠标后将鼠标轨迹与停留位置发送到后端,后端从SESSION中取得位置信息并与前端传递的位置进行对比,有需要的话可以分析此用户轨迹用以区分人机,如果位置偏差小于一定阈值则认为拼图成功。
WindRunnerMax
2020/09/01
2K0
Python Web前端实战案例——电商网站商品菜单导航栏
商品菜单导航栏是每个电商网站首页呈现菜单的必备的部分,因为复杂的网页,功能性较强的网站菜单内容较多,一般会加入侧边栏导航。 通常情况下:一级菜单都是横向导航,二级菜单都是左侧边栏,如果有三级,放到内容页,实例图如下所示:
荣仔_最靓的仔
2021/02/02
2.3K0
Python Web前端实战案例——电商网站商品菜单导航栏
中秋我用CSS写了个嫦娥奔月
为了这个中秋创意我觉得我自己也是绞尽脑汁了,看到那个中秋创意的选题,我瞧了瞧Python 画图,不会,又看爬虫,行不通(乱爬听说会被邀请喝咖啡),前端页面制作,我都没写过几个😂,越看越难受啊,就没啥能和我扯上关系的。 最后实在无路可走了,老老实实复习CSS动画,一下一下的调,色彩搭配,翻各种网站。做完还是让人蛮开心的😀 最后成果如下图: 这个简单的页面在很大程度上还是还原了我内心的想法,有些创意点没法实现,百度都不知道搜啥关键词😂,不足之处就是在于夜空的配色调不出来自己满意的。 代码演示可以查看
宁在春
2022/10/31
2750
中秋我用CSS写了个嫦娥奔月
【demo50】导航栏最小化
代码取自开源项目50projects50days,用作个人学习和巩固三件套的知识,增加了注释,可能会有小改动。
客怎眠qvq
2022/11/01
4460
【demo50】导航栏最小化
JavaScript案例:下拉菜单
案例分析 导航栏里面的li都要有鼠标经过效果,所以需要循环注册鼠标事件 核心原理:当鼠标经过li里面的第二个孩子ul显示,当鼠标离开,则ul隐藏 代码实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-w
岳泽以
2022/10/26
3.9K0
JavaScript案例:下拉菜单
永夜星河主题特效2(星河背景 + 闪烁文字+点击星星 + 文字弹出特效)
命运之光
2024/11/17
3140
永夜星河主题特效2(星河背景 + 闪烁文字+点击星星 + 文字弹出特效)
HTML+CSS TAB导航栏
这段代码是设置所有元素的外边距和内边距为0,并且使用 border-box 盒模型。
老K博客
2024/06/12
6980
从零开始学 Web 之 BOM(三)offset,scroll,变速动画函数
在 window 下有一个方法:window.getComputedStyle(element, string) 可以获取一个元素所有的属性值。
Daotin
2018/08/31
1.2K0
推荐阅读
相关推荐
❤️使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)❤️
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档