web疑难杂症

(废话写在前面~~)前端的发展太快,感觉一周一框架的节奏,很多时候我会想怎么能跟上这样的速度,今天刚刚熟悉了一个框架, 结果明天GitHub就出了一个新的比这个更好,那我应该放弃刚熟悉的框架继续去看最新的吗?很明显这样咩有头,只会不停的得不偿失,于是想了想 还是静心下来,我们从最基本的开始,解决疑难杂症巩固好基础才能更快的上手或者说更好的去开发,找到合适于项目的技术栈才是最重要的

关于移动端H5之单位

  1. 关于单位的使用收集了一共有10个,分别是px,em,pt,ex,pc,in,mm,cm,vh,vw
    1)px:像素(Pixel),相对于设备的长度单位,像素是相对于显示器屏幕分辨率而言的。譬如,WONDOWS的用户所使用的分辨率一般是96像素/英寸。而MAC的用户所使用的分辨率一般是72像素/英寸。
    2)em:相对长度单位。相对于当前对象内文本的字体尺寸。 如当前行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。
    3)pt:点(Point),绝对长度单位
    4)pc:派卡(Pica),绝对长度单位。相当于我国新四号铅字的尺寸(可以自行百度-字号与尺寸对照表)
    5)in:英寸(Inch),绝对长度单位。
    6)mm:毫米(Millimeter),绝对长度单位。
    7)cm:厘米(Centimeter),绝对长度单位。
    8)ex:相对长度单位。相对于字符“x”的高度。此高度通常为字体尺寸的一半。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。
    9)vh: 等于viewport高度的1/100.例如,如果浏览器的高是900px,1vh求得的值为9px。同理,如果显示窗口宽度为750px,1vw求得的值为7.5px。
    10)vw:设置一个字体大小。这个大小将会随着浏览器的宽度按比例缩放

其中:1in = 2.54cm = 25.4 mm = 72pt = 6pc ;
虽然收集了10个单位但是在我们开发中实际能用到的比较少,目前我所接触的项目最多的就是 px/rem


  1. REM的出现
    说到REM就要先说说em,可能也看到了和rem 就差了一个r, em 是相对长度单位,比如 如果你在body元素上设置一个字体大小,那么在body元素内的任何子元素的em值都等于这个字体大小。
....
<style>
  body{font-size: 16px;}
  div p{ 
        font-size: 1em;// 这时 p的字体大小就是 1*16  = 16px
       }
</style>
<body>
  <div>
    <p>hello world!!</p>
  </div>
</body>

上述代码表示p设置了font-size为1em。它是所继承body的字体大小的1倍,在这个例子中为16px。所以结果为16px.好处:很方便只要设置一遍body的字体大小就好了
但是,em是相对于当前对象内文本的字体尺寸,所以当我们在实际运用中 出现多层嵌套的时候

...
<style type="text/css">
        body{font-size: 16px;}
        div{
            font-size: 2em;
        }
    </style>
<body>
    <div class="demo1">
        <p>hello world!!</p>
        <div class="demo">
            hello world2!!
              <div class="demo2"> hello world3!! </div>
           </div>
    </div>
</body>

如果简单的设置了div的大小这样就会出现每一个层级字体都不一样结果如下:

效果

第一个是216;第二个就是2216;第三个就是22216了
我们可以通过去设置每一个div的font-size来解决这个问题,但是当需求复杂时就会出现各种font-size的尺寸,就比如我们要刚才的三个嵌套都能达到同一个尺寸 2*16而又不想去设置每一个div的大小,这个时候 就出现了→
rem:基于一个唯一的度量标准来按比例缩放
简单的来说只要设置了body的font-size就可以了,页面所有的元素都是基于这个根元素的大小来改变,在大多数情况下根元素为html元素;

<style type="text/css">
        body{font-size: 16px;}
        div{
            font-size: 2rem;
        }
    </style>
<body>
    <div class="demo1">
        <p>hello world!!</p>
        <div class="demo">
        hello world2!!
        <div class="demo2">
            hello world3!!
        </div>
    </div>
    </div>
    
</body>

同样的代码修改下单位效果就改变了;


rem效果

关于移动端H5之1像素边框

  1. 随着市场上各种手机端的出现,不同手机物理像素不同,对应的设备像素比不同,同样的1pxcss像素,转换成物理像素后,尺寸是不同的,所以导致了显示的差异,我们前端的开发工程师和UI设计的伙伴们就产生了分歧了,我们设置一个div的底部边框为 1px solid #000; 实际表现却是边框线是模糊的,或者是大于1px的。

