8种方案解决移动端1px边框的问题

🧑‍💻 写在开头
点赞 + 收藏 === 学会🤣🤣🤣

8 种方案解决移动端1px边框的问题

造成边框变粗的原因

css中的1px并不等于移动设备的1px,这是由不同手机由不同像素密度,在window对象中有一个devicePixelRatio属性,他可以反应css中像素与设备的像素比
devicePixelRatio 的官方给的定义为: 设备物理像素和设备独立像素的比例,也就是devicePixelRatio = 物理像素 / 独立像素。

解决边框变粗的6种办法

总结:

  • 根据判断像素比大于等于2时,

1、0.5px边框

if(window.devicePixelRatio && devicePixelRatio>=2){var testElem = document.createElement('div')testElem.style.border = '.5px solid transparent'document.body.appendChild(testElem)if(testElem.offsetHeight ==1){document.querySelector('html').classList.add('hairlines')}document.body.removeChild(testElem);
}
// 脚本放在内联,如果里面运行 需要包装$(document).ready(function(){})
div{border: 1px solid #bbb
}
.hairlines div {border-width: 0.5px;
}

2、使用border-image实现

准备一张符合要求的border-image

底部边框

.border-bottom-1px{border-width: 0 0 1px 0 ;border-image: url(linenew.png) 0 0 2 0 stretch;-webkit-border-image: url(linenew.png) 0 0 2 0 stretch;
}

把border设置在底部,图片2px高,上面1px颜色透明,下面1px使用规定的border颜色

3、使用background-image实现

和border-image实现类似,需要事先准备好图片

.backround-image-1px{background: url(../img/line.png) repeat-x left bottom;-wibkit-background-size:100% 1px;background-size:100% 1px;
}

缺点:

  • 修改颜色麻烦,需要替换图片
  • 圆角需要特别处理,边缘会模糊

4、利用多背景渐变实现

与background-image类似,把图片改成渐变的背景,一半设置颜色,一半设置透明

