搜索
首页web前端css教程使用锚定位的花式菜单导航

Fancy Menu Navigation Using Anchor Positioning

CSS锚点定位功能想必您已有所耳闻,对吧?这项功能允许您将页面上的任何元素链接到另一个元素,即锚点。它对所有工具提示都非常有用,但也能创造许多其他不错的效果。

本文将研究菜单导航,我依靠锚点定位在链接上创建出色的悬停效果。

很酷,对吧?我们有一个滑动效果,蓝色矩形通过流畅的过渡完美地适应文本内容。如果您不熟悉锚点定位,此示例非常适合您,因为它很简单,可以让您了解这项新功能的基础知识。我们还将学习另一个示例,所以请坚持到最后!

请注意,在我撰写本文时,只有基于Chromium的浏览器完全支持锚点定位。在其他浏览器更广泛地支持此功能之前,您需要在Chrome或Edge等浏览器中查看演示。

https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15bhttps://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15bhttps://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b 初始配置

让我们从HTML结构开始,它只是一个包含无序链接列表的nav元素:

<nav><ul>
<li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Home</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">About</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Projects</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Blog</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Contact</a></li>
  </ul></nav>

我们不会花太多时间解释这个结构,因为如果您的用例不同,它也可能不同。只需确保语义与您尝试执行的操作相关即可。至于CSS部分,我们将从一些基本样式开始,以创建水平菜单导航。

ul {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  gap: .5rem;
  font-size: 2.2rem;
}

ul li a {
  color: https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b000;
  text-decoration: none;
  font-weight: 900;
  line-height: 1.5;
  padding-inline: .2em;
  display: block;
}

到目前为止,没有什么特别的。我们删除了一些默认样式并使用Flexbox将元素水平对齐。

滑动效果

首先,让我们了解效果的工作原理。乍一看,似乎我们有一个矩形,它缩小到很小的高度,移动到悬停的元素,然后增长到全高。这就是视觉效果,但实际上,涉及多个元素!

这是我的第一个演示,我使用不同的颜色来更好地了解正在发生的事情。

每个菜单项都有其自己的“元素”可以收缩或增长。然后我们有一个公共“元素”(红色的那个),它在不同的菜单项之间滑动。第一个效果是使用背景动画完成的,第二个效果是锚点定位发挥作用的地方!

背景动画

对于第一部分,我们将动画化CSS渐变的高度:

/* 1 */
ul li {
  background: 
    conic-gradient(lightblue 0 0)
    bottom/100% 0% no-repeat;
  transition: .2s;
}

/* 2 */
ul li:is(:hover,.active) {
  background-size: 100% 100%;
  transition: .2s .2s;
}

/* 3 */
ul:has(li:hover) li.active:not(:hover) {
  background-size: 100% 0%;
  transition: .2s;
}

我们定义了一个宽度为100%,高度为0%的渐变,位于底部。渐变语法可能看起来很奇怪,但它是允许我拥有单色渐变的最短语法。

相关:“如何正确定义单色渐变”

然后,如果菜单项被悬停或具有.active类,我们将高度设置为100%。请注意此处延迟的使用,以确保增长发生在收缩之后。

最后,我们需要处理.active项的特殊情况。如果我们悬停任何项(不是活动项),则.active项会获得收缩效果(渐变高度等于0%)。这就是代码中第三个选择器的作用。

我们的第一个动画完成了!请注意,由于我们在第二个选择器中定义的延迟,增长是如何在收缩完成之后开始的。

锚点定位动画

第一个动画非常容易,因为每个项目都有自己的背景动画,这意味着我们不必关心文本内容,因为背景会自动填充整个空间。

我们将使用一个元素进行第二个动画,该元素在所有菜单项之间滑动,同时调整其宽度以适应每个项目的文本。这就是锚点定位可以帮助我们的地方。

让我们从以下代码开始:

<nav><ul>
<li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Home</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">About</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Projects</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Blog</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Contact</a></li>
  </ul></nav>