参考:https://jinlong.github.io/2015/05/24/css-retina-hairlines/
https://juejin.im/entry/584e427361ff4b006cd22c7c
https://www.w3cplus.com/css/fix-1px-for-retina.html
http://www.html-js.com/article/Mobile-terminal-H5-mobile-terminal-HD-multi-screen-adaptation-scheme%203041
https://segmentfault.com/a/1190000007604842
方法一 0.5px 解决
在2014年的 WWDC,“设计响应的Web体验” 一讲中,Ted O’Connor 讲到关于“retina hairlines”(retina 极细的线)在retina屏上仅仅显示1物理像素的边框,开发者应该如何处理呢。 他们曾介绍到 iOS 8 和 OS X Yosemite 即将支持 0.5px 的边框:

image.png

这样有个问题:
问题是 retina 屏的浏览器可能不认识0.5px的边框,将会把它解释成0px,没有边框。包括 iOS 7 和 之前版本,OS X Mavericks 及以前版本,还有 Android 设备。
解决方案:通过JS来检测浏览器能否处理0.5px的边框

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);
}
// 脚本应该放在<body>内, 如果在<head>里面运行,需要包装 $(document).ready(function() {   })

然后 直接写1px即可

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

从上面的方案来看,只要加上几行JS代码即可解决问题,但是如果要兼容安卓设备,和 iOS 8 以下设备怎么办?在这个需求上就行不通了

方法二 用图片实现 border 的

这是我认为最‘实诚’的方案,顾名思义 就是用图片来平铺得到一条线
一般会使用一张6x6的图片来通过background-imageborder-width来实现具体我就不细说了可以直接看参考链接
这个方案最不好的地方就是 更换颜色就比较麻烦了,可能你会需要很多不同的图片来做,如果圆角需要特殊处理,并且边缘会模糊

方法三 用多背景渐变实现

.background-gradient-1px {
background:
linear-gradient(180deg, black, black 50%, transparent 50%) top left / 100% 1px no-repeat,
linear-gradient(90deg, black, black 50%, transparent 50%) top right / 1px 100% no-repeat,
linear-gradient(0, black, black 50%, transparent 50%) bottom right / 100% 1px no-repeat,
linear-gradient(-90deg, black, black 50%, transparent 50%) bottom left / 1px 100% no-repeat;
}
/* 或者 */
.background-gradient-1px{
background: -webkit-gradient(linear, left top, left bottom, color-stop(.5, transparent), color-stop(.5, #c8c7cc), to(#c8c7cc)) left bottom repeat-x;
background-size: 100% 1px;
}
效果

这个的缺点 显而易见 代码太多 而且圆角也很不好弄

方法四 伪类 + transform
单条border样式设置:

.scale-1px{
position: relative;
border:none;
}
.scale-1px:after{
content: '';
position: absolute;
bottom: 0;
background: #000;
width: 100%;
height: 1px;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
}

四条boder样式设置:

.scale-1px{
position: relative;
margin-bottom: 20px;
border:none;
}
.scale-1px:after{
content: '';
position: absolute;
top: 0;
left: 0;
border: 1px solid #000;
-webkit-box-sizing: border-box;
box-sizing: border-box;
width: 200%;
height: 200%;
-webkit-transform: scale(0.5);
transform: scale(0.5);
-webkit-transform-origin: left top;
transform-origin: left top;
}

严谨点的话 在使用前也判断一下,结合 JS 代码,判断是否 Retina 屏:

if(window.devicePixelRatio && devicePixelRatio >= 2){
document.querySelector('ul').className = 'scale-1px';
}

优点:
所有场景都能满足
支持圆角(伪类和本体类都需要加border-radius)
缺点:
对于已经使用伪类的元素(例如clearfix),可能需要多层嵌套

还有其他的方法 例如 动态改变 viewport ,借助JavaScript来动态修改meta标签中viewport中的initial-scale的值,然后根据dpr修改html中的font-size值,再使用rem简称Flexible方案

总结:相对而言 伪类的方案更好用,目前我一直在用的也是这个方案,之前有搜索过各种资料包括实践,目前来说都是这种方式最好使用,兼容性也最好。(如果有看官们有好的欢迎贴码谢谢)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 一、meta标签的效果 移动端页面一般会在head头部添加如下meta标签。 该meta标签是否添加对页面渲染的影...
    nimw阅读 3,530评论 0 5
  • 刚开始做移动端web开发的同学应该都碰到过页面适配问题,为什么我在开发手机上调试好的页面在其他手机会有这样或那样的...
    留七七阅读 19,322评论 5 80
  • 作者:HelKyle链接:http://www.w3cplus.com/css/when-to-use-em-vs...
    红叶丶秋鸣阅读 3,211评论 0 3
  • 信任是我们的资产,别人信任你很难,你骗别人很容易,所以,请不要骗取别人对你的信任,不划算,骗别人的同时,你...
    安好生活家阅读 356评论 0 0