移动端视网膜(Retina)屏幕下1px边框线 解决方案

原因:

因为Retine屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio=2的retina屏下会显示成2px。

但在IOS8中,已经支持0.5px了,那就意味着, 在devicePixelRatio=2的时候,我们可以使用如下的css:

div{
     border:1px solid #000;
}    

@media (-webkit-min-device-pixel-ratio: 2) {
    div{
          border:0.5px solid #000;
    }
}

但在ios7以下,android等其他系统里,0.5px会被显示为0px,所以需要写hack来兼容旧版本的系统。

有两种方案:

1、JS判断浏览器版本,是否是IOS8+,是的话则加上hairlines的类名,加在head里即可。

CSS代码:

div{
      border:1px solid #000
}

.hairlines div{
      border-width:0.5px
}

JS代码:

if (window.devicePixelRatio && devicePixelRatio >= 2) {
      document.querySelector(‘body‘).classList.add(‘hairlines‘)
}

  

2、JS判断是否支持0.5px的边框,是的话,则加上hairlines的类名。(代码放在body内)

if (window.devicePixelRatio && devicePixelRatio >= 2) {
      var testElem = document.createElement(‘div‘);
      testElem.style.border = ‘.5px solid #000‘;
      document.body.appendChild(testElem);

      //当div存在
      if (testElem.offsetHeight == 1){
        document.querySelector(‘html‘).classList.add(‘hairlines‘);
      }

      //添加完hairlines类名后,则删除div
      document.body.removeChild(testElem);
}

将代码放在body内会有一些重绘,第一种方法会更好一些。

当然这些方法,只能兼容IOS7包括IOS7以上的机器,但如果想兼容其他机器怎么办呢?这块我就要细细道来...

在retina屏下面,如果你写了这样的meta <meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 你将永远无法写出1px宽度的东西。

关于CSS像素和物理像素的定义,这个文章里有详细的介绍  走向视网膜(Retina)的Web时代

在 viewport 中, 因为设置了initial-scale(表示初始时的缩放比例),minimum-scale(最小缩放比例)和maximum-scale(最大缩放比例)都为1, 因此整个页面都不能缩放, retina 屏幕下1个 css 像素对应 2个(多个)物理像素, 因此我们永远写不出1px(物理)宽度的东西. 然而我们其实可以这样写:

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

淘宝M端 就是这样的方案,这样一个css的像素就能完美对应1个物理像素,我们就可以写出1px的东西了。

其他方案:

1. transform: scale(0.5)

方法1:

CSS代码:

div{
        height:1px;
        -webkit-transform: scaleY(0.5);
        -webkit-transform-origin:0 0;
        overflow: hidden;
        background: #000;
}
  

  

HTML代码:

<body>
   1px边框线
   <div></div>
</body>

 

缺点

圆角无法实现,实现4条边框比较麻烦,并且只能单独实现,如果嵌套,会对包含的效果产生不想要的效果,所以此方案配合:after和before独立使用较多。

比如画一个商品的边框四条线,容器的after和before可以画2条线,利用容器的父元素的after、before再画2条线。

div{
   position: relative;
}

div:after{
   content:"";
   position: absolute;
   bottom:0px;
   left:0px;
   right:0px;
   border-bottom:1px solid #000;
   -webkit-transform:scaleY(.5);
   -webkit-transform-origin:0 0;
}

  

2. box-shadow

实现方法:

利用CSS对阴影处理的方式实现0.5px的效果。

-webkit-box-shadow:0 1px 1px -1px rgba(0, 0, 0, 0.5);

优点:

基本所有场景都能满足,包含圆角的button,单条,多条线。

缺点:

  • 颜色不好处理, 黑色 rgba(0,0,0,1) 最深的情况了。有阴影出现,不好用。  
  • 大量使用box-shadow可能会导致性能瓶颈。
  • 四条边框实现效果不理想。

3. 使用background-image

使用 background-image 实现1px有两种方式: 渐变 linear-gradient 或直接使用图片(base64)。

渐变 linear-gradient   (50%有颜色,50%透明)

单条线:

