50 Projects 50 Days - Rotating Navigation Animation 学习记录

news2025/1/12 0:52:46

项目地址

Rotating Navigation Animation

展示效果

Rotating Navigation Animation
在这里插入图片描述

实现思路

结构主要分为两部分,绕左上角旋转的部分:包括按钮圆盘和内容区,以及左下角移出的导航栏部分。

整个界面只在左上角圆盘的按钮点击时发生改变,而且这种改变只有两种状态:旋转内容和转盘并显示导航栏、内容和转盘归位并隐藏导航栏。因此可以考虑添加一个class属性的方式实现效果,而这个class属性会分别作用在几个需要改变的元素上。

  1. 点击按钮后旋转,圆盘和内容都绕左上角作为原点进行旋转,可以考虑将两部分放到一个父盒子里,通过添加show-nav属性改变样式
  2. 圆盘和内容旋转的角度略有不同,圆盘要转动90度,而内容转动只有20度,所以整体应该是选择20度,而圆盘再额外旋转70度
  3. 导航栏在设计好布局后,先全部移动到页面左侧隐藏区域,在需要显示时再移动回来

实现细节

HTML结构

案例中用到了一些按钮的图标,这些图标来自于font-awesome库中,这里直接在head中声明cdn地址进行引用,在页面加载时会自动载入图标样式。

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"
    integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog=="
    crossorigin="anonymous" />
  <link rel="stylesheet" href="style.css" />
  <title>Rotating Navigation</title>
</head>

按钮圆盘和正文内容放到一个container里面,原案例中圆盘外面还包了一层fixed的circle-container,然后在里面使用relative定位的circle来给按钮定位提供参考位置,不过实际上也可以不需要这样做,因为absolute定位参考的父元素位置只要是非static定位就行。不过遵循子绝父相的原则也确实是一种良好习惯。

正文文字直接用乱数假文来测试排版。

导航栏常规用列表进行排布。

<div class="container">
    <div class="circle">
      <button id="close"><i class="fas fa-times"></i></button>
      <button id="open"><i class="fas fa-bars"></i></button>
    </div>
    <div class="content">
      <h1>Amazing Article</h1>
      <small>Florin Pop</small>
      <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Accusantium quia in ratione dolores cupiditate, maxime
        aliquid impedit dolorem nam dolor omnis atque fuga labore modi veritatis porro laborum minus, illo, maiores
        recusandae cumque ipsa quos. Tenetur, consequuntur mollitia labore pariatur sunt quia harum aut. Eum maxime
        dolorem provident natus veritatis molestiae cumque quod voluptates ab non, tempore cupiditate? Voluptatem,
        molestias culpa. Corrupti, laudantium iure aliquam rerum sint nam quas dolor dignissimos in error placeat quae
        temporibus minus optio eum soluta cupiditate! Cupiditate saepe voluptates laudantium. Ducimus consequuntur
        perferendis consequatur nobis exercitationem molestias fugiat commodi omnis. Asperiores quia tenetur nemo ipsa.
      </p>
      <h3>My Dog</h3>
      <img
        src="https://images.unsplash.com/photo-1507146426996-ef05306b995a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2100&q=80"
        alt="doggy" />
      <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sit libero deleniti rerum quo, incidunt vel
        consequatur culpa ullam. Magnam facere earum unde harum. Ea culpa veritatis magnam at aliquid. Perferendis totam
        placeat molestias illo laudantium? Minus id minima doloribus dolorum fugit deserunt qui vero voluptas, ut quia
        cum amet temporibus veniam ad ea ab perspiciatis, enim accusamus asperiores explicabo provident. Voluptates
        sint, neque fuga cum illum, tempore autem maxime similique laborum odio, magnam esse. Aperiam?</p>
    </div>
  </div>
  <nav>
    <ul>
      <li><i class="fas fa-home"></i><a href="#"> Home</a></li>
      <li><i class="fas fa-user-alt"></i><a href="#">About</a></li>
      <li><i class="fas fa-envelope"></i><a href="#">Contact</a></li>
    </ul>
  </nav>

CSS样式

container

容器样式定义盒子内容为全屏显示(去除滚动条),以及旋转变换的原点为左上角
容器带上show-nav的class后整体逆时针旋转20度

.container{
  background-color: #fafafa;
  padding: 50px;
  height: 100vh;
  transform-origin: left top;
  transition: transform 0.5s linear;
}

转盘

首先设置尺寸来实现圆盘的外观,转盘本身的位置应该是脱离container的文档流,固定在左上角,通过设置偏移来控制在页面中只显示右下角部分。
但是设置偏移量会导致body整体向下移动,顶部会有100px的空区,这会导致之后旋转的原点下移,最终的效果就不一致了。此时设置padding值可以将整个body撑开(这里其实还没完全搞清楚)

.circle{
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background-color: #ff7979;
  position: fixed;
  left: -100px;
  top: -100px;
  transition: transform 0.5s linear;
}

转盘上两个按钮设置为转盘半径大小,并通过设置偏移让两个按钮恰好显示在右下角圆弧的正中间。同时也定义旋转原点同样是左上角。

