旋转的 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 导航栏 的相关文章

  • CSS3 中均匀间隔的导航链接占据 ul 的整个宽度

    我想创建一个水平导航链接列表 其中导航链接均匀分布并占据封闭容器的整个宽度 ul 导航链接可以有不同的宽度 第一个和最后一个链接应与链接的开头和结尾对齐 ul 分别 意味着链接不居中 如下所示 left side right side li
  • 响应式 CSS 图像锚点标签 - 图像地图样式

    我一直在开发一个响应式网站 并且在图像映射方面遇到了一些问题 图像映射似乎不适用于基于百分比的坐标 经过一番谷歌搜索后 我发现了一个 JS 解决方法 http mattstow com experiment responsive image
  • 可见性的替代方案:折叠在 IE 和 Chrome 上不起作用

    以下页面 table border 1 tr class cccc td one td tr table 仅适用于 Firefox IE 始终显示该行 而 Chrome 隐藏该行但显示其垂直空间 那么 如何仅使用 CSS 完全隐藏一行呢
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • CSS 选择器用于选择最后两个子项,而不知道列表中有多少项

    我有一个无序列表 它有时包含 4 5 6 或 7 个项目 我想知道是否有一个 CSS 选择器来选择最后两项 我意识到 last child会给我最后一件物品 是否有 倒数第二个孩子 选择器 或者 孩子数量 2 选择器 HTML ul li
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • Google 再营销标签 - iframe 高度问题

    我注意到 Google 的再营销代码会在我的页面底部插入一个 iframe 问题是 iframe 弄乱了我的布局 它的高度为 13 像素 并且在底部留下了空白的白色垂直空间 我尝试用 css 隐藏它 但它在 IE9 中仍然可见 iframe
  • 如何在 Bootstrap 列中使用文本溢出?

    假设我有一行具有固定高度 并且我在其列中插入了一些文本 如果太长 我希望将其剪掉 并在行尾添加三个点 如下所示 我在用着文本溢出 省略号 我的行中有此属性 但无法使其工作 JsFiddle http jsfiddle net Alexnot
  • `ie9` - contenteditable false 在父级可编辑时不起作用

    我正在尝试制作内容可编辑和不可编辑的容器 用户可以通过 3 种方式使用它 他们可以将内容与non editable 他们可以将内容与editable 他们可以在不选择其中之一的情况下放置内容 可编辑 我正在努力实现以下目标 content
  • 使用滤镜将css3灰色图像转为蓝色?

    我正在尝试将灰色图像变为更蓝色的色调 真的不知道如何为此设置滤镜或是否可能 该图像只有一种颜色 cacaca 其余部分透明 我正在尝试使用相同的图像进行一些叠加 以便它仅突出显示那些彩色部分而不是透明区域 一直在尝试其中的一些 但没有取得多
  • 两个 Div 之间的固定宽度间隙

    有谁知道如何修复两个 div 之间的间隙 我有一个主要内容 Div 里面有两个带有图片的 Div 视图的宽度为 768 像素 当我开始拉伸视图时 两张图片开始相互远离 但理想情况下 主要内容 Div 应该在周围有空白的情况下拉伸 并且图片之
  • 通过 JavaScript 检测浏览器换行

    我需要 javascript 来检测每个浏览器包装的文本行并将其包装到 span class line 我读过一些关于测量每个单词的 y 轴的文章 但还没有看到可靠的解决方案 这是我到目前为止所拥有的 看到它Jsfiddle http js
  • CSS3 box-shadow 用于类似重叠的 div

    我正在尝试用css3来实现这种效果 HTML 代码显然是这样的
  • 在 IE 8 及以下版本中动态添加 @font-face 规则

    我使用 IE stylesheet addRule 方法添加 font face 规则 但是 符号对于该方法的 选择器 参数来说是不允许的字符 因此我收到 无效参数 错误 s addrule font face font family Fo
  • 使用 CSS 的平行四边形导航背景

    我正在尝试创建此导航菜单 绿色突出显示是活动页面 灰色是悬停状态 我可以使用以下 CSS 制作平行四边形 ul nav li a text decoration none padding 4px 10px border radius 3px
  • 保持未知数量的 div 居中,每行最多 4 个

    我有一个简单的问题 但我自己无法解决 简而言之 有一个未知电话我必须在页面中放置的元素数量 最多 每行 4 个元素 但仍居中 此图片给您一个提示 我为了示例而设置它 详细 在上图中我涵盖了不同的场景 例如 如果总共有 5 个元素 则应使用第
  • 指针事件:无,过滤,适用于 ie8 和任何地方,不适用于 ie9

    正如我在这里看到的 https stackoverflow com questions 3680429 click through a div to underlying elements 4839672 4839672 过滤器可用于模拟跨
  • CSS 是否有不等于选择器?

    CSS中有类似 不等于 的东西吗 例如 我有以下代码 input 但对于某些输入 我需要将其作废 我想通过将类 reset 添加到输入标签来做到这一点 例如
  • FireFox 中的“contenteditable = true”高度问题

    当有空的时候div with contenteditable true CSS contenteditable true border 1px dashed dedede padding 3px HTML div div 在 IE 和 Ch

随机推荐

  • 列出可用的平台工具集

    有没有办法列出 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