介绍

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. 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?

    1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...

  2. yolov5 损失函数代码详解

    前言 模型的损失计算包括3个方面,分别是: 定位损失 分类损失 置信度损失 损失的计算公式如下: 损失计算的代码流程也是按照这三大块来计算的.本篇主要讲解yolov5中损失计算的实现,包括损失的逻辑实 ...

  3. SQL Server 验证某栏位是否存在某字符串(CHARINDEX)

    SELECT * FROM LiuJun_PKqitchqi WHERE CHARINDEX('230527Z3258',qr_code) > 0

  4. [oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit

    退出终端_重启游乐场_shell_quit Python 回忆 上次 了解了 python 进入了 python 游乐场   在游乐场 可以做 简单的计算 还可以做 乘方运算   数字特别大之后 游乐 ...

  5. oeasy 教您玩转linux 010303文件管理器 nautilus

    我们来回顾一下 上一部分我们都讲了什么? 讲了火狐 火狐的位置 用命令行打开多个网址 火狐的升级 火狐桌面建立快捷方式 我们可以知道桌面快捷方式文件的名称么? 从文件管理器到命令行 按住文件 拖动到t ...

  6. TIER 0: Dancing

    TIER 0: Dancing SMB Server Message Block 是一种网络协议,用于在计算机网络上共享文件.打印机和其他资源.它最初由微软开发,用于在 Windows 操作系统之间进 ...

  7. Django 跨域访问POST请求需预先发送option请求问题处理方案

    跨域访问POST请求需预先发送option请求问题处理方案   By:授客 QQ:103355122 实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下 ...

  8. CF1956B Nene and the Card Game 题解

    Nene and the Card Game 题意 有 \(2n\) 张牌,\(1,2,3,\dots,n\) 皆有两张. 有两个人在玩游戏,每个人有 \(n\) 张卡片,当一人出了一张编号为 \(k ...

  9. c++ 中遇到的语法问题

    在头文件中给函数赋值 如这样: func(int a,int b = 1); 在.cpp文件中不能同时这样写,否则会报错,只能这样写func(int a,int b ),所以从其他地方移植的代码需要注 ...

  10. 【Spring-Security】Re13 Oauth2协议P3 整合JWT

    视频地址: https://www.bilibili.com/video/BV12D4y1U7D8?p=44 有用到Redis存储JWT,头疼每次找Windows版的 https://github.c ...