旋转的 3d 导航栏

2024-02-10

我正在尝试使用纯 CSS 以及变换、过渡和透视来创建 3d 导航栏。

这是我的代码:

.navbar-fixed-bottom {
	  background: transparent;
	}
	
	.navbar-perspective {
	  width: 100%;
	  height: 100%;
	  position: relative;
	  -webkit-perspective: 1100px;
	  -moz-perspective: 1100px;
	  perspective: 1100px;
	  -webkit-perspective-origin: 50% 0;
	  -moz-perspective-origin: 50% 0;
	  perspective-origin: 50% 0;
	}
	
	.navbar-perspective > div {
	  margin: 0 auto;
	  position: relative;
	  text-align: justify;
	  -webkit-backface-visibility: hidden;
	  -moz-backface-visibility: hidden;
	  backface-visibility: hidden;
	  -webkit-transition: all 0.5s;
	  -moz-transition: all 0.5s;
	  transition: all 0.5s;
	  height: 50px;
	  font-size:20px;
	}
	
	.navbar-primary {
	  background-color: #cccccc;
	  z-index: 2;
	  -webkit-transform-origin: 0% 100%;
	  -moz-transform-origin: 0% 100%;
	  transform-origin: 0% 100%;
	}
	
	.navbar .navbar-secondary,
	.navbar .navbar-tertiary {
	  background-color: #bfbfbf;
	  width: 100%;
	  -webkit-transform-origin: 0% 0%;
	  -moz-transform-origin: 0% 0%;
	  transform-origin: 0% 0%;
	  z-index: 1;
	  -webkit-transform: rotateX(-90deg);
	  -moz-transform: rotateX(-90deg);
	  transform: rotateX(-90deg);
	  -webkit-transition: top 0.5s;
	  -moz-transition: top 0.5s;
	  transition: top 0.5s;
	  position: absolute;
	  top: 0;
	}
	
	.navbar .navbar-tertiary {
	  background-color: #b3b3b3;
	}
	
	.navbar-rotate-primary {
	  height: 50px;
	}
	
	.navbar-rotate-primary .navbar-primary {
	  -webkit-transform: translateY(0%) rotateX(0deg);
	  -moz-transform: translateY(0%) rotateX(0deg);
	  transform: translateY(0%) rotateX(0deg);
	}
	
	.navbar-rotate-primary .navbar-secondary,
	.navbar-rotate-primary .navbar-tertiary {
	  top: 100%;
	  -webkit-transition: -webkit-transform 0.5s;
	  -moz-transition: -moz-transform 0.5s;
	  transition: transform 0.5s;
	  -webkit-transform: rotateX(-90deg);
	  -moz-transform: rotateX(-90deg);
	  transform: rotateX(-90deg);
	}
	
	.navbar-rotate-secondary,
	.navbar-rotate-tertiary {
	  height: 50px;
	}
	
	.navbar-rotate-secondary .navbar-primary,
	.navbar-rotate-tertiary .navbar-primary {
	  -webkit-transform: translateY(-100%) rotateX(90deg);
	  -moz-transform: translateY(-100%) rotateX(90deg);
	  transform: translateY(-100%) rotateX(90deg);
	}
	
	.navbar-rotate-secondary .navbar-secondary,
	.navbar-rotate-tertiary .navbar-secondary {
	  top: 100%;
	  -webkit-transition: -webkit-transform 0.5s;
	  -moz-transition: -moz-transform 0.5s;
	  transition: transform 0.5s;
	  -webkit-transform: rotateX(0deg) translateY(-100%);
	  -moz-transform: rotateX(0deg) translateY(-100%);
	  transform: rotateX(0deg) translateY(-100%);
	}
	
	.navbar-rotate-secondary-fallback .navbar-primary,
	.navbar-rotate-tertiary-fallback .navbar-primary {
	  display: none;
	}
	
	.navbar-rotate-tertiary .navbar-secondary {
	  -webkit-transform: translateY(-100%) rotateX(90deg);
	  -moz-transform: translateY(-100%) rotateX(90deg);
	  transform: translateY(-100%) rotateX(90deg);
	}
	
	.navbar-rotate-tertiary .navbar-tertiary {
	  top: 100%;
	  -webkit-transition: -webkit-transform 0.5s;
	  -moz-transition: -moz-transform 0.5s;
	  transition: transform 0.5s;
	  -webkit-transform: rotateX(0deg) translateY(-100%);
	  -moz-transform: rotateX(0deg) translateY(-100%);
	  transform: rotateX(0deg) translateY(-100%);
	}