为了避免添加额外的元素,我更喜欢在ul上使用伪元素。它应该是绝对定位的,我们将依靠两个属性来激活锚点定位。

我们使用anchor-name属性定义锚点。当菜单项被悬停或具有.active类时,它将成为锚元素。如果另一个项目处于悬停状态,我们还必须从.active项目中删除锚点(因此,代码中的最后一个选择器)。换句话说,一次只定义一个锚点。

然后我们使用position-anchor属性将伪元素链接到锚点。请注意两者如何使用相同的表示法--li。这类似于例如,我们如何使用特定名称定义@keyframes,然后在animation属性中使用它。请记住,您必须使用语法,这意味着名称必须始终以两个破折号(--)开头。

伪元素已正确放置,但什么也看不见,因为我们没有定义任何维度!让我们添加以下代码:

ul {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  gap: .5rem;
  font-size: 2.2rem;
}

ul li a {
  color: https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b000;
  text-decoration: none;
  font-weight: 900;
  line-height: 1.5;
  padding-inline: .2em;
  display: block;
}

height属性很简单,但anchor()是新成员。以下是Juan Diego在Almanac中对其的描述:

CSS anchor()函数获取锚元素的一侧并解析为其定位的。它只能用于内嵌属性(例如top、bottom、bottom、left、right等),通常用于相对于锚点放置绝对定位的元素。

让我们也查看MDN页面:

anchor() CSS 函数可以在锚定位元素的内嵌属性值中使用,返回相对于其关联锚元素边缘位置的长度值。

通常,我们使用left: 0将绝对元素放置在其包含块(即具有position: relative的最近祖先)的左边缘。left: anchor(left)将执行相同的操作,但它将考虑关联的锚元素,而不是包含块。

就是这样——我们完成了!在下面的演示中悬停菜单项,看看伪元素是如何在它们之间滑动的。

每次您将鼠标悬停在菜单项上时,它都会成为伪元素(ul:before)的新锚点。这也意味着anchor(...)值将发生变化,从而产生滑动效果!让我们不要忘记使用transition,否则我们将有一个突然的变化。

我们也可以这样编写代码:

<nav><ul>
<li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Home</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">About</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Projects</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Blog</a></li>
    <li><a href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">Contact</a></li>
  </ul></nav>

换句话说,我们可以依靠inset简写,而不是使用left、right和bottom等物理属性,并且代替定义position-anchor,我们可以在anchor()函数中包含锚点的名称。我们在这里重复了三次相同的名称,这可能不是最佳选择,但在某些情况下,您可能希望您的元素考虑多个锚点,在这种情况下,此语法将很有意义。

结合两种效果

现在,我们将两种效果结合起来,,幻觉完美了!

请注意transition值,其中延迟很重要:

ul {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  gap: .5rem;
  font-size: 2.2rem;
}

ul li a {
  color: https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b000;
  text-decoration: none;
  font-weight: 900;
  line-height: 1.5;
  padding-inline: .2em;
  display: block;
}

我们有一系列三个动画——缩小渐变的高度、滑动伪元素和增大渐变的高度——因此我们需要在它们之间设置延迟才能将所有内容组合在一起。这就是为什么对于伪元素的滑动,我们有一个等于一个动画持续时间的延迟(transition: .2 .2s),而对于增长部分,延迟等于持续时间的两倍(transition: .2s .4s)。

弹跳效果?为什么不呢?!

让我们尝试另一个奇特的动画,其中高亮矩形变形为一个小圆圈,跳到下一个项目,然后再次变形回矩形!

我不会过多解释这个例子,因为这是你剖析代码的作业!我将提供一些提示,以便您可以解包正在发生的事情。

与之前的效果一样,我们结合了两个动画。对于第一个,我将使用每个菜单项的伪元素,我将调整尺寸和border-radius来模拟变形。对于第二个动画,我将使用ul伪元素创建一个小的圆圈,我将它移动到菜单项之间。

这是另一个版本的演示,颜色不同,过渡速度较慢,以便更好地可视化每个动画:

