CSS & JS Effect – Breadcrumb Navigation 面包屑
介绍
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 面包屑的更多相关文章
- amazeui学习笔记--css(常用组件2)--面包屑导航Breadcrumb
amazeui学习笔记--css(常用组件2)--面包屑导航Breadcrumb 一.总结 1.am-breadcrumb:用am-breadcrumb来声明面包屑导航控件,.am-breadcrum ...
- 一行代码搞定WordPress面包屑导航breadcrumb
有好几位网友在问WordPress面包屑导航breadcrumb怎么操作,网上有些教程是去function文件中定义,其实不用那么复杂,很简单一行代码就能搞定.下面随ytkah一起来看看.如果是单页, ...
- 菜单导航/URHere/面包屑,通过CSS中的content简洁表达代码
比如我们要写一个菜单导航/URHere/面包屑,如: 首页 > 个人中心 > 修改密码 代码: <ul> <li><a href="javascri ...
- 面包屑 CSS
首先祝大家,在新年里,好的.善良的都都马上有. 关于css实现面包屑已经是一个典型例子了.不过今天还是与大家分享一下实现的原理.原理:每一段元素固定宽度并向左浮动,头尾突出部分相对父元素用相对定位固定 ...
- 辛星跟您解析在CSS面包屑中三角形的定位问题
刚才看到有位网友非常纳闷第二个棕色三角形是怎么定位的,我当感觉在以下说不清楚,就特别开了一片博客.来说清楚它.首先,前面的代码我们先抄下来,至于前面这部分代码是怎么来的,读我的用CSS制作面包屑导航的 ...
- yoast breadcrumb面包屑导航修改去掉product
前面我们创建了wordpress添加post_type自定义文章类型和调用自定义post_type文章,现在yoast 面包屑导航出现home >product >分类1,想要把produ ...
- woocommerce面包屑导航breadcrumb的修改
我们知道woocommerce自带了面包屑导航breadcrumb,但有时我们需要调整一下它所在的位置,那么需要如何操作呢?有哪些参数可以调用呢?随ytkah一起来看看吧 首先删除默认的面包屑导航 1 ...
- woocommerce隐藏breadcrumb面包屑导航
woocommerce已经集成比较完善的组件,当然也包含breadcrumb面包屑导航,但是我们如果调整一下breadcrumb的位置要如何操作呢?首先要先把woocommerce隐藏breadcru ...
- react+ant design Breadcrumb面包屑组件
import React from 'react'; import { Link }from 'react-router-dom'; import { Breadcrumb } from 'antd' ...
- Bootstrap <基础十八>面包屑导航(Breadcrumbs)
面包屑导航(Breadcrumbs)是一种基于网站层次信息的显示方式.以博客为例,面包屑导航可以显示发布日期.类别或标签.它们表示当前页面在导航层次结构内的位置. Bootstrap 中的面包屑导航( ...
随机推荐
- 【原创软件】第7期:文件夹生成器V1.0-按照列表批量生成文件夹,简单小巧
一.背景 因为工作需要,需要批量创建文件夹.为了省去人工创建时间,使用aardio制作了一个软件. 二.功能演示 三.下载地址 https://www.123pan.com/s/9Rn9-1xppH ...
- 新一代云原生日志架构 - Loggie的设计与实践
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒.中国工商银行的紧密协作.广泛的生态,使得项目能够基于业务需求不断完善.成熟.目前已经开源:https ...
- Docker PHP容器安装composer
1.进入php容器docker exec -it cb6c1fe83bff(php容器ID) bash2.安装composerphp -r "copy('https://install.ph ...
- WPF控件库
Welcome to CookPopularControl 介绍 CookPopularControl是支持.NetFramework4.6.1与.Net5.0的WPF控件库,其中参考了一些资料,目前 ...
- PyCharm设置背景主题
PyCharm修改主题的路径: File->Settings->Appearance &Behavior->Appearance 1. Intellij:白色 2. Dar ...
- 如何在 Ubuntu18.04 server 服务器版本的操作系统下 配置IP
如题,现有需求,为一个server版本的Ubuntu18.04配置 IP . 在网上查到了 Ubuntu18.04 桌面版本 的配置方法: https://www.cnblogs.com/ ...
- WPF Boolean类型转化器收集 反转转化器
参考链接 https://stackoverflow.com/questions/534575/how-do-i-invert-booleantovisibilityconverter Boolean ...
- impdp/expdp报错: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误
问题现象 Windows服务器导入/导出Oracle 11g数据库出现如下报错提示,输出的日志文件从报错位置往后不再输出. ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误 ...
- Gradle 项目打开自动下载Zip问题及相关配置
原因 : 由于使用Eclipse开发,导入了SpringCloud 工程,SpringCloud 自从哪个版本忘了昂,选择了Gradle 作为工程管理工具,至于为啥,你去问问官方,我的了解是为了支持G ...
- AOP(代理模式)
利用特性Attribute+反射+代理类实现AOP 一.定义自定义特性 /// <summary> /// 自定义特性,方法执行前调用 /// </summary> publi ...