<html>

<head>

	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>

<body>

	<nav id="navigation-bottom" class="navbar navbar-fixed-bottom">
		<div class="navbar-perspective">
			<div class="navbar-primary">
				<a href="javascript:void(0);" onclick="$('#navigation-bottom').attr('class','navbar navbar-fixed-bottom navbar-rotate-secondary')">Rotate To Face 2</a>
			</div>
			<div class="navbar-secondary">
				<a href="javascript:void(0);" onclick="$('#navigation-bottom').attr('class','navbar navbar-fixed-bottom navbar-rotate-tertiary')">Rotate To Face 3</a>
			</div>
			<div class="navbar-tertiary">
				<a href="javascript:void(0);" onclick="$('#navigation-bottom').attr('class','navbar navbar-fixed-bottom navbar-rotate-primary')">Rotate Back To Face 1</a>
			</div>
		</div>
	</nav>

</body>

</html>

我已经使用 3d 效果正确旋转了前两个面,但第三个面看起来不正确。当您从第二个旋转到第三个时,您会注意到顶部旋转不正确并且看起来很平。

任何帮助是极大的赞赏。


摆弄一个翻转盒子 http://jsfiddle.net/L3724xLh/1/

这与你开始的地方有很大不同,但让我发布我的 CSS 并向你展示小提琴,然后我将编辑更长的解释,解释其工作方式和原因:

 

HTML

<section class="container">
    <nav id="nav-box" class="show-front">
        <div class="front">
            <a href="#">Show Bottom</a>
        </div>
        <div class="bottom">
            <a href="#">Show Back</a></div>
        <div class="back">
            <a href="#">Show Top</a></div>
        <div class="top">
            <a href="#">Show Front</a></div>
    </nav>
</section>

 

CSS

.container {
  position: relative;
  perspective: 1000px;
  transform: scale(0.95);
}

#nav-box {
  width: 100%;
  height: 50px;
  position: absolute;
  transform-origin: center center;
  transform-style: preserve-3d;
  transition: transform 0.5s;
}

#nav-box div {
  width: 100%;
  height: 50px;
  display: block;
  position: absolute;
  transition: background-color 0.5s;
}

#nav-box .front  { transform: rotateX(   0deg ) translateZ( 25px ); background-color: #ccc; }
#nav-box .back   { transform: rotateX( 180deg ) translateZ( 25px ); background-color: #ccc; }
#nav-box .top    { transform: rotateX(  90deg ) translateZ( 25px ); background-color: #ccc; }
#nav-box .bottom { transform: rotateX( -90deg ) translateZ( 25px ); background-color: #ccc; }

#nav-box.show-front  { transform: rotateY(    0deg ); }
#nav-box.show-front .bottom { background-color: #a0a0a0; }
#nav-box.show-front .top { background-color: #e0e0e0; }
#nav-box.show-back   { transform: rotateX( -180deg ); }
#nav-box.show-back .bottom { background-color: #e0e0e0; }
#nav-box.show-back .top { background-color: #a0a0a0; }
#nav-box.show-top    { transform: rotateX(  -90deg ); }
#nav-box.show-top .front { background-color: #a0a0a0; }
#nav-box.show-top .back { background-color: #e0e0e0; }
#nav-box.show-bottom { transform: rotateX(   90deg ); }
#nav-box.show-bottom .front { background-color: #e0e0e0; }
#nav-box.show-bottom .back { background-color: #a0a0a0; }

 

HTML/CSS 的解释

设置我们的盒子

我不想说,你开始以错误的方式思考这个问题。你这样做是为了“我怎样才能把这四个面当作一个盒子”而不是“如何用 CSS 制作一个盒子?”

那么我们就来学习一下如何制作一个盒子吧。

首先,我们建立一个box容器。既然这是一个导航框,我们就称它为nav-box。我们应用的所有变换(除了阴影,我们稍后会讲到)都将在我们的nav-box.

我们的规则nav-box将决定它作为一个对象的行为方式。我们特别讨论两个:transform-origin and transform-style

transform-origin默认为center center,但我想在这里把它叫出来。这基本上是要告诉我们的盒子:嘿,我们需要你围绕你的绝对中心转动。如果我们将其设置为transform-origin: center bottom' it would look like the box is spinning around its bottom edge. 中心顶部`,它会绕其顶部边缘旋转。但我认为这不是你想要的。

