mobile web retina 下 1px 边框解决方案

http://www.tuicool.com/articles/ZRv6bun

 

再谈mobile web retina 下 1px 边框解决方案

本文实际上想说的是ios8下 1px解决方案。 1px的边框在devicePixelRatio = 2的retina屏下会显示成2px,在iphone 6 plug 下,更显示成3px。由其影响美感。

还好,时代总是进步的。也许很多人都不知道, 现在IOS8下,已经支持0.5px了。 。 那么意味着,在devicePixelRatio = 2下,我们可以使用如下的css代码:

wwdc-hairline

但是在ios7以下,android等其他系统里,0.5px会被显示为0px,即该解决方案需要写hack兼容老旧系统。

三种方案:

1、JS判断UA,是否是ios8+,是的话则输出类名hairlines,为了防止重绘,这段代码加在head里即可。

if (/iP(hone|od|ad)/.test(navigator.userAgent)) {
  var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/),   version = parseInt(v[1], 10);  if(version >= 8){   document.documentElement.classList.add('hairlines')  } }

2、JS判断是否支持0.5px边框,是的话,则输出类名hairlines。

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); } // This assumes this script runs in <body>, if it runs in <head> wrap it in $(document).ready(function() { })

相比于第一种方法,这种方法的可靠性更高一些,但是需要把js放在body标签内,相对来说会有一些重绘,个人建议是用第一种方法。

3、服务端做ios版本判断,输出相应的类名

相比于JS的实现,个人更倾向于在服务端完成,这样前端也少几行代码,并且更加可靠。

如在wormhole里的实现(wormhole是nodejs环境下的一个服务端渲染模版的容器)

