使用css如何获取最后一行的元素?使用css解决双边框问题

一、项目场景:

在小程序上需要实现一个如下图的ui效果图
需要满足以下条件

  1. 一行放不下 自动换行
  2. 最后一行或者只有一行时,文字底部不能有线
    在这里插入图片描述

二、初版实现

按照上面的要求,最开是的实现代码如下
我是给每一个元素都添加了一个下边框,但是这样的话,在最后一行的时候,会出现边框重合的情况

效果图如下,最后一行放大可发现有重叠部分,颜色加重
在这里插入图片描述

<template><div class="box"><div class="Rp"><div class="h4">Rp</div><div class="herb-box"><div v-for="(item, index) in list" :key="index" class="herb"><div class="name">{{ item.name }}</div><div class="weight">{{ item.weight }}g</div></div></div></div></div>
</template>
<script setup>
import { ref } from 'vue'
const list = ref([{ name: '阿莫西林', weight: 5 },{ name: '阿莫阿莫西林阿莫西林', weight: 8 },{ name: '西林', weight: 10 },{ name: '阿西林', weight: 30 },{ name: '阿到付贵莫西林', weight: 3 },{ name: '时代峰', weight: 10 },{ name: '阿莫西林', weight: 10 },{ name: '发', weight: 5 },{ name: '阿莫西林', weight: 5 }
])
</script>
<style lang="scss" scoped>
.box {padding: 20rpx 32rpx 40rpx 32rpx;.Rp {width: 686rpx;background-color: #f7f8fa;border-radius: 16rpx;border: 2rpx solid #ced6e2;margin-bottom: 32rpx;padding-top: 12rpx;.h4 {font-weight: 600;font-size: 40rpx;color: #7089ab;margin-bottom: 12rpx;margin-left: 24rpx;}.herb-box {display: flex;flex-wrap: wrap;padding: 0 24rpx;.herb {display: flex;align-items: center;padding: 18rpx;padding-left: 0;border-bottom: 2rpx solid #e6e6e6; // 真实的内部元素边框position: relative;.name {margin-right: 8rpx;font-weight: 400;font-size: 28rpx;color: #435675;}.weight {font-weight: 600;font-size: 28rpx;color: #435675;}}}}
}
</style>

三、解决思路:

1.使用css获取最后一行的元素——pase

我只要知道最后一行中有哪几个元素,然后给最后一行的元素设置border-bottom:none就行了
但是 :last-child 只能获取到最后一个元素
:nth-last-child 需要知道一排要有几个元素才行

2.使用伪元素 或者是 一个新的标签定位做遮盖——pase

想法就是使用一个新的元素,模仿背景色,做一个覆盖,感觉上是可行的
但是会造成dom结构的破坏,使用伪元素在真正定位的时候,会出现颜色透传

3.使用ref计算每个元素的宽度,然后动态设置class

这种是可以实现ui图的功能,但是感觉有点大材小用,高射炮打蚊子。
本人是很不喜欢使用js解决css的问题
理由如下:

  • 性能不好
  • 太low 不够优雅
computed: {// 计算哪些元素在最后一行isInLastRow() {const containerWidth = this.$refs.herbBox.offsetWidth; // herb-box 的宽度let currentRowWidth = 0;let lastRowIndex = 0;return (index) => {const herbElement = this.$refs[`herb-${index}`][0]; // 取出当前元素的 DOM 对象const herbWidth = herbElement.offsetWidth;if (currentRowWidth + herbWidth > containerWidth) {currentRowWidth = herbWidth; // 开始新的一行lastRowIndex = index;} else {currentRowWidth += herbWidth;}// 返回 true 表示在最后一行return index >= lastRowIndex;};}
}

4.使用margin+伪元素解决

在偶然的机会查到了双边框的问题,之前倒是知道这个,一直没有遇到过。
这突然遇到了,第一时间没有想起来,真的是太菜了

双边框的问题,可以使用margin:-1px解决
在使用了后,出现了颜色不一致的问题,因为我内部元素的颜色和外部边框的颜色不一样。
应该是显示外部的,但是实际效果是显示的内部元素的边框颜色

解决方法就是加上:after在模拟一个外部边框的颜色

伪元素的优势:

独立控制:伪元素如 :before:after 是独立的虚拟元素,可以完全控制其位置、颜色、大小等属性,而不会影响或与实际的元素边框重叠。
避免重叠:通过定位伪元素,你可以让其覆盖某一部分的实际边框,或者完全避开元素的边框,从而避免颜色不同导致的问题。

假设你有两个相邻的元素,它们的边框颜色不同。你可以使用伪元素来创建一个虚拟的边框,使之看起来像是边框在一起但没有实际重叠。

四、解决方案:

使用第四种方案,css代码如下

<style lang="scss" scoped>
.box {padding: 20rpx 32rpx 40rpx 32rpx;.Rp {width: 686rpx;background-color: #f7f8fa;border-radius: 16rpx;border: 2rpx solid #ced6e2;margin-bottom: 32rpx;padding-top: 12rpx;.h4 {font-weight: 600;font-size: 40rpx;color: #7089ab;margin-bottom: 12rpx;margin-left: 24rpx;}.herb-box {display: flex;flex-wrap: wrap;padding: 0 24rpx;.herb {display: flex;align-items: center;padding: 18rpx;padding-left: 0;border-bottom: 2rpx solid #e6e6e6; // 真实的内部元素边框position: relative;margin-bottom: -1px; // 隐藏重叠的边框&::after {// 使用伪元素是为了解决,两个边框颜色不一致,在使用 margin-bottom: -1px 时,显示的颜色为设置为-1的值,应该显示为外部的边框颜色content: '';position: absolute;left: 0;right: 0;bottom: -1rpx;height: 2rpx;background-color: #ced6e2; // 与外层的 .Rp 边框颜色一致z-index: 1; //  确保伪元素位于 .herb 的边框之上}.name {margin-right: 8rpx;font-weight: 400;font-size: 28rpx;color: #435675;}.weight {font-weight: 600;font-size: 28rpx;color: #435675;}}}}
}
</style>

最后的效果
在这里插入图片描述

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

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

相关文章

测量 Redis 服务器的固有延迟

redis-cli --intrinsic-latency redis-cli --intrinsic-latency 命令用于测量 Redis 服务器的固有延迟。 固有延迟指的是 Redis 服务器处理一个命令所需的最短时间&#xff0c;不包括网络延迟。通过这个测量&#xff0c;我们可以了解 Redis 服务器本身的性能&#xff0c;而不…

[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

目录 1.mari和shiny1.题目链接2.算法原理详解 && 代码实现 2.重排字符串1.题目链接2.算法原理详解 && 代码实现 1.mari和shiny 1.题目链接 mari和shiny 2.算法原理详解 && 代码实现 自己的版本&#xff1a;三层循环暴力枚举 --> 超时 --> 40% …

ssrf漏洞复现

一、环境搭建 这里选用的平台是pikachu 地址&#xff1a;GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台 可能遇到的问题——MySQL连接问题 mysql> ALTER USER root IDENTIFIED WITH mysql_native_password BY root; Query OK, 0 rows affect…

《黑神话:悟空》的AI技术解析:游戏智能的新境界

2024 年 8 月的第三周&#xff0c;哪哪都是悟空的声音&#xff0c;让我一度想起当年国足打进世界杯&#xff0c;学校不上课组织看球的场景。 从我个人情感而言&#xff0c;《黑神话&#xff1a;悟空》带来的震撼&#xff0c;惊喜和冲击不亚于当年国足在世界杯赛场上跟巴西踢球。…

SSRF实验

SSRF实验 SSRF概述实验测试结果 SSRF概述 SSRF服务端请求伪造&#xff0c;是因为网页提供的参数可以获取其他资源&#xff0c;接受网址在本地解析&#xff0c;来获取服务器本身的资源&#xff0c;但解析没过滤导致出现的问题 主要有几个方面的方法 dict 协议是一个在线网络字…

Ubuntu 22.04中解决Could not load the Qt platform plugin “xcb“问题解决方法

摘要&#xff1a;在Ubuntu 22.04中安装OpenCV后&#xff0c;遇到“load the Qt platform plugin “xcb” in site-packages/cv2/qt/plugins" even though it was found. 的问题&#xff0c;导致程序无法启动。本文详细探讨了该问题的成因&#xff0c;并介绍了几种常见但无…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

一、功能需求 功能需求是在Android10以上设备上实现蓝牙音乐功能&#xff0c;细分为两个功能点&#xff1a; 1、手机和车载设备实现蓝牙连接 &#xff08;本Demo文只做监听蓝牙连接状态&#xff0c;需手动到设置中连接蓝牙&#xff09; 2、连接蓝牙成功后手机播放音乐时车载…

vscode修改选中文字颜色及当前tab颜色

VSCode-》首选项-》设置->-》搜color&#xff0c;找到&#xff1a;Workbench&#xff1a;Color Customizations&#xff0c;点击&#xff1a;在 settings.json 中编辑 加上 选中的文字内容的 配置 "workbench.colorCustomizations": {//设置用户选中代码段的颜色&…

前端——盒子模型

一个盒子的特点组成 外边距就是两个元素之前的距离 padding就是填充区的大小 从上开始 顺时针进行设置&#xff0c;没有则对称 也可以单独对某个方向进行设定&#xff0c;比如&#xff1a;padding-top border 边框区 符合属性 border-style 边框样式 border-color 边框颜色…

Flink常见数据源(source)使用教程(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Ps:首选项 - 常规

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“常规” General选项卡主要用于调整 Photoshop 的整体工作行为和用户体验。这些设置让用户可以根据个人习惯和工作流程定制软件的响应方式和界面布局&#xff0c;从而提高工作…

读软件开发安全之道:概念、设计与实施08密码学(下)

1. 对称加密 1.1. symmetric encryption 1.2. 使用各方共享的密钥来隐藏数据 1.2.1. 对称加密在本质上依赖共享密钥 1.3. 所有加密都是通过对明文进行转换&#xff0c;把明文消息&#xff08;或者原始消息&#xff09;变成无法识别的形式&#xff08;也称为密文&#xff09…

Linux 下命令行参数和环境变量

Linux 下命令行参数和环境变量 命令行参数为什么要有命令行参数谁可以做到结论 环境变量一些现象查看环境变量添加环境变量添加内存级环境变量永久有效 其他环境变量HOMEPWDSHELLHISTSIZE 自定义环境变量定义取消 本地变量整体理解环境变量环境变量的组织方式Linux 代码获取环境…

32 增加系统调用(1)

系统调用在 数据手册中的描述 这是在 GDT 中的描述符 这个系统调用 segment selector 指向的时 内核的代码段。因为系统调用需要的权限比较高。 offset 指的时 在内核代码中的具体的函数的地址。

深入浅出消息队列----【Broker 集群】

深入浅出消息队列----【Broker 集群】 单 master多 master多 master 多 slave 异步复制多 master 多 slave 同步复制Dledger 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 Brok…

ssrf攻击fastcgi复现

文章目录 环境搭建使用网页查看开始攻击 环境搭建 在/usr/local/nginx/html下新建一个php文件 phpinfo.php 1.php <?php highlight_file(__FILE__); $url $_GET[url]; $curl curl_init($url); curl_setopt($curl, CURLOPT_HEADER, 0); $responseText curl_exec($curl)…

Neo4J下载安装

Windows 版本 1、 下载链接安装JDK 下载链接 https://download.oracle.com/java/22/latest/jdk-22_windows-x64_bin.msi 下载完毕后默认安装即可 2、 下载Neo4J 进入Neo4j Deployment Center - Graph Database & Analytics下载页面&#xff0c;选择社区版&#xff0c;…

QT Quick QML 实例之定制 TableView

QT Quick QML 实例之定制 TableView 一、演示二、C关键步骤1. beginInsertRows()&#xff08;用户插入行&#xff09;2. roleNames() &#xff08;表格中列映射&#xff09;3. data() &#xff08;用户获取数据&#xff09;4. headerData() &#xff08;表头&#xff09;5. fla…

依靠 VPN 生存——探索 VPN 后利用技术

执行摘要 在这篇博文中,Akamai 研究人员强调了被忽视的 VPN 后利用威胁;也就是说,我们讨论了威胁行为者在入侵 VPN 服务器后可以用来进一步升级入侵的技术。 我们的发现包括影响 Ivanti Connect Secure 和 FortiGate VPN 的几个漏洞。 除了漏洞之外,我们还详细介绍了一组…