棘手的部分是跳跃效果,我使用了一个奇怪的cubic-bezier(),但我有一篇详细的文章在我的CSS-Tricks文章“使用cubic-bezier()的先进CSS动画”中解释了这种技术。

结论

我希望您喜欢使用锚点定位功能进行的这个小实验。我们只查看了三个属性/值,但这足以让您准备好使用这项新功能。anchor-name和position-anchor属性是将一个元素(在此上下文中通常称为“目标”元素)链接到另一个元素(在此上下文中我们称为“锚”元素)的强制性部分。从那里,您可以使用anchor()函数来控制位置。

相关:CSS锚点定位指南

以上是使用锚定位的花式菜单导航的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
@KeyFrames vs CSS过渡:有什么区别?@KeyFrames vs CSS过渡:有什么区别?May 14, 2025 am 12:01 AM

@keyframesandCSSTransitionsdifferincomplexity:@keyframesallowsfordetailedanimationsequences,whileCSSTransitionshandlesimplestatechanges.UseCSSTransitionsforhovereffectslikebuttoncolorchanges,and@keyframesforintricateanimationslikerotatingspinners.

使用页面CMS进行静态站点内容管理使用页面CMS进行静态站点内容管理May 13, 2025 am 09:24 AM

我知道,我知道:有大量的内容管理系统选项可用,而我进行了几个测试,但实际上没有一个是一个,y&#039;知道吗?怪异的定价模型,艰难的自定义,有些甚至最终成为整个&

链接HTML中CSS文件的最终指南链接HTML中CSS文件的最终指南May 13, 2025 am 12:02 AM

链接CSS文件到HTML可以通过在HTML的部分使用元素实现。1)使用标签链接本地CSS文件。2)多个CSS文件可通过添加多个标签实现。3)外部CSS文件使用绝对URL链接,如。4)确保正确使用文件路径和CSS文件加载顺序,优化性能可使用CSS预处理器合并文件。

CSS Flexbox与网格:全面评论CSS Flexbox与网格:全面评论May 12, 2025 am 12:01 AM

选择Flexbox还是Grid取决于布局需求:1)Flexbox适用于一维布局,如导航栏;2)Grid适合二维布局,如杂志式布局。两者在项目中可结合使用,提升布局效果。

如何包括CSS文件:方法和最佳实践如何包括CSS文件:方法和最佳实践May 11, 2025 am 12:02 AM

包含CSS文件的最佳方法是使用标签在HTML的部分引入外部CSS文件。1.使用标签引入外部CSS文件,如。2.对于小型调整,可以使用内联CSS,但应谨慎使用。3.大型项目可使用CSS预处理器如Sass或Less,通过@import导入其他CSS文件。4.为了性能,应合并CSS文件并使用CDN,同时使用工具如CSSNano进行压缩。

Flexbox vs Grid:我应该学习两者吗?Flexbox vs Grid:我应该学习两者吗?May 10, 2025 am 12:01 AM

是的,youshouldlearnbothflexboxandgrid.1)flexboxisidealforone-demensional,flexiblelayoutslikenavigationmenus.2)gridexcelstcelsintwo-dimensional,confffferDesignssignssuchasmagagazineLayouts.3)blosebothenHancesSunHanceSlineHancesLayOutflexibilitibilitibilitibilitibilityAnderibilitibilityAndresponScormentilial anderingStruction

轨道力学(或我如何优化CSS KeyFrames动画)轨道力学(或我如何优化CSS KeyFrames动画)May 09, 2025 am 09:57 AM

重构自己的代码看起来是什么样的?约翰·瑞亚(John Rhea)挑选了他写的一个旧的CSS动画,并介绍了优化它的思维过程。

CSS动画:很难创建它们吗?CSS动画:很难创建它们吗?May 09, 2025 am 12:03 AM

CSSanimationsarenotinherentlyhardbutrequirepracticeandunderstandingofCSSpropertiesandtimingfunctions.1)Startwithsimpleanimationslikescalingabuttononhoverusingkeyframes.2)Useeasingfunctionslikecubic-bezierfornaturaleffects,suchasabounceanimation.3)For

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中