transform-style需要设置为preserve-3d。这样做的目的是指示浏览器不要对带有以下内容的元素大惊小怪transform在它下面。其他选项包括flat它告诉浏览器忽略其下方的旋转。我们要设置的原因preserve-3d on our nav-box这是为了确保transforms当我们应用到盒子侧面时,我们会被保留transform家长。整洁的东西,是吧?

设置我们的双方

我们把我们的身边当作我们的孩子nav-box并按照它们应该使用的顺序放置它们rotateX:

  • 0前轮旋转
  • 180deg背部
  • -90deg对于底部
  • 90deg对于顶部

我们现在还可以设置左侧和右侧.left { transform: rotateY(-90deg); } .right { rotateY(90deg); }。请注意,我们使用了Y这两个例子的轴。

其次,我们设置一个translateZ的价值25px。那么这到底是在做什么?它告诉我们的盒子需要移动25px从父级的中心相对于它们各自的旋转。我们为什么选择25px?因为它正好是我们每个盒子高度的一半。这意味着它将与任一边缘的侧面很好地齐平。

然后是有趣的部分:

我们根据盒子的位置和面向屏幕的内容来对盒子进行着色。背景颜色与我们显示的框的哪一侧有关show-front, show-back等。底部的一侧变暗,顶部的一侧变亮。我只是喜欢这一点——完全不需要完成这项任务,但让它看起来更现实一点。

希望有帮助!

 


IE 更新

小提琴示例 http://jsfiddle.net/L3724xLh/3/

因此,一旦我们完成了 IE 的修复,就没有什么好看的了,但它就是这样。全部preserve-3d正在做的是当我们旋转容器时为您应用变换,而不是压平它们。如果我们不能使用preserve-3d,我们必须根据总旋转量来计算。

这个解决方案就是这样做的。我不会深入讨论这一点,而是强调这需要多少 JavaScript,并强调.rewind class:

#nav-box.rewind div {
    backface-visibility: hidden;
}

因为我们必须手动倒回此解决方案,所以我们必须防止在错误的时间应用 z 索引重新排序。那就是那里backface-visibility进来。

在 IE 中显示深度的示例 http://jsfiddle.net/L3724xLh/9/

另一个例子,不需要rewind class http://jsfiddle.net/L3724xLh/8/

希望能解决IE为你。

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

