【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第一章 层叠、优先级与继承(已完结)
  • 第二章 相对单位(已完结)
  • 第三章 文档流与盒模型(已完结)
  • 第四章 Flexbox 布局(已完结)
  • 第五章 网格布局(已完结)
  • 【第六章 定位与堆叠上下文】 ✔️
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位 ✔️
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下) ✔️
    • 6.4 堆叠上下文与 z-index (精译中 ⏳)
      • 6.4.1 理解渲染过程与堆叠顺序
      • 6.4.2 用 z-index 控制堆叠顺序
      • 6.4.3 深入理解堆叠上下文

文章目录

      • 6.3.2 创建 CSS 三角形 Creating a CSS triangle

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
上一小节介绍了 CSS 的相对定位在下拉菜单效果中的具体实现,最后还根据作者的描述,补全了相关 JavaScript 逻辑,实现了用 Tab 键循环选中弹出的下拉菜单项。值得一提的是,这部分源代码在第 1 版其实是一个类名为 dropdown-labeldiv 元素(<div class="dropdown-label">Main Menu</div>),并在鼠标悬停时出现下拉菜单。考虑到鼠标 :hover 效果在触屏设备上兼容性较差,且有违最佳实践(通过 JS 切换样式类的方案更稳健),新版才统一换成了一个 button 按钮,并通过点击来实现下拉切换。这种严谨复盘的思考方式值得借鉴。顺着作者的思路,我们再来看看他是怎么实现纯 CSS 的三角形效果的?其间对于页面可访问性又有哪些细节问题需要考虑?一起来看看吧。

6.3.2 创建 CSS 三角形 Creating a CSS triangle

下拉菜单距离完美还差最后一步。虽然已经实现了基本功能,但用户可能没法一眼看出主菜单按钮(即“Main Menu”字样的切换按钮)下方还有隐藏内容。这时就需要给按钮加上一个向下的小箭头,告诉用户在它下方还有更多内容可以浏览。

我们可以通过元素边框的一个小技巧来绘制一个三角形,并以此充当一个向下指的箭头。具体来说,就是利用切换按钮的伪元素 ::after 来绘制三角形,然后设置绝对定位,将它放到按钮的右侧。

大多数情况下,我们给一个元素设置的边框都比较细,通常给个 1px2px 就差不多了;但如果把边框设置为如图 6.6 所示的粗细会怎么样呢?图中对每一侧的边框都设置了具有强烈反差感的颜色,以便区分每条边的边界和起始位置:

图 6.6 带粗边框样式的示例元素

图 6.6 带粗边框样式的示例元素

注意观察四个角上两条边的边缘相接的地方:这里形成了一个对角边(diagonal edge)。此时再观察一下,将元素的宽高缩减到 0 会是什么效果。如图 6.7 所示,所有的边框都汇聚到了一起,并最终在元素正中位置相遇了:

图 6.7 元素宽高为零时,每条边都变成了一个三角形

图 6.7 元素宽高为零时,每条边都变成了一个三角形

此时,元素边框的每一侧都呈三角形:上边框朝下指,右边框向左指,以此类推。基于这样的观察,我们就可以利用其中一条边框作为三角形,然后将其余各边设置为透明来绘制需要的箭头符号。一个元素如果左右边框都透明,只留一个可见的上边框,最终效果则会如图 6.8 所示,形成一个简单的三角形。

图 6.8 利用元素上边框实现的 CSS 三角形效果

图 6.8 利用元素上边框实现的 CSS 三角形效果

按照上述思路给伪元素 .dropdown-toggle::after 设置样式,形成一个 CSS 三角形。然后使用绝对定位将它放置到合适的位置。根据如下样式代码更新页面:

代码清单 6.10 对下拉按钮上的三角形设置绝对定位的样式代码

.dropdown-toggle {padding: 0.5em 2em 0.5em 1.5em;  /* 增加按钮元素的右内边距,为箭头标记预留足够空间 */border: 1px solid #ccc;background-color: #eee;border-radius: 0;
}.dropdown-toggle::after {content: "";/* 将元素放置在切换按钮的右边 */position: absolute;right: 1em;               top: 0.9em;               /* 将上边框做成一个向下指的箭头 */border: 0.3em solid;                            border-color: black transparent transparent;
}.dropdown.is-open .dropdown-toggle::after {top: 0.6em;border-color: transparent transparent black;  /* 下拉菜单打开时,箭头向上指 */
}

上述样式中,伪元素由于没有内容(译注:content: ""),所以也不会渲染宽高;利用 border-color 属性的简写形式,将上边框的颜色设置为黑色,左右两边及下边框的均设为透明,从而构建出一个向下的箭头;元素 .dropdown-toggle 的右边用内边距预留出足够空间,以便放置三角形。最终效果如图 6.9 所示:

