问题描述:移动端iPhone上的1px边框看起来像2px那么粗。
问题分析:不同的手机有不同的像素密度,在window对象中有一个devicePixelRatio属性,它可以反应设备的像素与css中的像素比。即devicePixelRatio=物理像素/独立像素。iPhone使用的是Retine屏,“Retina”是一种显示技术,可以把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度。因为Retine屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio=2的Retine屏下会显示成2px,所以css设置1px的样式,实际是2px的效果。
解决方案

1、用小数实现

  1. div {
  2. border: 1px solid #dfdfdf;
  3. }
  4. @media screen and (-webkit-min-device-pixel-ratio: 2) {
  5. div {
  6. border: 0.5px solid #dfdfdf;
  7. }
  8. }
  9. @media screen and (-webkit-min-device-pixel-ratio: 3) {
  10. div {
  11. border: 0.333333px solid #dfdfdf;
  12. }
  13. }

无法兼容安卓设备和iOS8以下的设备。

2、用border-image实现

  1. .border-image-1px {
  2. border-bottom: 1px solid #dfdfdf;
  3. }
  4. @media screen and (-webkit-min-device-pixel-ratio: 2) {
  5. .border-image-1px {
  6. border-bottom: none;
  7. border-width: 0 0 1px 0;
  8. -webkit-border-image: url(../img/dot.png) 0 0 2 0 stretch;
  9. border-image: url(../img/dot.png) 0 0 2 0 stretch;
  10. }
  11. }

修改颜色麻烦,需要替换图片,圆角需要特殊处理。

3、用background-image实现

  1. @media screen and (-webkit-min-device-pixel-ratio: 2) {
  2. .background-image-1px {
  3. background: url(../img/line.png) repeat-x left bottom;
  4. -webkit-background-size: 100% 1px;
  5. background-size: 100% 1px;
  6. }
  7. }

修改颜色麻烦,需要替换图片,圆角需要特殊处理。

