当前位置: 首页 > news >正文

解决移动端1px 边框优化的8个方法

前言

您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗?这种不一致源于移动屏幕的像素密度不同。

在 Web 开发中,我们使用 CSS 来设置页面样式。但是,CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框问题”产生的原因。

罪魁祸首:像素密度

每个设备都拥有特定的像素密度,由 devicePixelRatio 测量,它告诉我们物理像素与设备独立像素之间的比率。

devicePixelRatio = 物理像素 / 独立像素

今天我就来跟你分享8 个久经考验的解决方案 。探索解决方案,我们要重点关注像素比大于或等于 2 的情况。

1.  0.5px 边框:一个简单的解决方案

此方法涉及在设备像素比为 2 或更高时有条件地应用 0.5px 边框。

// Check if devicePixelRatio exists and is greater than or equal to 2
if(window.devicePixelRatio && devicePixelRatio>=2){// Create a temporary div element for testingvar testElem = document.createElement('div');// Apply a 0.5px transparent border to the test elementtestElem.style.border = '.5px solid transparent';// Append the test element to the bodydocument.body.appendChild(testElem);// Check if the rendered height is 1px (meaning 0.5px border works)if(testElem.offsetHeight == 1){// If yes, add the 'hairlines' class to the HTML elementdocument.querySelector('html').classList.add('hairlines');}// Remove the test elementdocument.body.removeChild(testElem);
}
//  Place the above script inline. If it's inside a function, 
// wrap it in $(document).ready(function(){}) to ensure it runs after the DOM is ready.// Default border style
div{border: 1px solid #bbb;
}
// Apply 0.5px border when 'hairlines' class is present
.hairlines div {border-width: 0.5px;
}

2.  边框图像:完美的边框

使用专门制作的边框图像是一种有效的方法。以下是创建底部边框的方法:

.border-bottom-1px {// Set other border widths to 0border-width: 0 0 1px 0;// Apply the border-image – ‘linenew.png’ // (assuming you have an image for this)border-image: url(linenew.png) 0 0 2 0 stretch;// For webkit browsers-webkit-border-image: url(linenew.png) 0 0 2 0 stretch;
}

解释:

  • 我们只在底部设置边框(border-width:0 0 1px 0)。

  • 使用的图像(“linenew.png”)假定为 2px 高。

  • 图像顶部 1px 是透明的,底部 1px 包含实际边框颜色。

3.  Background-Image:背景技巧

与 border-image 类似,此方法利用预先准备的图像作为边框。

.backround-image-1px{// Set the background image, repeating it along the x-axis and positioning it at the left bottombackground: url(../img/line.png) repeat-x left bottom;// Set the background size for Webkit browsers-webkit-background-size: 100% 1px;// Set the background size (1px height for the border effect)background-size: 100% 1px;
}

注意事项:

  • 更改颜色需要替换图像。

  • 圆角可能会显得模糊,需要额外的样式。

4.  多背景渐变:边框的错觉

我们可以使用渐变背景来模仿边框的外观。渐变的一半显示所需的颜色,而另一半保持透明。

