构建面包屑导航组件

构建面包屑导航组件

本课程简要介绍了如何构建响应式且易于访问的面包屑导航组件,以便用户浏览您的网站。

Adam Argyle

在本文中,我想分享一下构建面包屑导航组件的方法。试用演示版。

演示

如果您更喜欢视频,请观看此帖子的 YouTube 版本:

概览

面包屑导航组件会显示用户在网站层次结构中的位置。这个名称源自《汉泽尔和格雷特》的故事:汉泽尔和格雷特在黑暗的树林中行走时,在后面撒下面包屑,然后沿着面包屑的方向回到了家。

本文中的面包屑导航不是标准面包屑导航,而是类似于面包屑导航。它们通过使用

链接和一些选项并无特别之处,但可以为简单的面包屑导航添加更多功能。向 元素堆叠在一起。

.crumbicon {

--crumbicon-size: 3ch;

display: grid;

grid: [stack] var(--crumbicon-size) / [stack] var(--crumbicon-size);

place-items: center;

& > * {

grid-area: stack;

}

}

元素的外观,同时保留内置功能。

.disguised-select {

inline-size: 100%;

block-size: 100%;

opacity: .01;

font-size: min(100%, 16px); /* Defaults to 16px; fixes iOS zoom */

}

注意 :请尝试在移动设备上使用此图标组件!

溢出

面包屑导航应能够表示非常长的路径。我喜欢在适当情况下允许内容水平超出屏幕,并且我认为此面包屑导航组件非常适合。

.breadcrumbs {

overflow-x: auto;

overscroll-behavior-x: contain;

scroll-snap-type: x proximity;

scroll-padding-inline: calc(var(--nav-gap) / 2);

& > .crumb:last-of-type {

scroll-snap-align: end;

}

@supports (-webkit-hyphens:none) { & {

scroll-snap-type: none;

}}

}

溢出样式会设置以下用户体验:

带有滚动回弹限制的横向滚动。

水平滚动内边距。

最后一个面包屑上的一处贴靠点。这意味着,在页面加载时,第一个面包屑会以固定的形式加载并显示在视野中。

从 Safari 中移除了贴靠点,因为它会与水平滚动和贴靠效果组合时出现问题。

媒体查询

针对较小的视口做出的一个细微调整是隐藏“首页”标签,只留下图标:

@media (width <= 480px) {

.breadcrumbs .home-label {

display: none;

}

}

无障碍

动画

此组件中的动作并不多,但通过将转场效果封装在 prefers-reduced-motion 检查中,我们可以防止不必要的动作。

@media (prefers-reduced-motion: no-preference) {

.crumbicon {

transition: box-shadow .2s ease;

}

}

无需更改任何其他样式,即使没有 transition,悬停和聚焦效果也非常出色且有意义,但如果可以使用动画,我们会为互动添加细微的转换效果。

JavaScript

首先,无论您在网站或应用中使用哪种路由器,当用户更改面包屑导航时,都需要更新网址并向用户显示相应的页面。其次,为了规范用户体验,请确保在用户仅浏览 更改事件触发防范。

由于使用了 更改事件

const crumbs = document.querySelectorAll('.breadcrumbs select')

const allowedKeys = new Set(['Tab', 'Enter', ' '])

const preventedKeys = new Set(['ArrowUp', 'ArrowDown'])

// watch crumbs for changes,

// ensures it's a full value change, not a user exploring options via keyboard

crumbs.forEach(nav => {

let ignoreChange = false

nav.addEventListener('change', e => {

if (ignoreChange) return

// it's actually changed!

})

nav.addEventListener('keydown', ({ key }) => {

if (preventedKeys.has(key))

ignoreChange = true

else if (allowedKeys.has(key))

ignoreChange = false

})

})

实现此策略的方法是,监控每个 元素的事件触发时决定是等待还是继续。

总结

现在您已经知道我是如何解决的,您会怎么做?

🙂?

让我们多元化我们的方法,了解在 Web 上构建的所有方式。

制作一个演示版,在推特上向我发送链接,我会将其添加到下方的社区混剪部分!

社区混剪作品

将 Tux Solbakk 用作 Web 组件:演示和代码

相关推荐

让人食欲暴增的椒盐虾姑,是这样做的,手把手教会你做椒盐虾姑
传奇世界42去哪升级
365bet网址搜索器

传奇世界42去哪升级

📅 01-10 👁️ 4250
世界杯经典:1982年世界杯决赛意大利3-1联邦德国
零基础学习python,最快多长时间学完?python零基础需要学多久
365bet在线体育投注网

零基础学习python,最快多长时间学完?python零基础需要学多久

📅 07-20 👁️ 7646
ipad设置语言改成中文 如何在iPad上设置中文语言
365bet网址搜索器

ipad设置语言改成中文 如何在iPad上设置中文语言

📅 09-11 👁️ 4412
BA是什么岗位?不是文员,不是助理,而是企业真正的解题高手