图 6.9 带箭头标记的下拉菜单按钮效果

图 6.9 带箭头标记的下拉菜单按钮效果

打开菜单,箭头方向应该反转朝上,表示菜单可以收拢关闭。对 top 属性值做微调(范围约在 0.9em0.6em 左右),让朝上指时的箭头看起来跟向下指时处于同一位置即可。

此外,箭头效果的实现也可以考虑使用图片(image)或背景图(background image),但是短短几行 CSS 代码就能免去不必要的网络请求,何乐而不为呢?当然也可以在 HTML 中嵌入一个轻量的 SVG,但项目中要是没有引入过什么图标集的话,本例介绍的这种只用 CSS 的实现方案会更省心。别看它只是个小小的箭头,像这样轻量小巧又美观的点缀效果,也能实实在在为您的应用与网站增色不少。

这项技术还可以用来构建其他复杂的形状,比如梯形、六边形以及星型。想要查看用 CSS 构建的各种形状,请参阅 CSS-Tricks 网站的专题文章:The Shapes of CSS。请注意,这些形状通常也不是必须要掌握的知识点,尤其是在 SVG 图标盛行的当下。它们只是为了给大家展示 CSS 具备的各种能力。

译注

本节原文最后给出的文章链接在 CSS-Tricks 网站已失效(即 https://css-tricks.com/examples/ShapesOfCSS/),为此官网上很早就有读者反馈该问题,但一直没有公布新的 URL。我学到这里时碰巧搜到了这篇文章,发现是今年 4 月才更新的,有机会给各位转发一下,免得今后又过期了。此外,更新文章链接时还有个意外彩蛋,也一并分享给各位。更新这篇文章的,正是 CSS-Tricks 网站的创始人 Chris Coyier。

此人来头可不小,不仅一手创办并成功运营 CSS-Tricks 长达 15 年之久(2007 年创办,2022 年被知名 IDC 服务商 DigitalOcean 收购),同时也是 CodePen 网站的联合创始人之一。感兴趣的朋友可以去他的 个人网站 凑凑热闹,学习学习这位仍活跃在 CSS 一线的知名大咖是怎么做自我营销的。里面有很多漂亮的设计可供参考,也是个不错的学习园地。Chris Coyier 有句话给我印象很深:

I’m big on the power of writing as a way to think better and improve yourself.

我极为看重写作的力量,那是一种能帮我更好地思考并提升自我的有效途径。(深以为然!)

气氛都烘托到这儿了,怎么也得来张大头贴吧:

Chris Coyier

Chris Coyier 大头贴



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/435790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

计算机视觉领域顶级会议 European Conference on Computer Vision&#xff08;ECCV 2024&#xff09;将于9月29日至10月4日在意大利米兰召开&#xff0c;快手音视频技术部联合清华大学所发表的题为《XPSR: Cross-modal Priors for Diffusion-based Image Super-Resolution》——…

Visual Studio Code下载安装及汉化

官网&#xff1a;https://code.visualstudio.com/ 按照指示一步步操作即可&#xff1a; 汉化&#xff1a;

②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器

EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 &#xff08;接上一章&#xff09; 自由协议通信步骤 &#xff08;以MS-A2-1041为例&#xff09; 接收与…

C++ 3 个有序点的方向(Orientation of 3 ordered points)

给定三个点 p1、p2 和 p3&#xff0c;任务是确定这三个点的方向。 平面中有序三重点的方向可以是 逆时针 顺时针 共线 下图显示了 (a,b,c) 的不同可能方向 如果 (p1, p2, p3) 的方向共线&#xff0c;则 (p3, p2, p1) 的方向也共线。 如果 (p1, p2, p3) 的方向是顺时针&a…

鸿蒙HarmonyOS开发生态

1、官网 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、开发工具IDE下载及使用 https://developer.huawei.com/consumer/cn/ 3、使用帮助文档 4、发布到华为应用商店 文档中心

迈威通信闪耀工博会,以创新科技赋能工业自动化

昨日&#xff0c;在圆满落幕的第24届中国国际工业博览会上&#xff0c;迈威通信作为工业自动化与智慧化领域的先行者&#xff0c;以“创新打造新质通信&#xff0c;赋能工业数字化”为主题精彩亮相&#xff0c;向全球业界展示了我们在工业自动化领域的最新成果与创新技术。此次…

Qt的互斥量用法

目的 互斥量的概念 互斥量是一个可以处于两态之一的变量:解锁和加锁。这样&#xff0c;只需要一个二进制位表示它&#xff0c;不过实际上&#xff0c;常常使用一个整型量&#xff0c;0表示解锁&#xff0c;而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)…

给自己的项目(vue3)中添加 下雪/樱花飘落的背景

查看更佳效果前往我的博客&#xff0c; 可切换 snows_ls BLOGhttp://124.223.41.220/ 0、效果图 樱花飘落 雪花飘落 1、安装 yarn add jparticles / npm i jparticles 2、引入 import { Snow } from jparticles; // 引入粒子效果库 引入雪花效果库 3、使用 在项目中的app.…

Pygame中Sprite实现逃亡游戏4

在《Pygame中Sprite实现逃亡游戏3》中实现了玩家跳跃飞火的效果&#xff0c;接下来通过精灵类的碰撞检测来判断飞火是否击中玩家、飞火是否击中飞龙以及飞龙是否抓住玩家。 1 飞火是否击中玩家的判断 判断飞火是否击中玩家的代码如图1所示。 图1 判断飞火是否击中玩家的代码 …

C++入门基础知识91(实例)——实例16【求两数最小公倍数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于求两数最小公倍数的相关内容&#xff01…

慢病中医药膳养生食疗管理微信小程序、基于微信小程序的慢病中医药膳养生食疗管理系统设计与实现、中医药膳养生食疗管理微信小程序的开发与应用(源码+文档+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

智融-SW6003 双向移动电源IC

描述 ETA6003 是一款具有动态电源路径控制和输入电流限制功能的开关锂离子电池充电器。连接电池后&#xff0c;根据电池电压&#xff0c;DC-DC 开关稳压器会对电池进行预处理、快速充电&#xff0c;或者仅将系统电压 &#xff08;VSYS&#xff09; 调节到预设电压。它不需要外…

加油站智能视频监控预警系统(AI识别烟火打电话抽烟) Python 和 OpenCV 库

加油站作为存储和销售易燃易爆油品的场所&#xff0c;是重大危险源之一&#xff0c;随着科技的不断发展&#xff0c;智能视频监控预警系统在加油站的安全保障方面发挥着日益关键的作用&#xff0c;尤其是其中基于AI的烟火识别、抽烟识别和打电话识别功能&#xff0c;以及其独特…

【mmengine】配置器(config)(进阶)继承与导出,命令行修改配置

一、配置文件的继承 1.1 继承机制概述 新建optimizer_cfg.py: optimizer dict(typeSGD, lr0.02, momentum0.9, weight_decay0.0001)新建runtime_cfg.py: device "cuda" gpu_ids [0, 1] batch_size 64 epochs 100 num_workers 8新建resnet50.py: _base_ […

微服务MongoDB解析部署使用全流程

目录 1、什么是MongoDB 1、非关系型数据库 2、非关系型数据库分类 3、MongoDB&#xff1f;bson格式什么样&#xff1f; 2、MongoDB的优势 3、MongoDB应用场景 4、术语 5、操作 1、安装MongoDB 1、查询镜像文件【不操作】 2、拉取镜像文件 3、创建数据挂载目录 4、启…

MySQL_连接查询

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

C# 利用simd比较两个文件是否相等(高性能)

主要用到两个指令集&#xff0c;CompareEqual指令与MoveMask指令&#xff0c;因为电脑cpu原因&#xff0c;我们采用Avx2。 Avx2.CompareEqual&#xff0c;比较两个Vector256<byte>向量&#xff0c;如果元素相同返回255&#xff0c;否则返回0。 Avx2.MoveMask如果Vector…

前端工程规范-3:CSS规范(Stylelint)

样式规范工具&#xff08;StyleLint&#xff09; Stylelint 是一个灵活且强大的工具&#xff0c;适用于保持 CSS 代码的质量和一致性。结合其他工具&#xff08;如 Prettier 和 ESLint&#xff09;&#xff0c;可以更全面地保障前端代码的整洁性和可维护性。 1、安装 VSCode …

xxl-job--03--分片广播 动态分片

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 xxl-job通过分片广播模式前言1.定义什么是分片广播&#xff1a;即xxl-job调度中心发出一次调度&#xff0c;所有相关节点全部执行一次 采用分片广播调度优点 2.API介…

助农小程序|助农扶贫系统|基于java的助农扶贫系统小程序设计与实现(源码+数据库+文档)

助农扶贫系统小程序 目录 基于java的助农扶贫系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 5.1.1 农户管理 5.1.2 用户管理 5.1.3 订单统计 5.2.1 商品信息管理 5.3.1 商品信息 5.3.2 订单信息 5.3.3 商品评价 5.3.4 商品退货 四、数据库设计 1、…