.background-gradient-1px{// Create a multi-background with linear gradients for each sidebackground: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;}/* Alternatively, use an older syntax for Webkit browsers*/
.background-gradient-1px{// Apply a linear gradient from top to bottombackground: -webkit-gradient(linear, left top, left bottom, color-step(.5, transparent), // Transparent at 50%color-step(.5, #c8c7cc), // Color starts at 50%to(#c8c7cc)) // End colorleft bottom repeat-x; // Set the background sizebackground-size: 100% 1px; 
}

5.  Box-Shadow:跳出框框

让我们利用 CSS 阴影来创建令人信服的边框效果。

.box-shadow-1px {// Apply an inset box shadow – the negative spread simulates a thin borderbox-shadow: inset 0px -1px 1px -1px #c8c7cc; 
}

6.  视口 + Rem:动态二重奏 

调整视口的 rem 基值有助于在不同设备上实现一致的 1px 边框。请记住,使用此技术修改旧项目可能需要进行重大调整。

优点:适用于各种布局的适应性解决方案。

缺点:对于遗留项目来说可能具有挑战性。

// For a device pixel ratio of 1, set the viewport as follows:
<meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">// For a device pixel ratio of 2
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
// For a device pixel ratio of 3
<meta 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" /><meta name="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><script type="text/javascript">// Get the device pixel ratiovar dpr = window.devicePixelRatio; // Example: 2 on a Retina display console.log(dpr, 'dpr+++');// Calculate the inverse scale var scale = 1 / dpr; // Get the initial viewport width – this might be inaccurate due to the dprvar width = document.documentElement.clientWidth; // Example: 375 on an iPhone X// Adjust the viewport meta tag to counteract the device pixel ratiovar metaNode = document.querySelector('meta[name="viewport"]');metaNode.setAttribute('content', 'width=device-width,initial-scale=' + scale + ',user-scalable=no');// Recalculate the width after viewport adjustmentvar width = document.documentElement.clientWidth; // Now, it should be closer to 750// Dynamically set the base font size using rem unitsvar styleN = document.createElement('style');styleN.innerHTML = 'html{font-size: ' + width / 16 + 'px !important;}'; document.head.appendChild(styleN);
</script>
</body>
</html>

7.  伪元素 + 变换:传统项目英雄 

这种方法对现有项目非常方便。我们删除原始边框,并利用伪元素制作 1px 边框,将其缩小以获得像素完美的外观

.scale-1px {position: relative;border: none; // Remove any default borders
}.scale-1px:after {content: '';position: absolute;bottom: 0;background: #000; // Set the desired border colorwidth: 100%;height: 1px; transform: scale(0.5); // Scale down to 0.5 to achieve a thinner bordertransform-origin: 0 0; 
}
.scale-1px-top {border: none;position: relative;
}
.scale-1px-top:before {content: '';position: absolute;display: block;top: 0;left: 0;width: 200%; // Stretch to cover potential scaling issuesheight: 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: none;position: relative;
}
.scale-1px-bottom:before {content: '';position: absolute;display: block;bottom: -1px; // Adjust position to avoid overlapping contentleft: 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-radius: .16rem; border: none;position: relative;
}
.borderRadius-1px:after { content: '';position: absolute;top: 0;left: 0;border: 1px solid #d1d1d1;-webkit-box-sizing: border-box;box-sizing: border-box;width: 200%; // Ensure the pseudo-element covers the entire elementheight: 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 直接绘制 1px 线条。

<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>

关于优联前端

        武汉优联前端科技有限公司由一批从事前端10余年的专业人才创办,是一家致力于H5前端技术研究的科技创新型公司,为合作伙伴提供专业高效的前端解决方案,合作伙伴遍布中国及东南亚地区,行业涵盖广告,教育, 医疗,餐饮等。有效的解决了合作伙伴的前端技术难题,节约了成本,实现合作共赢。可进行Web前端,微信小程序、小游戏,2D/3D游戏,动画交互与UI广告设计等各种技术研发。

相关文章:

解决移动端1px 边框优化的8个方法

前言 您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗&#xff1f;这种不一致源于移动屏幕的像素密度不同。 在 Web 开发中&#xff0c;我们使用 CSS 来设置页面样式。但是&#xff0c;CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框…...

频带宽度固定,如何突破数据速率的瓶颈?

目录 目录 引言 信道 频带宽度 信噪比 信噪比的重要性 影响信噪比的因素 码元 码元的特点&#xff1a; 码元与比特的关系&#xff1a; 码元的作用&#xff1a; 码元的类型&#xff1a; Question 类比解释&#xff1a; 技术解释&#xff1a; 引言 在现代通信系统中…...

Linux网络编程 --- 高级IO

前言 IO Input&&Output read && write 1、在应用层read && write的时候&#xff0c;本质把数据从用户层写给OS --- 本质就是拷贝函数 2、IO 等待 拷贝。 等的是&#xff1a;要进行拷贝&#xff0c;必须先判断读写事件成立。读写事件缓冲区空间满…...

Python中给定一个数组a = [2,3,9,1,0],找出其中最大的一个数,并打印出来 求解?

Python有内置的max函数可以取最大值&#xff1a; max([2,3,9,1,0])也可以使用sorted先排序&#xff0c;再索引取出最大值&#xff1a; sorted([2,3,9,1,0])[-1]如果不用内置函数&#xff0c;自己排序算法来找出最大值&#xff0c;也有很多选择。 比如冒泡排序、循环排序、交…...

系统优化工具 | PC Cleaner v9.7.0.3 绿色版

PC Cleaner是一款功能强大的电脑清理和优化工具&#xff0c;旨在通过清理系统垃圾文件、解除恶意软件和优化系统性能来提高计算机的运行效率。该软件提供了多种功能&#xff0c;可以帮助用户维护和提升计算机的整体表现。 PC Cleaner 支持 Windows 7 及以上操作系统&#xff0…...

JavaSE、JavaEE 与 JavaWeb 的详解与区别

一、JavaSE(Java Standard Edition)——标准版 1. 什么是JavaSE JavaSE,全称Java Standard Edition,译为Java标准版,是Java平台的基础,也是开发者最常使用的Java版本。JavaSE包含了编程中最基础的核心库,如Java的基本语法、面向对象编程、集合框架、多线程、网络编程、…...

HCIE和CCIE,哪个含金量更高点?

在现在内卷的大环境下&#xff0c;技术岗可谓人人自危&#xff0c;也因此各种认证的重视程度直线升高。 特别是华为认证的HCIE和思科认证的CCIE&#xff0c;它们都代表着网络技术领域的顶尖水平。 但面对这两个高含金量的认证&#xff0c;不得不让人问出这个问题&#xff1a;同…...

2024.9.14 Python与图像处理新国大EE5731课程大作业,马尔可夫随机场和二值图割,校正立体图像的深度

1.马尔科夫随机场和二值图割 马尔可夫随机场&#xff08;MRF, Markov Random Field&#xff09;&#xff1a; MRF 是一种用来描述图像像素之间空间关系的概率模型。它假设图像中的像素不仅取决于自身的值&#xff0c;还与周围像素有关。这种模型经常用于图像分割、去噪等任务。…...

工业大模型市场图谱:53个工业大模型全面梳理

工业场景要求严谨、容错率低&#xff0c;核心业务场景对模型准确率的要求达到95%以上、对幻觉的容忍率为0&#xff0c;因此通用基础大模型的工业知识往往不足以满足工业场景的应用需求。 根据沙丘智库发布的《2024年中国工业大模型应用跟踪报告》&#xff0c;工业大模型是指在…...

【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序

目录 一、拓扑排序介绍 定义 特点 实现方法&#xff08;2种&#xff09; 应用 二、题目与题解 题目&#xff1a;卡码网 117. 软件构建 题目链接 题解&#xff1a;拓扑排序 - Kahn算法&#xff08;BFS&#xff09; 三、小结 一、拓扑排序介绍 对于拓扑排序&#xff0c…...

JVM内部结构解析

Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础环境&#xff0c;它为Java程序提供了一个与平台无关的执行环境。了解JVM的内部结构对于Java开发者来说至关重要&#xff0c;因为它可以帮助开发者优化程序性能&#xff0c;理解垃圾回收机制&#xff0c;以及诊断和解…...

誉龙视音频综合管理平台 RelMedia/FindById SQL注入漏洞复现

0x01 产品简介 誉龙视音频综合管理平台是深圳誉龙数字技术有限公司基于多年的技术沉淀和项目经验,自主研发的集视音频记录、传输、管理于一体的综合解决方案。该平台支持国产化操作系统和Windows操作系统,能够接入多种类型的记录仪,实现高清实时图传、双向语音对讲、AI应用…...

MATLAB系列01:MATLAB介绍

MATLAB系列01&#xff1a;MATLAB介绍 1. MATLAB介绍1.1 MATLAB的优点1.2 MATLAB的缺点1.3 MATLAB的开发环境1.3.1 获取帮助的方法&#xff1a;1.3.2 一些重要的命令&#xff1a;1.3.3 MATLAB搜索路径 1. MATLAB介绍 MATLAB(矩阵实验室的简称)是一种专业的计算机程序&#xff0…...

GEE 按范围导出 Sentinel-2 卫星影像

Sentinel-2 卫星提供了高分辨率的地表覆盖图像&#xff0c;广泛应用于农业监测、城市规划、环境变化分析等诸多领域。在 Google Earth Engine (GEE) 中&#xff0c;我们能够按特定地理范围导出这些影像&#xff0c;以支持更深入的研究和分析。 使用方法 &#x1f4bb; GEE 提供…...

队列OJ题——用队列实现栈

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 用队列实现栈 二、解题思路 三、解题代码 class MyStack {public Queue<Integer> queue1;public Queue<Integer> queue2;public int usedSize;public MyStack() {queue1 new LinkedList<>()…...

RK3588镜像打包制作,替换文件系统

1.在开发板上安装async apt-get async 2.在另一台linux机器上执行命令拷贝文件系统 注意&#xff1a; 这里使用root权限或者账户 mkdir rootfs rsync -avx root192.168.1.3:/ rootfs 3.制作空镜像文件 先去开发板上验证自己的系统使用了多少空间&#xff0c;然后输入命令制…...

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言&#xff1a;目前开源的DiT视频生成模型不是很多&#xff0c;Open-Sora是开发者生态最好的一个&#xff0c;涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发&#xff0c;深…...

基于微信平台的旅游出行必备商城小程序+ssm(lw+演示+源码+运行)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…...

AI绘画:科技赋能艺术的崭新时代

&#x1f4af;AI绘画&#xff1a;走进艺术创新的新时代 人工智能在改变世界的过程中&#xff0c;AI绘画工具逐渐成为创新的典范。 本文将为您揭示AI绘画背后的技术秘密、潜在的应用场景&#xff0c;并为您推荐几款出色的AI绘画工具&#xff0c;助您领略这一技术带来的艺术新体…...

性能诊断的方法(四):自下而上的资源诊断方法和发散的异常信息诊断方法

关于性能诊断的方法&#xff0c;我们可以按照“问题现象—直接原因—问题根源”这样一个思路去归纳。我们先从问题的现象去入手&#xff0c;包括时间的分析、资源的分析和异常信息的分析。接下来再去分析产生问题现象的直接原因是什么&#xff0c;这里我们归纳了自上而下的资源…...

解锁端侧智能:基于BigDL-LLM与Qwen-1.8B-Chat的CPU高效推理实践

1. 为什么要在CPU上部署大模型&#xff1f; 最近两年大模型技术发展迅猛&#xff0c;但大多数应用都依赖昂贵的GPU服务器。我在实际项目中发现&#xff0c;很多中小企业和个人开发者其实更需要能在普通电脑上运行的轻量化方案。这就是为什么基于CPU的大模型部署方案变得越来越…...

婚礼技能库:用开源协作与项目管理思维打造个性化婚礼

1. 项目概述&#xff1a;婚礼技能库的诞生与价值婚礼&#xff0c;对大多数人来说&#xff0c;是人生中为数不多的、需要同时扮演项目经理、创意总监、财务主管和情感联络员的高压事件。筹备过程琐碎繁杂&#xff0c;从场地布置、流程设计&#xff0c;到妆发造型、摄影摄像&…...

【限时公开】后印象派专属--ar 16:9 --style raw --stylize 800参数组合包(含塞尚构图/修拉点彩/劳特累克动态线共12套已验证prompt模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;后印象派艺术精神与Midjourney风格迁移的本质逻辑 后印象派并非对印象派的简单延续&#xff0c;而是对主观表达、结构重构与象征张力的自觉回归——梵高旋转的星云、塞尚凝练的几何体、高更原始的色域&…...

阴阳师自动化脚本OAS终极指南:轻松解放双手的完整教程

阴阳师自动化脚本OAS终极指南&#xff1a;轻松解放双手的完整教程 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化脚本OAS是一款专门为《阴阳师》游戏设计的智能自动…...

UVa 366 Cutting Up

题目描述 拼布者经常需要将布料切割成 111 \times 111 的小正方形。他们有一种特殊工具&#xff08;旋转切割刀&#xff09;&#xff0c;可以一次切割多层布料&#xff0c;切割层数的上限由布料类型决定&#xff08;题目输入的第一个参数 KKK&#xff09;。切割时&#xff0c;无…...

基于RP2040与CircuitPython的键盘内嵌DOOM游戏启动器DIY指南

1. 项目概述与核心思路几年前&#xff0c;我还在用笨重的全尺寸键盘时&#xff0c;就总琢磨着怎么给这每天摸上八小时的家伙加点“私货”。直到后来玩起了RP2040和CircuitPython&#xff0c;一个念头就冒出来了&#xff1a;能不能把游戏直接“焊”进键盘里&#xff1f;不是那种…...

开源AI图像生成工具Dream-Creator:本地部署与Stable Diffusion实战指南

1. 项目概述&#xff1a;一个开源的AI图像生成与创作工具 最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目叫“Dream-Creator”。光看名字&#xff0c;你可能会联想到一些AI绘画或者创意生成工具。没错&#xff0c;这确实是一个围绕AI图像生成的开源项目。作为一个在…...

KMS智能激活终极指南:如何一键永久激活Windows和Office

KMS智能激活终极指南&#xff1a;如何一键永久激活Windows和Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;每次重装系统后都要重新激活Office&…...

多语种出海必备,ElevenLabs菲律宾文语音质量实测对比:Wavenet vs. Instant Voice vs. Custom Model(附MOS评分表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;多语种出海语音技术演进与菲律宾语本地化挑战 随着全球数字服务加速出海&#xff0c;语音交互系统正从单语种向多语种、低资源语言深度拓展。菲律宾语&#xff08;Filipino/Tagalog&#xff09;作为东…...

Arm Cortex-A35 Cycle Model技术解析与SoC集成实战

1. Arm Cortex-A35 Cycle Model技术解析在SoC设计领域&#xff0c;虚拟平台验证已成为不可或缺的关键环节。作为Armv8-A架构中的能效比优化核心&#xff0c;Cortex-A35处理器通过Cycle Model提供了RTL级精度的硬件行为模拟能力。我在多个车载SoC项目中验证发现&#xff0c;其Cy…...