div {
     height: 1px;
     background-image: -webkit-linear-gradient(top,transparent 50%,#000 50%);
     background-position: top left;
     background-repeat: no-repeat
     background-size: 100% 1px;
}

多条线:  

div {
        background-image:-webkit-linear-gradient(top, transparent 50%, #000 50%),-webkit-linear-gradient(bottom, transparent 50%, #000 50%),-webkit-linear-gradient(left, transparent 50%, #000 50%),-webkit-linear-gradient(right, transparent 50%, #000 50%);
        background-size: 100% 1px,100% 1px,1px 100%,1px 100%;
        background-repeat: no-repeat;
        background-position: top left, bottom left, left top, right top;
}

优点:

  • 可以设置单条,多条边框
  • 可以设置颜色

缺点:

  • 大量使用渐变可能导致性能瓶颈
  • 代码量大
  • 多背景图片有兼容性问题

  

用图片(base64):

div {
        border-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAECAYAAABP2FU6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB5JREFUeNpiPnH8zH/G////MzAxAAHTyRNn/wMEGABpvQm9g9TJ1QAAAABJRU5ErkJggg==") 2 0 stretch;
        border-width: 0px 0px 1px;
}

优点:

  • 可以设置单条,多条边框
  • 没有性能瓶颈的问题

缺点:

  • 修改颜色麻烦, 需要替换图片
  • 需要用到两张图片
  • 多背景图片有兼容性问题

  

时间: 2024-08-03 18:55:03

移动端视网膜(Retina)屏幕下1px边框线 解决方案的相关文章

Retina屏下1px border

layout tltle tags post ios7下移动web开发的几个坑 webapp 1.Retina屏下1px border 由于高清屏的特性,1px是由2×2个像素点来渲染,那么我们样式上的border:1px在Retina屏下会渲染成2px的边框,一般有以下几种方法: 图片 阴影 缩放 移动版开发采用软图片的方法: .border { background-image:linear-gradient(180deg, red, red 50%, transparent 50%), l

Retina屏幕下 canvas显示模糊的问题

一 什么是Retina 所谓“Retina”是一种显示技术,可以将把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度,以MacBook Pro with Retina Display为例,工作时显卡渲染出2880x1800个像素,其中每四个像素一组,输出原来屏幕的一个像素显示的大小区域内的图像.这样一来,用户所看到的图标与文字的大小与原来的1440x900分辨率显示屏相同,但精细度是原来的4倍,但对于特殊元素,如视频与图像,则以一个图片像素对应一个屏幕像素的方式显示.

【转】Retina 屏幕下,网页图片的显示兼容

感谢 Apple,带来了 Retina 屏幕的革命,让我们可以在电子显示屏上享受到印刷级的分辨率.由于分辨率的提升,网页中的文字.Flash 和 SVG 内容显示得比原来更加精细,但网页中的图片却变得异常模糊,存在非常严重的分辨率兼容问题.自从 2010年6月,iPhone4 的上市开始,网页图片的显示兼容问题就已出现,经过几年的发展,配备 Retina 屏幕的电子产品越来越多,如今 Apple 又将 Retina 技术应用到了 Macbook Pro 上,网页图片在 Retina 屏幕下的显示

Retina真实还原1px边框的解决方案

射鸡师给你设计图是这样的! 然后你 boder:1px solid #ccc,然后到手机上一看,又粗又大,又长 然后,测试的妹子,受不了了-- 然后,你说是的啊-- 于是,你一张图片上去一看-- 确实,不对呀! <img src="img/bg.png" style="position: fixed;top:0;left: 0;width: 100%;z-index: 999;opacity: .5;"> 然后,怎么办了呢 第一:你想到的是: 设计图是7

box-shadow实现移动端(Retina屏)超细边框

// box-shadow投影方向 // 上 box-shadow: inset 0px 1px 0px 0px #000; // 右 box-shadow: inset -1px 0px 0px 0px #000; // 下 box-shadow: inset 0px -1px 0px 0px #000; // 左 box-shadow: inset 1px 0px 0px 0px #000; 效果如下: 因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度. 在w

移动端 1px边框 问题

https://segmentfault.com/a/1190000015736900 https://blog.csdn.net/yexudengzhidao/article/details/98480173 本文介绍了解决移动端1px边框问题的5种方法.当然了,在这之前先整理了与这些方法相关的知识:物理像素.设备独立像素.设备像素比和viewport. 物理像素.设备独立像素和设备像素比 在CSS中我们一般使用px作为单位,需要注意的是,CSS样式里面的px和物理像素并不是相等的.CSS中的

移动端,多屏幕尺寸高清屏retina屏适配的解决方案

移动端高清.多屏适配方案 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范往往会遵循以下两点: 首先,选取一款手机的屏幕宽高作为基准(以前是iphone4的320×480,现在更多的是iphone6的375×667). 对于retina屏幕(如: dpr=2),为了达到高清效果,视觉稿的画布大小会是基准的2倍,也就是说像素点个数是原来的4倍(对i

7种方法解决移动端Retina屏幕1px边框问题

在Reina(视网膜)屏幕的手机上,使用CSS设置的1px的边框实际会比视觉稿粗很多.在之前的项目中,UI告诉我说我们移动项目中的边框全部都变粗了,UI把他的设计稿跟我的屏幕截图跟我看,居然真的不一样.没有办法,只有在后面的版本中去修改了,但是要改的话,需要知道是为什么.所以查了很多资料,终于搞懂了这个问题,并且总结了几种方法. 造成边框变粗的原因 其实这个原因很简单,因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度.在window对象中有一个devicePixe

移动端 Retina屏 各大主流网站1px的解决方案

Retina屏的移动设备如何实现真正1px的线? 在retina屏下面,如果你写了这样的meta <meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 你将永远无法写出1px宽度的东西,除此之外,inline的SVG等元素,也会按照逻辑像素来渲染,整个页面的清晰度会打折: 先看看  “诸子百家 ”  是如何实