.background-gradient-1px{background:line-gradient(180deg, black,black 50%, transparent 50%) top left / 100% 1px no-repeat;line-gradient(90deg, black,black 50%, transparent 50%) top right / 1px 100% no-repeat;line-gradient(0, black,black 50%, transparent 50%) bottom right /  100% 1px no-repeat;line-gradient(-90deg, black,black 50%, transparent 50%) bottom left / 1px 100% no-repeat;
}
/*或者*/
.background-gradient-1px{background: -webkit-gradient(linear,left top, left bottom, color-step(.5,transparent),color-step(.5,#c8c7cc), to(#c8c7cc)) left bottom repeat-x;background-size: 100% 1px;
}

5、利用box-shadow模拟边框

css阴影的方式处理

.box-shadow-1px{box-shadow: inset 0px -1px 1px -1px #c8c7cc
}

6、viewport + rem 实现

同时通过设置对应的viewport的rem基准值, 解决了1像素bug

这种方式比较完美,对老版本的修改不友好

优点:所有场景都能满足,一套代码,可以兼容所有布局

缺点:老项目修改代价过大
在这里插入图片描述

// 在devicePixlRatio = 1 时, 输出viewport
<mate name="viewport" content="initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no">// 在devicePixlRatio = 2 时, 输出viewport
<mate name="viewport" content="initial-scale=0.5,maximum-scale=0.5,minimum-scale=0.5,user-scalable=no">// 在devicePixlRatio = 3 时, 输出viewport
<mate name="viewport" content="initial-scale=0.333333,maximum-scale=0.333333,minimum-scale=0.333333,user-scalable=no">
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><metaname="viewport"content="width=device-width,initial-scale=1,user-scalable=no"/><title>rem+viewport适配</title><style type="text/css">* {margin: 0;padding: 0;}#box {width: 8rem;height: 8rem;border: 1px solid #000;}</style></head><body><div id="box"></div></body><script type="text/javascript">//获取dprvar dpr = window.devicePixelRatio; // 2console.log(dpr, 'dpr+++');//比例              // 0.5var scale = 1 / dpr;var width = document.documentElement.clientWidth; //375//3.通过dpr让元素进行缩放,initial-scale=0.5var metaNode = document.querySelector('meta[name="viewport"]');metaNode.setAttribute('content','width=device-width,initial-scale=' + scale + ',user-scalable=no');var width = document.documentElement.clientWidth; //750//4.布局元素 单位 rem ,反向把缩放比例乘回来  2var styleN = document.createElement('style');styleN.innerHTML = 'html{font-size: ' + width / 16 + 'px !important;}';document.head.appendChild(styleN);</script>
</html>

7、使用伪类+transform实现

对于老项目,这种方案比较完美, 原理是把原来的所有边框去掉,通过伪类崇左border,并且transform的scale缩小一半,原先的单挑border样式设置

.scale-1px{position:relative;border:none;
}
.scale-1px:after{content: '';position:absolute;bottom:0;background: #000;width:100%;height:1px;transform:scale(0.5);transform-origin: 0 0;
}.scale-1px-top {/* border-bottom: 1px solid rgb(229, 229, 229); *//* box-shadow: inset 0px -1px 1px -1px #c8c7cc; */border:none;position:relative;
}
.scale-1px-top:before{content: '';position: absolute;display:block;top: 0;left: 0;width: 200%;height: 1px;border-top: 1px solid #E7E7E7;-webkit-transform: scale(0.5,0.5);transform: scale(0.5,0.5);-webkit-transform-origin: 0 0;transform-origin: 0 0;
}.scale-1px-bottom {/* border-bottom: 1px solid rgb(229, 229, 229); *//* box-shadow: inset 0px -1px 1px -1px #c8c7cc; */border:none;position:relative;
}
.scale-1px-bottom:before{content: '';position: absolute;display:block;bottom: -1px;left: 0;width: 200%;height: 1px;border-bottom: 1px solid #ccc;-webkit-transform: scale(0.5,0.5);transform: scale(0.5,0.5);-webkit-transform-origin: 0 0;transform-origin: 0 0;
}.borderRadius-1px {/* border-bottom: 1px solid rgb(229, 229, 229); *//* 圆角(伪类和本体类都需要加border-radius) */border-radius:.16rem;border:none;position:relative;
}
.borderRadius-1px:after{/* 圆角(伪类和本体类都需要加border-radius) */content: '';position: absolute;top: 0;left: 0;border: 1px solid #d1d1d1;-webkit-box-sizing: border-box;box-sizing: border-box;width: 200%;height: 200%;-webkit-transform: scale(0.5);transform: scale(0.5);-webkit-transform-origin: left top;transform-origin: left top;border-radius:.16rem;
}

8 、svg

<svg width=100% height=1   style="position: absolute;bottom: 0;left: 0;"><line x1="0" y1="0" x2="1000" y2="0" style="stroke:#E5E5E5;stroke-width:1" />
</svg>

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段&#xff1a; …

压测工具---Ultron

压测工具&#xff1a;Ultron 类型&#xff1a;接口级和全链路 接口级 对于接口级别的压测我们可以进行 http接口压测、thrift压测、redis压测、kafka压测、DDMQ压测、MySQL压测等&#xff0c;选对对应的业务线、选择好压测执行的时间和轮数就可以执行压测操作了 全链路 对…

SAP PS学习笔记01 - PS概述,创建Project和WBS

本章开始学习PS&#xff08;Project System&#xff09;。 1&#xff0c;PS的概述 PS&#xff08;Project System&#xff09;是SAP企业资源规划系统中的一个关键模块&#xff0c;主要用于项目管理。 它提供了一个全面的框架来规划、控制和执行项目&#xff0c;涵盖了从项目启…

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向

阿秒光脉冲&#xff08;阿秒脉冲&#xff09;持续时间在阿秒量级 科学研究是其目前主要应用方向 阿秒光脉冲简称阿秒脉冲&#xff0c;由超级短暂的激光脉冲构成&#xff0c;单个脉冲的持续时间仅为百万亿分之一秒&#xff08;10-18秒&#xff09;。   根据新思界产业研究中心…

【JavaWeb程序设计】JSP内置对象

目录 一、通过测试以下代码&#xff0c;了解各种隐含对象与作用域变量的使用 1. request隐含对象的使用&#xff08;request.jsp&#xff09; 2. out隐含对象的使用&#xff08;out.jsp&#xff09; 3. application隐含对象的使用&#xff08;application.jsp&#xff09; …

MySQL数据库树状结构查询

一、树状结构 MySQL数据库本身并不直接支持树状结构的存储&#xff0c;但它提供了足够的灵活性&#xff0c;允许我们通过不同的方法来模拟和实现树状数据结构。具体方法看下文。 数据库表结构&#xff1a; 实现效果 查询的结果像树一样 二、使用 以Catalog数据表&#xff0c…

Vite: 近几个版本的更新

概述 在 2021 年 2 月&#xff0c;尤大正式推出了 Vite 2.0 版本&#xff0c;可以说是 Vite 的一个重要转折点&#xff0c;自此之后 Vite 的用户量发生了非常迅速的增长&#xff0c;很快达到了每周 100 万的 npm 下载量。同时&#xff0c;Vite 的社区也越来越活跃&#xff0c;…

HTTP协议格式

目录 正文&#xff1a; 1.概述 2.主要特点 3.请求协议格式 4.响应协议格式 5.响应状态码 总结&#xff1a; 正文&#xff1a; 1.概述 HTTP 协议是用于传输超文本数据&#xff08;如 HTML&#xff09;的应用层协议&#xff0c;它建立在传输层协议 TCP/IP 之上。当我们在…

stm32定时器与pwm波

文章目录 4 TIM4.1 SysTick系统定时器4.2 TIM定时器中断与微秒级延时4.3 TIM使用PWM波4.3.1 PWM介绍4.3.2 无源蜂鸣器实现 4.4 TIM ,PWM常用函数 4 TIM 4.1 SysTick系统定时器 ​ Systick系统滴答&#xff0c;&#xff08;同时他有属于自己的中断&#xff0c;可以利用它来做看…

Unity 使用AVProMovieCapture实现Game视图屏幕录制

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 使用AVProMovieCapture实现Game视图屏幕录制 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心…

【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题

文章目录 1.环境背景2. 需求背景3. 解决方法3.1 在mac的终端查看虚拟机NAT网络3.2 查看unbuntu节点2的网络配置3.3 问题定位与解决3.3.1 检查是否有冲突3.3.2 冲突解决方法 4. 总结4.1 NAT 网关的原理4.2 VMware Fusion 的 NAT 模式4.3 为什么网关冲突会引起问题4.4 理解配置冲…

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中&#xff0c;可能会出现一些细节问题&#xff0c;导致程序卡死&#xff0c;即程序没法正常运行&#xff0c;界面卡住&#xff0c;也不会闪退... 当这种问题出现在客户现场&#xff0c;那就是大问题了。。。 当我们暂时还无法排…

利用 STM32 实现多协议物联网网关:Modbus/Zigbee 到以太网/Wi-Fi 的数据桥接

摘要: 随着物联网技术的飞速发展&#xff0c;不同通信协议之间的互联互通成为了构建智能化系统的一大挑战。本文将以实战项目为例&#xff0c;详细介绍如何利用 STM32 微控制器实现 Modbus/Zigbee 与以太网/Wi-Fi 之间的协议转换&#xff0c;从而打通传感器数据上传至服务器的“…

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

实现沉浸式体验的秘诀:深入了解折幕投影技术!

在当今多媒体技术的浪潮中&#xff0c;投影技术已蜕变成为超越传统内容展示范畴的非凡工具&#xff0c;它深度融合了互动性与沉浸感&#xff0c;成为连接观众与虚拟世界的桥梁。折幕投影技术&#xff0c;作为这一领域的璀璨明珠&#xff0c;更是以其独特而神奇的手法&#xff0…

如何从相机的存储卡中恢复原始照片

“不好了。” 当您意识到自己不小心从存储卡中删除了照片&#xff0c;或者错误地格式化了相机的记忆棒时&#xff0c;您首先会喊出这两个词。这是一种常见的情况&#xff0c;每个人一生中都会遇到这种情况。幸运的是&#xff0c;有办法从相机的 RAW 记忆棒中恢复已删除的照片。…

笛卡尔集的情况 rows 1

running ~ 1 hour and TEMP Space using > 450 GB 1000*4.9k4.9M 1*4.9K4.9K

【LabVIEW学习篇 - 3】:程序结构——顺序结构、for循环、while循环

文章目录 顺序结构案例一案例二 for循环while循环 顺序结构 LabVIEW中的顺序结构是一种常用的控制结构&#xff0c;用于按顺序执行程序的不同部分。顺序结构在程序中按照从左到右的顺序依次执行各个子结构&#xff0c;类似于传统的文本编程语言中的顺序执行。 案例一 案例一…

查询数据库下所有表的数据量

个人思路: 首先把库里Schema下表名拿出来放记事本(EmEditor)里, 用一下正则匹配替换 (\w) → select \1 tableName,count(1) from \1 union all 然后把最后的union all删除掉,替换为order by tableName

C++部分复习笔记上

C语法复习 1. C入门基础 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持&#xff08;编译器不支持&#xff09; 函数重载 函数重载是函数的一种特殊情况&#xff0c;…