介绍

Breadcrumb 长这样

主要就是让用户清楚自己在哪个 page, 然后可以轻松返回上一页.

Step by Step

HTML

<div class="container">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/tourist-attractions">Tourist Attractions</a></li>
<li><span>A 2-Starex JB Day Trip!</span></li>
</ol>
</div>

Semantic HTML 一般上会用 ol > li 的方式表达 Breadcrumb

效果

红框是 container 之后会用来限制 width, 现在不重要.

li 是 block element 所以它是一行一行的. 这不是我们要的.

Simple Styling

ol {
// reset CSS
list-style: none;
a {
text-decoration: inherit;
color: inherit;
} display: flex;
}

reset 游览器默认样式, 添加 flex

效果

有个形了. 现在做 seperator

Seperator

有 2 种做法, 第一种是用 HTML, 一种是用 CSS

HTML 方式

添加 seperator 进 HTML

<ol>
<li><a href="/">Home</a></li>
<li><span class="separator"> / </span></li>
<li><a href="/tourist-attractions">Tourist Attractions</a></li>
<li><span class="separator"> / </span></li>
<li><span>A 2-Starex JB Day Trip!</span></li>
</ol>

然后 styling

.separator {
display: inline;
margin-inline: 1rem;
}

效果

CSS 方式

li:not(:first-child) {
::before {
content: '/';
display: inline-block;
margin-inline: 1rem;
}
}

在 li 添加 ::before 做出 seperator

2 种方法的区别

HTML 方式比较麻烦, 还要写 HTML, 而且多了一个 seperator 结构好像怪怪的.

CSS 方式的缺点是在 container 小的时候, 效果会和 HTML 方式差很多. 需要特别处理.

当 container 小的时候, 体验一

CSS 方式虽然简单, 但在 container 小的时候, 其效果和 HTML 方式是不一样的. .

 

明显, CSS 方式好像跑位了. 原因是 flex container 小的时候, li 会被缩小.

HTML 方式中 seperator 和 anchor 是独立的 li, 而 CSS 方式中 seperator 和 anchor 却在同一个 li 里面, 所以就出现了上面这种结果.

要解决它不是很容易, 需要把 seperator 做成 absolute 定位, 然后 left + translateX 把它移出去, 同时空间需要有 ol gap 负责

ol {
display: flex;
gap: 2rem; // 由 ol 负责空间
li {
position: relative;
&:not(:first-child) {
::before {
content: '/';
display: inline-block;
position: absolute;
left: -1rem;
transform: translateX(-50%);
}
}
}
}

效果

如果要 vertical 居中也是同样的操作, 靠定位, 对比, HTML 方式就简单的多, 直接用 flex align-items: center 就可以了.

即便如此, 它们还是有一点点的不同,

HTML 方式的 seperator 是 flex-item 它也会被缩小.

而 CSS 方式中, seperator 依赖 ol 的 gap 做完 spacing, gap 是不会缩小的.

补上一个加强版

HTML

<div class="container">
<h1>Title</h1>
<ol>
<li><span>Home</span></li>
<li><span>Category Name</span></li>
<li><span>Product Name Lorem Lorem, ipsum.</span></li>
</ol>
</div>

CSS

.container {
@mixin ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
@mixin clear-ellipsis {
white-space: unset;
overflow: unset;
text-overflow: unset;
} padding-inline: 16px;
display: flex;
flex-direction: column;
gap: 8px;
text-align: center;
max-width: 100%; ol {
list-style: none;
display: flex;
align-items: center;
--gap: 16px;
gap: var(--gap); > :not(:last-child) {
flex-shrink: 0;
}
li {
&:not(:first-child) {
display: flex;
align-items: center;
gap: var(--gap);
&::before {
content: '/';
}
}
overflow: hidden;
span {
@include ellipsis;
}
&.opened span {
@include clear-ellipsis;
}
}
}
}

JS

document
.querySelectorAll('li')
.forEach(li => li.addEventListener('click', () => li.classList.add('opened')));

当 container 小的时候, 体验二

上面的体验是 flex shrink. 每一个 li 都变小, 然后字往下掉. 还有另一种方式可能更好, 那就是用 wrap

在 ol 加上 flex-wrap: wrap; 就可以了

HTML 方式效果:

CSS 方式效果 (不需要搞定位了)

CSS 方式中, 由于 seperator 在 li 里面, 所以 li 掉下去的一定是完整的 seperator 和 anchor 一定是一起掉的.

HTML 方式则不太一样.

总结

不管是体验一还是二, HTML 方式还是 CSS 方式都各有优缺点.

关键是理解 Flex, 为什么出来的效果是那样, 然后再想你要怎样的体验和怎样的管理.

我个人会选体验二, 用 CSS 方式实现.

ol {
// reset CSS
list-style: none;
a {
text-decoration: inherit;
color: inherit;
}
li {
&:not(:first-child) {
&::before {
content: '/';
display: inline-block;
margin-right: 1rem;
}
}
&:not(:last-child) {
margin-right: 1rem;
}
} line-height: 1.5;
display: flex;
flex-wrap: wrap;
}

效果

注: 我把第二行前面的空格给弄掉了. 这样比较好看. 做法是修改了 margin 的操作, 一半由前面 li 负责, 后一半则由后面的 li 负责.

