background图片不显示_一种解决Retina屏幕1px边框显示问题的方案

b6a865a86eb93e77e9b892c58075e078.png

一、背景介绍:

Retina是一种新型高分辨率的显示标准,是把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度;同时CSS样式表中px单位是一个相对值,并不是绝对值,实际在Retina屏幕中渲染元素的时候,会根据实际的dpr渲染对应的物理像素点,导致CSS代码中1px高度的边框,在实际设备浏览器渲染的时候往往不是1个物理像素高度,可能是2个物理像素高度,甚至是3个物理像素高度,造成设计稿和实际开发的页面显示有出入,影响用户UI体验。

二、现有方案

现有的解决方法大概有两种:

1. 使用1像素高度的背景图片来设置边框
问题点:维护成本比较高,如果变更边框颜色,则需要重新生成新图片。

2. 通过CSS属性border: 0.5px来设置

问题点:存在兼容性问题,在某些设备可能无法识别0.5px,导致元素无法渲染。

三、本方案目的

本方案根据设备参数devicePixelRatio设备像素比,从而精确实现Retina屏幕下1px边框显示问题,同时防止颜色失真。

四、本方案效果

1. 根据不同设备的devicePixelRatio设备像素比,动态调整不同Retina屏幕下1px边框物理像素点高度;

2. 高度还原设计稿,提高用户UI体验。

五、本方案实施方式

1. 在WEB页面DOM元素解析完成后,通过JS获取设备devicePixelRatio参数;

2. 通过JS判断CSS样式前缀;

3. 通过CSS函数linear-gradient()设置边框背景,利用设备参数devicePixelRatio设置起始颜色(边框颜色)的渐变高度比例,将结束颜色设置为透明(transparent);

4. 设置元素backgound-size属性;

ba635855f348fd62a8c1a66a304460bd.png

上述代码解读:通过JS获取设备参数devicePixelRatio(例如dpr为2,那么实际渲染的物理像素为2*2px,4个像素点,高度为2个像素),利用CSS函数linear-gradient()颜色渐变,设置起始颜色(边框颜色)渐变终点位置(即1/dpr的高度,即为1个像素高度),设置其余背景颜色为透明,同时设置背景颜色的尺寸(background-size)。

附录:

附录(1) 1px实现代码样例

// 获取dom元素var divStyle = document.getElementsByClassName('retina-background-size')[0].style;// 常见css前缀var render = {  webkit: 'webkitTransform',  moz: 'MozTransform',  ms: 'msTransform',  o: 'OTransform',  dafault: 'transform'};// 判断css前缀类型var getPrefix = (() => {  for(let key in render) {    if(divStyle[render[key]] !== undefined) {      return key;    }  }})();// 设置css前缀functionfunction stylePrefix() {  if(getPrefix === 'dafault') {    return '';  }  return '-'+getPrefix+'-';};// 获取设备像素比(dpr)var ratio = Math.floor(1 / window.devicePixelRatio * 100) / 100;var endPosition = ratio *100 + '%';divStyle.background = stylePrefix() + 'linear-gradient(bottom, red ' + endPosition + ', transparent ' + endPosition + ') no-repeat center bottom';divStyle.backgroundSize = '100% 1px';

附录(2) 上述代码在2dpr设备生成的元素样式表样例

950d712e685106a812dddcf3f2d4d7e2.png

附录(3) 2dpr设备上实际效果对比图

f294610df2590552c3d785b18562dbf6.png

附录(4) 上述代码在3dpr设备生成的元素样式表样例

29105979a4c0ee4713f239ed34ab6359.png

附录(5) 3dpr设备上实际效果对比图

51ef5a62b0eab17c425b24c39e821fd7.png

附录(6) 名词解释说明

1. ratio是devicePixelRatio设备像素比(物理像素/设备独立像素)保留2位小数后的值。
2. CSS linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片。其结果属于数据类型,是一种特别的数据类型。
3. Linear-gradient() 函数第一个参数指定渐变的方向或角度,后面的参数指的是渐变的颜色以及颜色起点和终点位置(第一个颜色可以省略起点位置,最后一个颜色可以省略终点位置)。

236665228867ad844654e4ddbf42b25c.png

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

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

相关文章

gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型

当你第一次定义Protocol Buffer的消息的时候,你肯定会给消息设定一套规则需求。但是随着时间的推进,你的业务可能会发生了变化,与此同时,你的Protocol Buffer消息类型的需求也会随之变化。也就是说:有一些字段可能会发…

opengl如何画出一个球_少儿美术绘画教程:毛线球

小朋友们,你们平时画画有没有遇到过没有灵感的时候,面对画纸却不知道画些什么呢?今天我们来介绍一种创意思维,叫发散性思维。以一个毛线球为出发点。通过毛线球,我们可以想到圆球,通过圆球我们可以想到圆形…

数据结构---后序和中序遍历的二叉树序列还原二叉树