.circle button{
  height: 100px;
  background: transparent;
  border: 0;
  font-size: 26px;
  color: #fff;
  position: absolute;
  left: 50%;
  top: 50%;
  cursor: pointer;
  transform-origin: left top;
}

然后是对两个按钮的位置进行一些微调,关闭按钮逆时针旋转90度隐藏到页面左边。

.circle #open{
  left: 60%;
}

.circle #close{
  transform: rotate(90deg);
  top: 60%; 
}

最后当容器有show-nav的class后,转盘在跟随容器旋转20度的基础上,再旋转70度。

.container.show-nav .circle {
  transform: rotate(-70deg);
}

内容区

首先内容整体需要做一些宽度限制,或者至少图片应该做一些宽度限制。
这里需要注意的是

.content {
  max-width: 1000px;
  background-color: #fafafa;
  margin: 50px auto;
}

.content img {
  width: 100%;
}

.content h1 {
  margin: 0;
}

.content small {
  color: #555;
  font-style: italic;
}

.content p {
  color: #333;
  line-height: 1.5;
}

导航栏

导航栏部分固定位置在左下角,去除无序列表的默认样式。

表格的三项根据从上往下依次向右偏移一定距离,在隐藏时也对应需要向左移动更多的距离,当兄弟节点容器有show-nav的class后,将所有列表项的移动距离清零来达到导航栏出现的效果。

.container.show-nav + nav li {
  transform: translate(0);
}

nav {
  position: fixed;
  bottom: 40px;
  left: 0px;
  z-index: 1000;
}

nav ul {
  list-style: none;
  padding-left: 30px;
}

nav ul li {
  color: #fff;
  margin: 30px 0;
  transform: translateX(-100%);
  transition: transform 0.4s ease-in;
}

nav ul li i {
  font-size: 20px;
  margin-right: 10px;
}

nav ul li + li {
  margin-left: 15px;
  transform: translateX(-150%);
}

nav ul li + li + li {
  margin-left: 30px;
  transform: translateX(-200%);
}

nav a {
  text-decoration: none;
  color:#fff;
  transition: all 0.5s;
}

nav a:hover {
  color:#ff7979;
  font-weight: bold;
}

JavaScript逻辑

脚本逻辑非常简单,就是给两个按钮绑定 向container元素添加/删除 show-nav 的class即可。

const container = document.querySelector('.container');
const open = document.getElementById('open');
const close = document.getElementById('close');

open.addEventListener('click', () => container.classList.add('show-nav'));
close.addEventListener('click', () => container.classList.remove('show-nav'));

总结

  1. 分析结构,需要旋转的部分放一块,只需要添加一个class即可完成所有交互效果的变换。
  2. 旋转中心为左上角,圆盘和内容角度不相同。
  3. 圆盘定位脱离container文档流,设置偏移后注意body上方的空位会影响旋转变换效果,通过设置padding值消除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sarsa VS Q-Learning

前言 1.如何计算价值函数&#xff1f; 为了使模型训练的最好&#xff0c;学习到更多有用的知识即完成任务的最好策略。对策略好坏的评价标准自然是得到最多最好的奖励&#xff0c;那么如何找到最好的最好的奖励&#xff0c;即如何得到最好的价值函数&#xff1f; 首先对于在状…

Leetcode.2280 表示一个折线图的最少线段数

题目链接 Leetcode.2280 表示一个折线图的最少线段数 Rating &#xff1a; 1681 题目描述 给你一个二维整数数组 stockPrices&#xff0c;其中 stockPrices[i] [dayi, pricei]表示股票在 dayi的价格为 pricei 。折线图 是一个二维平面上的若干个点组成的图&#xff0c;横坐标…

ROS学习——艰辛的环境安装之路一Ubuntu

文章目录Ubuntu安装和下载页面设置安装Vmware Tools安装VSCODE用几个常用命令简单熟悉下UbuntuUbuntu 安装和下载 Ubuntu的安装和下载 看这个链接 Ubuntu安装和下载1 或者这个链接 Ubuntu安装和下载2 页面设置 安装Vmware Tools 看这个链接 VMware Tools的介绍和安装 安装…

算法训练第五十五天 | 392.判断子序列、115.不同的子序列

动态规划part15392.判断子序列题目描述思路总结115.不同的子序列题目描述思路392.判断子序列 题目链接&#xff1a;392.判断子序列 参考&#xff1a;https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html 题目描述 给定字符串 s 和 t &…

RabbitMQ 基础篇 | 黑马

目录 一、RabbitMQ简介 1、AMQP 2、基本概念 3、工作模式 4、JMS 5、小结 二、快速入门 简单模式 生产者 消费者 三、工作模式 1、Work queues 工作队列模式 2、Pub/Sub 订阅模式 3、Routing 路由模式 4、Topics 通配符模式 四、SpringBoot整合RabbitMQ 1、生产…

ESP32设备驱动-BME680环境传感器驱动

BME680环境传感器驱动 文章目录 BME680环境传感器驱动1、BME680介绍2、硬件准备3、软件准备4、驱动实现1、BME680介绍 BME680 是一款集成环境传感器,专为尺寸和低功耗是关键要求的移动应用和可穿戴设备而开发。 BME680 扩展了 Bosch Sensortec 现有的环境传感器系列,首次集成…