CSS & JS Effect – Breadcrumb Navigation 面包屑的更多相关文章

  1. amazeui学习笔记--css(常用组件2)--面包屑导航Breadcrumb

    amazeui学习笔记--css(常用组件2)--面包屑导航Breadcrumb 一.总结 1.am-breadcrumb:用am-breadcrumb来声明面包屑导航控件,.am-breadcrum ...

  2. 一行代码搞定WordPress面包屑导航breadcrumb

    有好几位网友在问WordPress面包屑导航breadcrumb怎么操作,网上有些教程是去function文件中定义,其实不用那么复杂,很简单一行代码就能搞定.下面随ytkah一起来看看.如果是单页, ...

  3. 菜单导航/URHere/面包屑,通过CSS中的content简洁表达代码

    比如我们要写一个菜单导航/URHere/面包屑,如: 首页 > 个人中心 > 修改密码 代码: <ul> <li><a href="javascri ...

  4. 面包屑 CSS

    首先祝大家,在新年里,好的.善良的都都马上有. 关于css实现面包屑已经是一个典型例子了.不过今天还是与大家分享一下实现的原理.原理:每一段元素固定宽度并向左浮动,头尾突出部分相对父元素用相对定位固定 ...

  5. 辛星跟您解析在CSS面包屑中三角形的定位问题

    刚才看到有位网友非常纳闷第二个棕色三角形是怎么定位的,我当感觉在以下说不清楚,就特别开了一片博客.来说清楚它.首先,前面的代码我们先抄下来,至于前面这部分代码是怎么来的,读我的用CSS制作面包屑导航的 ...

  6. yoast breadcrumb面包屑导航修改去掉product

    前面我们创建了wordpress添加post_type自定义文章类型和调用自定义post_type文章,现在yoast 面包屑导航出现home >product >分类1,想要把produ ...

  7. woocommerce面包屑导航breadcrumb的修改

    我们知道woocommerce自带了面包屑导航breadcrumb,但有时我们需要调整一下它所在的位置,那么需要如何操作呢?有哪些参数可以调用呢?随ytkah一起来看看吧 首先删除默认的面包屑导航 1 ...

  8. woocommerce隐藏breadcrumb面包屑导航

    woocommerce已经集成比较完善的组件,当然也包含breadcrumb面包屑导航,但是我们如果调整一下breadcrumb的位置要如何操作呢?首先要先把woocommerce隐藏breadcru ...

  9. react+ant design Breadcrumb面包屑组件

    import React from 'react'; import { Link }from 'react-router-dom'; import { Breadcrumb } from 'antd' ...

  10. Bootstrap <基础十八>面包屑导航(Breadcrumbs)

    面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...

随机推荐

  1. 当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?

    举一些场景: 一.比如实现一个简单的日志收集功能或发送大量短信.邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情. 直接使用 Redis 的 lpush,rpo ...

  2. Masked Popcount 题解

    背景 罚了一发,太菜了.为什么我终于有时间的时候她要考试? 题意 给你 \(n,m\),问 \(\sum_{i=0}^{n}popcount(i \&m)\). 其中 \(\&\) 代 ...

  3. Django 实现文件上传下载API

    Django 实现文件上传下载API by:授客 QQ:1033553122 欢迎加入全国软件测试交流QQ群7156436 开发环境   Win 10   Python 3.5.4   Django- ...

  4. 使用后台模板,cnpm install报错

  5. GeoScene Enterprise 3.1 临时许可更新

    Portal许可更新 portal 的许可更新很简单,直接打开Portal在线更新就好了 平台管理 -> 许可管理 -> 附加许可 -> 导入许可 -> 选择文件(选择授权的j ...

  6. 【Java】PDF模板生成PDF文档

    一.需求背景 客户要求一份文书,文书内容有一些表单项,例如: 1.基本的是和否 (单选框或复选框) 2.备注内容(纯文本信息) 3.单位,机构组织,人员,字典项(下拉选择) 4.用户数字签名(图片信息 ...

  7. 【Vue】NPM构建的一些问题解决

    9418端口已经不再支持未授权的GIT协议 C:\Users\Administrator\Desktop\wss-taskcore-web>npm install npm ERR! Error ...

  8. 【Java】JNDI实现

    前提情要: 培训的时候都没讲过,也是书上看到过这么个东西,进公司干外包的第二个项目就用了这个鬼东西 自学也不是没尝试过实现,结果各种失败,还找不到问题所在,索性不写了 JNDI实现参考: 目前参考这篇 ...

  9. 2024年 智能机器人元年 —— 国内的智能机器人(humanoid)公司当下最大的压力(最为急迫的任务)是什么?

    可以说,2024年是人形机器人的元年.我国在去年年底将发展智能机器人立为了第一线的重要科技发展方向,并计划在2024年.2025年建立出完整的产业链条,并培育出几家成熟的行业领先的智能机器人公司.而我 ...

  10. 两个 RTX2070 super 显卡 可不可以通过 nvlink交换机 进行P2P通信 呢? (答案: 可以)

    以前转载了一篇文章:    https://www.cnblogs.com/devilmaycry812839668/p/12370685.html 对于里面的结果总感觉有所怀疑,于是斥巨资购入两个 ...