{{#if($plugins.detector.os.name === "ios" && $plugins.detector.os.version >= 8)}}{{set (hairlines = "hairlines")}}
{{/if}}
<html class="{{hairlines}}">

加上类名后,就可以针对该类名写相应的css了。比如:

div{border:1px solid #000} .hairlines div{border-width:0.5px}

也许你会问,那ios7以下和其他android机下怎么搞?我的建议是:还是维持老样,不去处理,随着时间的推移,我相信最终都会支持0.5 和 0.3 px边框的。

如果硬要兼容,怎么整?方案也有很多,稍微介绍下:

1、通过viewport + REM的方式来兼容。

目前这种兼容方案相对比较完美,适合新项目(老项目改用REM单位成本会比较高)。 淘宝M首页 就是这种方案。

在devicePixelRatio = 2 时,输出viewport

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

在devicePixelRatio = 3 时,输出viewport

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

同时通过设置对应viewport的rem基准值,这种方式就可以像以前一样轻松愉快的写1px了。关于REM布局,可以参考下我上一篇文章 《移动端H5页面之iphone6的适配》

其他方案(该部分内容来源于妙净同学的分享):

2、 transform: scale(0.5)

实现方式

height:1px;
-webkit-transform: scaleY(0.5);
-webkit-transform-origin:0 0;
overflow: hidden;

优点

圆角无法实现,hack代码多,实现4条边框比较闹心

缺点

只能单独使用,如果嵌套,scale的作用也会对包含的元素产生,不想要的影响,所以此种方案配合:after和:before独立使用较多,比如画一个商品的边框四条线,容器的after和before可以画2条线,利用容器的父元素的after、before再画2条线。

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

3、 box-shadow

实现方式

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

底部一条线

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

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

缺点

颜色不好处理, 黑色 rgba(0,0,0,1) 最浓的情况了。有阴影出现,不好用。

参考链接

4、 background-image

实现方式

设置1px通过css 实现的image,50%有颜色,50%透明

.border {
  background-image:linear-gradient(180deg, red, red 50%, transparent 50%),  linear-gradient(270deg, red, red 50%, transparent 50%),  linear-gradient(0deg, red, red 50%, transparent 50%),  linear-gradient(90deg, red, red 50%, transparent 50%);  background-size: 100% 1px,1px 100% ,100% 1px, 1px 100%;  background-repeat: no-repeat;  background-position: top, right top, bottom, left top;  padding: 10px; } 

优点

配合background-image,background-size,background-position 可以实现单条,多条边框。边框的颜色随意设置

缺点

如果有圆角的效果,很sorry 圆角的地方没有线框的颜色。都要写的代码也不少

参考链接

5、 用图片

实现方式

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

优点

缺点

也可以通过修改图片来达到圆角的效果,但是由于图片的原因,压缩过后的图片边缘变模糊了(不放大的情况下不明显),需要引用图片或者base64,边框颜色修改起来不方便。

参考: http://dieulot.net/css-retina-hairline

转载于:https://www.cnblogs.com/fang51/p/4555330.html

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

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

相关文章

LeetCode—55. 跳跃游戏

55. 跳跃游戏 题目描述&#xff1a; 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 考察重点&#xff1a;由前至后遍历数组&#xff0c;maxPos记录我们当…

ASP.NET----利用隐藏域向页面间数据传递

摘要&#xff1a; 隐藏域不会显示在用户的浏览器中&#xff0c; 一般是在页面中加入一个隐藏控件&#xff0c; 与服务器进行交互时把值赋给隐藏控件并提交给下一页面。隐藏域可以是任何存储在网页中的与网页有关的信息的存储库。 使用&#xff1a; 使用隐藏域存入数值时用&…

[转载]如何用关键字优化网站?

如何用关键字优化网站&#xff1f;     搜索引擎使用关键字的相关程度来决定网页的先后顺序。例如&#xff0c;如果有人搜索“ butterbeans ”&#xff0c;那么一个标题为“ the butterbean bazaar ”、里面有十余处单词“ butterbeans ”的网页&#xff0c;可能就会排在搜索…

Rust下载和安装

2019独角兽企业重金招聘Python工程师标准>>> 1、在Linux和Mac上安装Rust&#xff1a; 在Linux和Mac上安装Rust(稳定的二进制)的一个简单的方法&#xff0c;只需要在shell中运行以下命令&#xff1a; $ curl -sSf https://static.rust-lang.org/rustup.sh | sh 一个…

WP7 空闲检测 当手机处理锁屏状态时 如何让程序继续运行 如 在锁屏状态下继续录音。...

我们都知道&#xff0c;当手机锁屏后&#xff0c;我们的app 会自动进行休眠或是说墓碑状态。也就是说app已经空闲&#xff0c;这样最大的好处是省电。关于些可以在MSDN上找到非常详细的说明&#xff1a;http://msdn.microsoft.com/zh-cn/library/ff941090(vvs.92).aspx 我这里要…

LeetCode—300. 最长递增子序列

300. 最长递增子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组…

思念

你不在的时候 我很想你 想你的时候 我偷偷的看你,拿着照片 然后轻轻的放在 自己的枕边 你不在的时候 我常常幻想 有一天 我们一起去海边 看潮起潮落 欢乐嬉戏 看着你 自由自在的 捡海边的贝壳 和留在沙滩上的足迹 你不在的时候 我常常思念 带你去看美丽的风景 牵着你的手 走过黄…

TreeView 实现单选与多选!

最近在做临测项目,涉及到了,实现用户的单选与多选,用户中从域中域中读取的.查找了一些资料,实现了此方法,大家一起分享一下.UserTree.aspx<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4…

Skype for Business Server 2015-08-反向代理-发布-统一沟通

申明&#xff1a;文章中部分内容有涉及官方帮助或者网上资源整合&#xff0c;如有违权&#xff0c;请速与作者联系&#xff0c;谢谢&#xff01;作者&#xff1a;316191099qq.com培训&#xff1a;Skype for Business Server 2015-项目实战-培训-QQ群:65235615。&#xff08;学员…

架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?

操作服务器上的生产环境&#xff0c;一定要慎之又慎&#xff0c;安全第一&#xff0c;优化第二&#xff01; 一些基本原理 说到清理内存&#xff0c;那么不得不提到/proc这一个虚拟文件系统&#xff0c;这里面的数据和文件都是内存中的实时数据&#xff0c;很多参数的获取都可以…

解题报告 Diamonds

1. 题目 diamonds 题目描述 小keke同学非常喜欢玩俄罗斯方块&#xff08;*^*&#xff09;,他最近发现传统的俄罗斯方块很无趣&#xff0c;于是他想到了一个新规则的游戏来恶心你&#xff08;……&#xff0c;没素质啊&#xff09;。 游戏是这样的&#xff1a; 给定你一个宽度为…

LeetCode—233. 数字 1 的个数(困难)

233. 数字 1 的个数&#xff08;困难&#xff09; 题目描述&#xff1a; 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 考察重点&#xff1a;分别计算个、十、百…千位上1出现的次数&#xff0c;再求和。 func countDigitOne(n int) int…

趣味教程:从女娲造人谈类、属性、方法及实例

前言:相信大家都听说过女娲造人的故事&#xff0c;不过细节可能不会太清楚&#xff0c;我现在略述如下&#xff0c;您可要仔细听哦&#xff0c;这和我们今天要聊的主题有莫大的关系呀。 女娲是一个人身龙尾的女神。盘古开天辟地以后&#xff0c;也就在天地间到处游历。她虽然是…

JavaScript--fullPage.js插件

GitHub:https://github.com/alvarotrigo/fullPage.js FullPage.js是一个基于JQuery的插件,可以很方便的制作出全屏网站; 一 特点: 1.支持鼠标滚动;2.支持键盘控制前进和后退;3.多个回调函数;4.支持手机/平板触摸事件;5.支持CSS3动画;6.支持窗口缩放,缩放时自动调整;7.jQuery兼…

细细讲述Java技术开发的那些不为人知的规则

本文介绍的Java规则的说明分为3个主要级别&#xff0c;中级是平时开发用的比较多的级别&#xff0c;在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。 一、在finally方法里关掉input或者output资源 方法体里面定义了input或者output流…

SQL Server 获取所有表和数据的批量操作

最近要写触发器&#xff0c;对数据库中每个用户表都要写&#xff0c;一查170多个表&#xff0c;晕了~&#xff0c;想偷懒自制程序完成这些一些批量的操作&#xff0c;所以搜集了一下对数据库其他操作的东东&#xff01; --一时兴起&#xff0c;随处搜集 1、创建数据库 CREATE D…

创业,程序员心中说不出的痛

一个从事IT行业5年以上的人&#xff0c;你问他有没有想过自己创业&#xff0c;他说没有&#xff0c;那95&#xff05;的可能是假的。不过&#xff0c;我属于那剩下5&#xff05;里面的其中一个。也许是受我父亲的影响&#xff0c;从小我就潜移默化的受到这样的教育&#xff1a;…

LeetCode—301. 删除无效的括号(困难)

301. 删除无效的括号&#xff08;困难&#xff09; 题目描述&#xff1a; 给你一个由若干括号和字母组成的字符串 s &#xff0c;删除最小数量的无效括号&#xff0c;使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。 考察重点&#xff1a;题目要求找…

Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式...

Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式作者&#xff1a;chszs。转载需注明。博客主页&#xff1a;http://blog.csdn.net/chszs1、软件环境&#xff1a;OpenSUSE 13.1 x64MySQL 5.6.20 x642、採用RPM包安装MySQ…

进销存和财务方面业务知识了解

最近由于工作的需要&#xff0c;需要了解进销存的业务&#xff0c;还有财务方面的一些知识&#xff0c;需要对业务有很好的把握能力&#xff0c;再接再励&#xff0c;加油看书&#xff0c;学习了哦&#xff0c;并且还有理论结合实际来了解&#xff0c; Busying Now.转载于:http…