旋转的 3d 导航栏 的相关文章

  • Outlook 有条件 CSS If 吗?

    我需要一些特定的 css 来发送 html 电子邮件 但仅限于 Outlook 我正在寻找相当于
  • ::after 内联 HTML 电子邮件?

    banner width 34px height 52px position relative color white font size 11px letter spacing 0 2em text align center float
  • 使用 jQuery 更改 CSS 类属性

    有没有办法使用 jQuery 更改 CSS 类的属性 而不是元素属性 这是一个实际的例子 我有一个 div 类red red background red 我想转班级red背景属性 而不是具有类的元素red分配的背景 如果我用 jQuery
  • 底部带有三角形的 div 和背景图像

    我想做一个div 有一个底部的三角形 但我需要三角形上的背景图像为了出现 我尝试使用伪元素 after 但它不起作用 homebg after content position absolute top 100 left 0 right 0
  • jquery UI datepicker仅月份和年份的css定位问题

    我已经实施了这里讨论的解决方案 JQuery 日期时间选择器 只需选择月份和年份 https stackoverflow com questions 4079525 jquery datetime picker need to pick m
  • 如何防止桌面浏览器(Chrome、Safari)缩放网页

    我尝试使用以下元视图端口标记来防止浏览器缩放 但这不起作用 我知道这是可能的 因为我的缩放在此网站上被阻止 未来主义 xyz http futurism xyz 该网站的视口标签是这样的
  • 哪种 Javascript 解决方案(不是 .htc)可以真正在 IE7 和 8 中实现抗锯齿圆角?

    哪种 JavaScript 解决方案 不是 htc 确实可以在 IE7 和 8 中实现抗锯齿圆角CSS3在支持的浏览器中给出 我尝试了很多 http www ruzee com blog ruzeeborders http www ruze
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • CSS 边框底部的曲线

    我需要 CSS 中的这个图像 并且在这个边框内需要一个背景图像 我努力了 border radius 0 0 50 50 webkit border radius 0 0 50 50 但没有得到所需的形状 任何帮助 将不胜感激 边界半径 您
  • 如何在非 CSS3 浏览器上制作圆角?

    我知道在这种情况下我必须使用图像 每个角一个 例如 如果我需要给定元素周围有一个 4px 的纯蓝色边框 边框半径为 8px 我相应地设计了四幅图像 左上角 png 右上角 png 左下角 png 右下角 png 如果可能的话 我应该如何实现
  • 鼠标悬停时放大图像而不使用 Jquery 推送其他图像?

    当您将鼠标悬停在图像缩略图上 例如 Google 图片正在使用的缩略图 时 我正在尝试创建图像放大效果 但是 我遇到了一个问题 即放大的图像根据放大的图像的位置不断将另一张图像推到另一个位置 这是我到目前为止所拥有的
  • 动态突出显示时向

    添加项目符号点?

    Update 例子 p Text Text p 在示例中 是否可以选择第二个 文本 单词 p 元素并单击按钮仅动态添加项目符号点到选定的 单词 有没有可能 在一个 p p Text p 突出显示从 p 元素并添加项目符号点到按钮上动态单击的
  • 我正在尝试向我的 vue.js 项目添加背景图像

    我想添加覆盖整个页面的背景图像 然而现在看起来是这样的 我希望它跨越整个网页 在 vue js 中这将如何完成 我还想要一个动画工具栏 以便当页面不滚动时工具栏是透明的并呈现背景图像的外观 当它滚动时 工具栏将具有当前的蓝色 这是我的小提琴
  • 如何防止 CFDocument 中的内容中间发生分页?

    我使用 cfdocument 标签从 html css 动态生成 PDF 文件 有些内容块我不想跨越多个页面 经过一番搜索后 我发现根据文档支持 page break inside 样式 然而 在我的测试中 声明 page break in
  • 如何在Eclipse中集成CSS预处理? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 Eclipse 中编辑 SCSS 文件 最好使用语法突出显示 scss files 我发现这些资
  • 样式标签中的源映射是否有效?

    我在标签和源映射中遇到 CSS 问题 为了缩短项目的加载时间 我改变了将 CSS 放入 HTML 的方式 将其改为 h1 Source maps working wonderfully h1 进入这个
  • Firefox Placeholder Before CSS 选择器不起作用

    我使用的是最新的firefox 30 0 我正在尝试在必填字段的占位符之前插入红色字体真棒星号 我在 Chrome 中工作没问题 但我在 FF 和 上遇到问题 这是一个说明我的问题的代码笔 http codepen io anon pen
  • 使用@font-face时浏览器下载什么字体

    font face 有点令人困惑 因为所有浏览器都无法决定使用哪种文件格式 下面是我目前正在使用的向网站添加 1 个新字体的方法 您可以看到有 4 个单独的字体文件 我知道每个文件都是因为某些浏览器支持不同的格式 但浏览器是下载所有文件还是
  • 如何强制外部 div 扩展到内部 div 的高度?

    我有 ajax 到的数据 div class content 我希望外部 div 扩展到内部 div 的高度 我不知道该怎么做 HTML div class outer div class inner div class content S
  • 元素和 svg 形状之间的白线

    大家好 我正在使用由 shapedivider 生成的 svg 整形器 您可以看到 有一条白线 我不知道为什么它在那里以及如何删除它 请你帮助我好吗 有形状分隔符的代码 custom shape divider bottom 1640714