电影《龙马精神》观后感

上周看了龙叔的电影《龙马精神》&#xff0c;整体故事围绕着一匹马而展开的&#xff0c;因为这匹马&#xff0c;饰演罗师傅的龙叔&#xff0c;被小混混催债&#xff0c;因为这匹马&#xff0c;罗师傅才有机会和女儿接触&#xff0c;因为这匹马&#xff0c;才有机会看见女婿。 看…

数据结构-排序

本节目标&#xff1a; 1.排序的概念及其运用 2.常见排序算法的实现 3.排序算法复杂度及稳定性分析 1.排序的概念及其应用 1.1排序的概念 排序就是按照某个我们设定的关键字&#xff0c;或者关键词&#xff0c;递增或者递减&#xff0c;完成这样的操作就是排序。 1.2排…

打开组策略提示:无法为文件xxx找到适当的资源文件,错误=2的解决方法

最近把自己的电脑升级成win11了&#xff0c;出现了一些bug&#xff0c;不见得是win11系统的问题&#xff0c;也可能是某个过程出现了问题&#xff0c;出现了问题咱就解决&#xff0c;参考了几个文档和视频&#xff0c;最终解决了&#xff0c;记录一下。 打开本地策略出现问题如…

7.Java中的String类、常用类及包装类

Java中的String类、常用类及包装类 一、String类 1、String类定义 String 类代表字符串。Java 程序中的所有字符串字面值&#xff08;如 “abc” &#xff09;都作为此类的实例实现。字符串是常量&#xff1b;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为…

2023爱分析·中国城市轨交智能运维市场厂商评估报告:逸迅科技

报告编委 张扬 爱分析联合创始人&首席分析师 王鹏 爱分析分析师 目录 1. 研究背景 2. 市场综述 3. 市场分析 4. 厂商评估&#xff1a;逸迅科技 5. 最佳实践案例 1. 研究背景 轨道交通是我国国民经济的命脉和交通运输的骨干网络&#xff0c;不仅承担了绝大…

RocketMQ 消息发送源码解读

可靠同步发送、可靠异步发送、单向发送、批量消息发送。 RocketMQ 消息发送需要考虑以下3个问题。 1&#xff09;消息队列如何进行负载&#xff1f; 2&#xff09;消息发送如何实现高可用&#xff1f; 3&#xff09;批量消息发送如何实现一致性&#xff1f; org.apache.rocketm…

基于SpringBoot+微信小程序的失物招领小程序

基于SpringBoot微信小程序的失物招领小程序 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目…

通达信欧奈尔RPS指标公式编写和设置方法(完全版)

通达信欧奈尔RPS指标公式的编写和设置较为复杂&#xff0c;对于初学者来说可能具有一定挑战性。在编写口袋支点公式时&#xff0c;需要使用RPS指标公式作为基础条件&#xff0c;因此有必要先了解其编写和设置方法。 一、上市一年以上选股 首先选出上市一年以上的股票&#xff…

python实现折线图和条形图

画图的部分函数 pandas 读取数据 相关包&#xff1a;import pandas as pd 函数&#xff1a;dfpd.read_excel(“文件名”) #读取excel文件 df.head(n)#查看前n行 df.tail(n)#查看后n行 df.shape #查看行数和列数 df.columns # 查看列索引 df.index #查看行索引 df.info() #查看…

怎样恢复删除的视频?视频恢复,4个方法!

案例&#xff1a;怎样恢复删除的视频 【谁懂啊&#xff01;电脑里视频太多了太占内存&#xff0c;本想删除一些不太重要的&#xff0c;但却删错了&#xff01;有朋友知道怎样恢复删除的视频吗&#xff1f;】 在数字化时代&#xff0c;我们经常使用电脑来存储和管理各种视频文…

股票量比实时筛选报警

一.什么是股票的量比 量比是短线投资一个参考指标&#xff0c;是衡量相对成交量的一个数值和指标&#xff0c;用于反映股票交易相对于以往的活跃程度&#xff1b;是指在股市开盘以后&#xff0c;平均每一分钟的成交量与过去五个交易日平均每分钟交易量的比。反映股票相对最近5…

自动驾驶定位模块的作用是什么?为什么会有多种坐标系?

无人车,要实现自动驾驶,首先要知道自己的的位置。更准确的说法是:相对某个坐标系,确定车辆的位置和姿态。 这个坐标系可以是局部的: 也可以是全局坐标系: 这是更大维度上的坐标系。 坐标系确定之后,相对坐标原点和坐标轴,车上坐标系(本地坐标系),平移得到位置(x…

SQL语句要点一文速览

以下内容参考《SQL必知必会&#xff08;第4版&#xff09;》 了解 SQL 数据库&#xff08;database&#xff09;&#xff1a;保存有组织的数据的容器&#xff08;通常是一个文件或一组文件&#xff09;。最简单的办法是将数据库想象为一个文件柜。这个文件柜是一个存放数据的…

【数据结构】算法的时间复杂度和空间复杂度(下)(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…