数据结构—后序和中序遍历的二叉树序列还原二叉树 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bstTree {char data;struct bstTree* lchild, *rchild; }bstTree; bstTree * reStoreTree(char* pre, int preSt, int preEnd, char *mi…

Asp.Net Core 混合全球化与本地化支持

前言最近的新型冠状病毒流行让很多人主动在家隔离&#xff0c;希望疫情能快点消退。武汉加油&#xff0c;中国必胜&#xff01;Asp.Net Core 提供了内置的网站国际化&#xff08;全球化与本地化&#xff09;支持&#xff0c;微软还内置了基于 resx 资源字符串的国际化服务组件。…

最大连续子数组和 动态规划_剑指Offer算法题 33:连续子数组的最大和

题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢&#xf…

数据结构---顺序查找和二分查找

数据结构—顺序查找和二分查找 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int n;//查找元素数组的长度 void seqCheckValue1(int* a) {//顺序查找1,有越界判断int v a[0];for (int i 1; i < n; i) {if(a[i…

git上托管的代码如何部署在阿里云上_居然仅用浏览器搞定Spring Boot应用的开发与部署...

最近有幸试用了一下阿里云的一个新产品&#xff1a;云开发平台&#xff0c;体验一把全新的开发模式&#xff01;虽然中间也碰到了一些问题&#xff0c;但整体的体验透露着未来感&#xff0c;因为整个过程都不需要使用我们最常用的IDEA&#xff0c;仅依靠浏览器就把一个Spring B…

Kubernetes 与 Helm:使用同一个 Chart 部署多个应用

k8s 集群搭建好了&#xff0c;准备将 docker swarm 上的应用都迁移到 k8s 上&#xff0c;但需要一个一个应用写 yaml 配置文件&#xff0c;不仅要编写 deployment.yaml 还要编写 service.yaml &#xff0c;而很多应用的配置是差不多的&#xff0c;这个繁琐工作让人有些望而却步…

数据结构---BF字符串模式匹配

数据结构—BF字符串模式匹配 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int BF(char * S, char* T,int pos,int n,int m) {//暴力算法求解子串T在S中第一次出现的位置int i pos, j 0;while (i < n &&a…

windows系统如何cmake_Windows操作系统如何快速增加分区?建议收藏

现在新买的电脑大都是出厂单分区的设置&#xff0c;也就是只有系盘C&#xff0c;没有D、E之类。于是也问过厂商的工作人员&#xff0c;得到的答复是恢复备份的机制已经十分完善&#xff0c;保证用户使用安全毫无问题。不过&#xff0c;相信小伙伴们和我一样&#xff0c;内心还是…

大白技术控 | Windows10X 模拟器简单上手体验

点击蓝字“大白技术控”关注我哟加个“星标★”&#xff0c;每日 19:30&#xff0c;好文必达&#xff01;前言Windows10X 和 Windows10 有什么区别&#xff1f;当这个问题摆在我面前的时候&#xff0c;我就脱口而出&#xff1a;区别&#xff1f;双屏了呗&#xff01;这个答案有…

word List 21

word List 21 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

Asp.Net Core Identity 骚断腿的究极魔改实体类

前言默认的 Identity 实体类型在大多数时候已经基本够用&#xff0c;很多时候也只是稍微在 IdentityUser 类中增加一些自定义数据字段&#xff0c;比如头像。这次&#xff0c;我要向园友隆重介绍我魔改之后的 Identity 实体类&#xff0c;能支持一些特别风骚的操作。当然也完全…

[蓝桥杯2015决赛]四阶幻方

题目描述 把1~16的数字填入4x4的方格中&#xff0c;使得行、列以及两个对角线的和都相等&#xff0c;满足这样的特征时称为&#xff1a;四阶幻方。 四阶幻方可能有很多方案。如果固定左上角为1&#xff0c;请计算一共有多少种方案。 比如&#xff1a; 1 2 15 16 12 14 3 5 13 7…

数据结构---模式匹配

数据结构—模式匹配 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 int next[N]; void getNext(char *T,int *next,int m) {//求解当前字符前面的最大公共前缀和后缀int j 1,k0;next[j] 0;//从1开始…

CKEditor 4编辑器已与Vue.js集成

虽然 CKEditor 4 不是目前主要维护的分支&#xff0c;不过官方并没有让它落后于潮流。近日&#xff0c;CKEditor 团队发布了与 Vue.js 框架原生集成的 CKEditor 4。这就意味着&#xff0c;开发者可以通过<ckeditor />标签以 Vue.js 组件的形式使用 CKEditor 4 &#xff0…

[蓝桥杯2016初赛]卡片换位-bfs

题目描述 你玩过华容道的游戏吗&#xff1f;这是个类似的&#xff0c;但更简单的游戏。看下面 3 x 2 的格子 在其中放5张牌&#xff0c;其中A代表关羽&#xff0c;B代表张飞&#xff0c;* 代表士兵。还有一个格子是空着的。 你可以把一张牌移动到相邻的空格中去(对角不算相邻…

数据结构---KMP模式匹配病毒感染人的DNA检测

数据结构—KMP模式匹配病毒感染人的DNA检测 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 int next[N]; void getNext(char *T, int *next, int m) {//求解当前字符前面的最大公共前缀和后缀int j …

推荐一个很棒的开源工作流elsa-core

开源项目orchard主要开发人员Sipke Schoorstra 开源了一个netcore 工作流项目&#xff0c;地址&#xff1a;https://github.com/elsa-workflows/elsa-core&#xff0c;最新版本1.2&#xff0c;正在开发2.0版本 。Spike 是参照Orchard Core的工作流引擎的原理&#xff0c;将其转…

WTM系列视频教程:MVVM

WTM系列视频教程第三章&#xff1a;MVVM文字摘要&#xff1a;“要讲MVVM模式&#xff0c;我们先来讲一下传统的MVC模式&#xff0c;要讲MVC模式&#xff0c;我们先来讲一下没有模式。。。”“为了演示没有模式&#xff0c;咱们整个项目就保留一个Program.cs文件&#xff0c;不使…