随机推荐

  • 列出可用的平台工具集

    有没有办法列出 VS2012 中可用的平台工具集 我的意思是一个可能包含 v90 v100 v110 v110 xp 和任何外部提供的平台工具集的列表 或者 应该更容易 有没有办法检查给定的平台工具集是否已安装 这是一个控制台应用程序实用程
  • Robots.txt 类别 URL 限制

    我无法找到有关我的案件的信息 我想限制以下类型的 URL 被编入索引 website com video title video title 我的网站生成我的视频文章的双 URL 副本 每篇视频文章的 URL 开头均以 视频 一词开头 所以
  • 使用 Selenium 和 Python 在 Instagram 通知上点击“现在不”

    我已经编写了一个可以成功登录 Instagram 的脚本 当我应该在家里使用我的帐户时 网站会显示一个弹出窗口 询问您是否需要通知 此时 我尝试了很多解决方案 但一无所获 我只是希望 当显示弹出窗口时 脚本应该单击 现在不 from sel
  • 将可选参数传递给函数,三个点

    我很困惑如何 works tt function return x 为什么不tt x 2 return 2 相反 它失败并出现错误 tt x 2 中的错误 未找到对象 x 尽管我路过x作为论据 因为你在其中传递的所有内容 停留在 您传递的未
  • 迭代时不打印变量

    我正在为个人项目编写 C CSV 类 但偶然发现了一个奇怪的错误 在我的测试程序中 我有代码 for int i 0 i lt 3 i std cout lt lt i lt lt std vector
  • 高基数字段的 Hive 查询性能

    我在配置单元中有一个单一但巨大的表 几乎总是使用主键列进行查询 例如 employee id 该表将非常巨大 每天插入数百万行 我想使用该字段上的分区进行快速查询 我关注了这个帖子 https stackoverflow com quest
  • 检查 IOS 8 中是否启用了本地通知

    我在互联网上查找了如何使用 IOS 8 创建本地通知 我找到了很多文章 但没有一篇文章解释了如何确定用户是否打开或关闭了 警报 有人可以帮帮我吗 我更喜欢使用 Objective C 而不是 Swift 您可以使用以下方法检查它UIAppl
  • Java System.nanoTime() 经过时间的巨大差异

    我正在使用 android 小部件并检查 System nanoTime 的两次调用之间的经过时间 并且数字很大 你如何用这个来衡量经过的时间 它应该是零点几秒 但实际上却更长 谢谢 The System nanoTime returns
  • 使用 groupby 对多列进行 Value_counts

    我需要一些关于熊猫的帮助 我有以下数据框 df pd DataFrame 1Country FR FR GER GER IT IT FR GER IT 2City Paris Paris Berlin Berlin Rome Rome Pa
  • 是否可以将帮助图标放在 p:accordionPanel 标题中?

    我正在使用 PrimeFaces 5 2 和 JSF 来开发页面 但我无法在 Accordion 面板标题中添加搜索图标和其他链接
  • 是否可以跳过“+”运算符中的 NA 值?

    我想用 R 计算方程 我不想使用该函数sum因为它返回 1 值 我想要完整的值向量 x 1 10 y c 21 29 NA x y 1 22 24 26 28 30 32 34 36 38 NA x 1 10 y c 21 30 x y 1
  • 为什么 Collections 类包含独立(静态)方法,而不是将它们添加到 List 接口中?

    对于所有方法收藏 http java sun com javase 6 docs api java util Collections html需要一个List http java sun com javase 6 docs api java
  • 链接期间未定义对全局变量的引用

    我正在尝试编译一个程序 该程序分为3个模块 对应3个源文件 a c b c and z c z c包含main 函数 它调用函数a c and b c 此外 还有一个函数a c调用一个函数b c 反之亦然 最后还有一个全局变量count它由
  • CentOS 中的 JMeter 整数表达式预期错误

    在 CentOS 中执行 JMeter 脚本时出现以下错误 我的JMeter版本是4 0 Java是1 8 我的脚本在 Windows 中运行良好 这是我的 JMeter 命令和我收到的错误 root localhost bin sh jm
  • 将字符串解析为 datetime64 的 Vaex 函数是什么,相当于 pandas to_datetime,允许自定义格式?

    我有日期字符串 例如 3 24 2020 我想将其转换为datetime64 ns format df2 date pd to datetime df1 str date format m d Y 使用熊猫to datetime在 vaex
  • Android 光传感器未触发事件

    使用光传感器时 我遇到一个问题 即永远不会触发 onSensorChanged 事件 原因是 当侦听器注册时 如果 lux 值保持不变 则不会发生变化 因此不会发生事件 不过 我还是想知道勒克斯值 恒定勒克斯值 0 和恒定勒克斯值 60 0
  • 如何链接 TFS 构建?

    我有一个场景 我想从另一个 TFS 构建调用一个 TFS 构建 第一个执行构建 第二个执行暂存 这将允许我为同一解决方案执行多个自定义暂存 我知道 我可以通过第二个构建中的 exec 任务来完成此任务 并调用 tfsbuild exe 将第
  • 带有 HTTPBody 输入流的 NSURLRequest:流在打开之前发送事件

    我想使用以下方式将大量数据发送到服务器NSURLConnection and NSURLRequest 为此 我创建了一对绑定的NSStreams 使用CFStreamCreateBoundPair 然后我将输入流传递给NSURLReque
  • 如何使用YouTube API检查视频是否受到限制?

    当嵌入这个Youtube 视频 https www youtube com embed dYQ2IyMuPes例如 我们得到This video contains content from who has blocked it from d
  • 旋转的 3d 导航栏

    我正在尝试使用纯 CSS 以及变换 过渡和透视来创建 3d 导航栏 这是我的代码 navbar fixed bottom background transparent navbar perspective width 100 height