4、用多背景渐变实现

  1. @media screen and (-webkit-min-device-pixel-ratio: 2) {
  2. .background-gradient-1px {
  3. background:
  4. linear-gradient(#dfdfdf, #dfdfdf 100%, transparent 100%) left / 1px 100% no-repeat,
  5. linear-gradient(#dfdfdf, #dfdfdf 100%, transparent 100%) right / 1px 100% no-repeat,
  6. linear-gradient(#dfdfdf,#dfdfdf 100%, transparent 100%) top / 100% 1px no-repeat,
  7. linear-gradient(#dfdfdf,#dfdfdf 100%, transparent 100%) bottom / 100% 1px no-repeat
  8. }
  9. }

/* 或者 */

  1. @media screen and (-webkit-min-device-pixel-ratio: 2) {
  2. .background-gradient-1px{
  3. background:
  4. -webkit-gradient(linear, left top, right bottom, color-stop(0, transparent), color-stop(0, #dfdfdf), to(#dfdfdf)) left / 1px 100% no-repeat,
  5. -webkit-gradient(linear, left top, right bottom, color-stop(0, transparent), color-stop(0, #dfdfdf), to(#dfdfdf)) right / 1px 100% no-repeat,
  6. -webkit-gradient(linear, left top, right bottom, color-stop(0, transparent), color-stop(0, #dfdfdf), to(#dfdfdf)) top / 100% 1px no-repeat,
  7. -webkit-gradient(linear, left top, right bottom, color-stop(0, transparent), color-stop(0, #dfdfdf), to(#dfdfdf)) bottom / 100% 1px no-repeat
  8. }
  9. }

圆角没法实现,多背景图片有兼容性问题。

5、用box-shadow实现

  1. .box-shadow-1px {
  2. box-shadow: inset 0px -1px 1px -1px #dfdfdf;
  3. }

边框有阴影,颜色变浅。
6、用viewport+rem实现

devicePixelRatio=2时,

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

devicePixelRatio=3时,

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

这种兼容方案相对比较完美,适合新的项目,老的项目修改成本过大。
手淘H5页面就采用了Flexible技术,核心是viewport+rem。

7、用伪元素+transform实现
原理是,把元素的border去掉,然后利用:before或者:after重做border,并让transform的 scale缩小一半,元素本身相对定位,新做的border绝对定位。

  1. @media only screen and (-webkit-min-device-pixel-ratio: 2.0){
  2. .border-1px, .border-top-1px, .border-right-1px ,.border-bottom-1px , .border-left-1px{
  3. position: relative;
  4. border:none;
  5. }
  6. /*线条颜色*/
  7. .border-1px:after, .border-top-1px:after, .border-right-1px:after, .border-bottom-1px:after, .border-left-1px:after {
  8. background-color: #f00;
  9. }
  10.  
  11. /*上边边框一像素*/
  12. .border-top-1px:after {
  13. pointer-events: none;
  14. content:"";
  15. position: absolute;
  16. left:;
  17. top:;
  18. width: 100%;
  19. height: 1px;
  20. transform-origin: 0 0;
  21. transform: scaleY(0.5);
  22. }
  23. /*右边边框一像素*/
  24. .border-right-1px:after {
  25. pointer-events: none;
  26. content:"";
  27. position: absolute;
  28. right:;
  29. bottom:;
  30. width: 1px;
  31. height: 100%;
  32. transform-origin: 0 0;
  33. transform: scaleX(0.5);
  34. }
  35. /*底边边框一像素*/
  36. .border-bottom-1px:after {
  37. pointer-events: none;
  38. content:"";
  39. position: absolute;
  40. left:;
  41. bottom:;
  42. width: 100%;
  43. height: 1px;
  44. transform-origin: 0 0;
  45. transform: scaleY(0.5);
  46. }
  47. /*左边边框一像素*/
  48. .border-left-1px:after {
  49. pointer-events: none;
  50. content:"";
  51. position: absolute;
  52. left:;
  53. top:;
  54. width: 1px;
  55. height: 100%;
  56. transform-origin: 0 0;
  57. transform: scaleX(0.5);
  58. }
  59.  
  60. /*边框一像素*/
  61. .border-1px:after {
  62. pointer-events: none;
  63. content: "";
  64. box-sizing: border-box;
  65. position: absolute;
  66. left:;
  67. top:;
  68. width: 200%;
  69. height: 200%;
  70. border: 1px solid #dfdfdf;
  71. -webkit-transform: scale(0.5);
  72. transform: scale(0.5);
  73. -webkit-transform-origin: left top;
  74. transform-origin: left top;
  75. }
  76. }
  1. @media only screen and (-webkit-min-device-pixel-ratio: 3.0){
  2. .border-1px, .border-top-1px, .border-right-1px ,.border-bottom-1px , .border-left-1px{
  3. position: relative;
  4. border:none;
  5. }
  6. /*线条颜色*/
  7. .border-1px:after, .border-top-1px:after, .border-right-1px:after, .border-bottom-1px:after, .border-left-1px:after {
  8. background-color: #f00;
  9. }
  10.  
  11. /*上边边框一像素*/
  12. .border-top-1px:after {
  13. pointer-events: none;
  14. content:"";
  15. position: absolute;
  16. left:;
  17. top:;
  18. width: 100%;
  19. height: 1px;
  20. transform-origin: 0 0;
  21. transform: scaleY(0.333);
  22. }
  23. /*右边边框一像素*/
  24. .border-right-1px:after {
  25. pointer-events: none;
  26. content:"";
  27. position: absolute;
  28. right:;
  29. bottom:;
  30. width: 1px;
  31. height: 100%;
  32. transform-origin: 0 0;
  33. transform: scaleX(0.333);
  34. }
  35. /*底边边框一像素*/
  36. .border-bottom-1px:after {
  37. pointer-events: none;
  38. content:"";
  39. position: absolute;
  40. left:;
  41. bottom:;
  42. width: 100%;
  43. height: 1px;
  44. transform-origin: 0 0;
  45. transform: scaleY(0.333);
  46. }
  47. /*左边边框一像素*/
  48. .border-left-1px:after {
  49. pointer-events: none;
  50. content:"";
  51. position: absolute;
  52. left:;
  53. top:;
  54. width: 1px;
  55. height: 100%;
  56. transform-origin: 0 0;
  57. transform: scaleX(0.333);
  58. }
  59.  
  60. /*边框一像素*/
  61. .border-1px:after {
  62. pointer-events: none;
  63. content: "";
  64. box-sizing: border-box;
  65. position: absolute;
  66. left:;
  67. top:;
  68. width: 300%;
  69. height: 300%;
  70. border: 1px solid #dfdfdf;
  71. -webkit-transform: scale(0.333);
  72. transform: scale(0.333);
  73. -webkit-transform-origin: left top;
  74. transform-origin: left top;
  75. }
  76. }

移动端1px边框实现的更多相关文章

  1. 移动端1px边框

    问题:移动端1px边框,看起来总是2倍的边框大小,为了解决这个问题试用过很多方法,用图片,用js判断dpr等,都不太满意, 最后找到一个还算好用的方法:伪类 + transform 原理是把原先元素的 ...

  2. 移动端1px边框伪类宽高计算

    移动端1px边框在手机上看显得比较粗,于是我们用伪类结合css3缩放的方法去设置线条,但是如果设置div的一条边,水平线就设置宽度100%,垂直线就设置高度100%,那么如果是div的四条边呢?宽高1 ...

  3. 目前解决移动端1px边框最好的方法

    在移动端开发时,经常会遇到在视网膜屏幕中元素边框变粗的问题.本文将带你探讨边框变粗问题的产生原因及介绍目前市面上最好的解决方法. 1px 边框问题的由来 苹果 iPhone4 首次提出了 Retina ...

  4. 移动端1px边框问题

    用于手机端受dpr的影响,实际开发中,PC端和移动端展示的效果不太一样,往往在PC端显示的是1px,移动端常常是偏粗一些. 解决办法: 主要是用到伪类及缩放.在需要画边框的元素上,设置一个伪类,它的伪 ...

  5. 解决CSS移动端1px边框问题

    移动项目开发中,安卓或者IOS等高分辨率屏幕会把1px的border渲染成2px来显示,网上搜了一下,解决方法如下: 一.利用css中的transform的缩放属性解决,推荐这个.如下面代码. < ...

  6. 移动端1px边框解决方案

    在retina屏中,像素比为2(iPhone6/7/8)或3(iPhone6Plus/7Plus/8Plus),1px的边框看起来比真的1px更宽. 使用伪类加transform的方式 元素本身不定义 ...

  7. 解决移动端1px边框问题的几种方法

    1.边框粗细原因 在移动端下设置border为1px,在某些设备上看比1px粗. 这些由于不同的手机有不同的像素密度.在window对象中有一个devicePixelRatio属性,他可以反应css中 ...

  8. 移动端1px 边框完整方案(四个方向)

    使用stylus(预处理) 需要一个函数接收两个参数 第一个需要在哪个方向出现边框 第二个边框颜色 $border1px(face,$color) 根据传入的方向属性,调整其他参数 l  左右方向 t ...

  9. 关于移动端1px边框问题

    <div class="z_nei_list"> <div class="z_name_left font-size3">身份证号:&l ...

随机推荐

  1. Java8学习笔记(一)--Lambda表达式

    两个概念 函数式接口 函数式接口就是只显式声明一个抽象方法的接口.为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface,这样,当接口中声明的抽象方法多于或少于一 ...

  2. 初识 go 语言:数据类型

    目录 数据类型 指针 结构体 数组 切片 切片的方法 映射 函数闭包 结束语 前言: go语言的第三篇文章,主要讲述go语言中的数据类型,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示 ...

  3. JMeter 的调式工具

    任何的编程工具都会相应的调式工具,JMeter的调式 工具主要有五种: 1.查看结果树:含请求信息.响应信息等 2.HTTP 镜像服务器:HTTP Mirror Server用于查看请求信息 3.De ...

  4. SQL学习指南之查询入门

    查询语句 select语句由几个组件或者说子句构成.不过在MySQL中,只有一种子句是必不可少的(select子句),通常的查询语句会至少包含6个子句中的2~3个.下面的表列出了用于不同目的的各个子句 ...

  5. shapeit提取或去除指定SNP和样本(shapeit extract or exclude SNP, sample)

    shapeit最大的功能是对双链DNA进行phase和基因型进行impute.除此之外,还能提取SNP和样本,同样的,也能去除SNP和样本.下面简单介绍这两个功能. 一.提取SNP 提取SNP用到“- ...

  6. GWAS条件分析(conditional analysis)

    一.为什么要做GWAS的条件分析(conditional analysis) 我们做GWAS的时候,经常扫出一堆显著的信号,假设rs121是我们扫出来与某表型最显著相关的位点(P=1.351e-36) ...

  7. pillow的用法

    这是原图 from PIL import Image im=Image.open('C:/Users/history/Desktop/微信图片_20190408110611.jpg') r,g,b=i ...

  8. JavaJDBC整理

    1.1.1    导入驱动jar包 创建lib目录,用于存放当前项目需要的所有jar包 选择jar包,右键执行build path / Add to Build Path 前版本 package co ...

  9. SEO学习知识

    监控流量的工具 百度统计 CNZZ  51LA 谷歌分析工具 如何从平台借流量? 竞价(付费).SEO 关键词定位: 定位人:负责人 将公司的业务全部列出来 选词: 根据定位的关键词选择出我们需要优化 ...

  10. JDBC 关闭数据库连接与自动提交【转】

    // Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...