web疑難雜癥

(廢話寫在前面~~)前端的發(fā)展太快静陈,感覺(jué)一周一框架的節(jié)奏燕雁,很多時(shí)候我會(huì)想怎么能跟上這樣的速度诞丽,今天剛剛熟悉了一個(gè)框架, 結(jié)果明天GitHub就出了一個(gè)新的比這個(gè)更好拐格,那我應(yīng)該放棄剛熟悉的框架繼續(xù)去看最新的嗎僧免?很明顯這樣咩有頭,只會(huì)不停的得不償失捏浊,于是想了想 還是靜心下來(lái)懂衩,我們從最基本的開(kāi)始,解決疑難雜癥鞏固好基礎(chǔ)才能更快的上手或者說(shuō)更好的去開(kāi)發(fā)金踪,找到合適于項(xiàng)目的技術(shù)棧才是最重要的

關(guān)于移動(dòng)端H5之單位

  1. 關(guān)于單位的使用收集了一共有10個(gè)浊洞,分別是px,em胡岔,pt沛申,ex,pc姐军,in铁材,mm,cm奕锌,vh著觉,vw
    1)px:像素(Pixel),相對(duì)于設(shè)備的長(zhǎng)度單位,像素是相對(duì)于顯示器屏幕分辨率而言的惊暴。譬如饼丘,WONDOWS的用戶所使用的分辨率一般是96像素/英寸。而MAC的用戶所使用的分辨率一般是72像素/英寸辽话。
    2)em:相對(duì)長(zhǎng)度單位肄鸽。相對(duì)于當(dāng)前對(duì)象內(nèi)文本的字體尺寸。 如當(dāng)前行內(nèi)文本的字體尺寸未被人為設(shè)置油啤,則相對(duì)于瀏覽器的默認(rèn)字體尺寸典徘。
    3)pt:點(diǎn)(Point),絕對(duì)長(zhǎng)度單位益咬。
    4)pc:派卡(Pica)逮诲,絕對(duì)長(zhǎng)度單位。相當(dāng)于我國(guó)新四號(hào)鉛字的尺寸(可以自行百度-字號(hào)與尺寸對(duì)照表)幽告。
    5)in:英寸(Inch)梅鹦,絕對(duì)長(zhǎng)度單位。
    6)mm:毫米(Millimeter)冗锁,絕對(duì)長(zhǎng)度單位齐唆。
    7)cm:厘米(Centimeter),絕對(duì)長(zhǎng)度單位冻河。
    8)ex:相對(duì)長(zhǎng)度單位箍邮。相對(duì)于字符“x”的高度抛腕。此高度通常為字體尺寸的一半。如當(dāng)前對(duì)行內(nèi)文本的字體尺寸未被人為設(shè)置媒殉,則相對(duì)于瀏覽器的默認(rèn)字體尺寸。
    9)vh: 等于viewport高度的1/100.例如摔敛,如果瀏覽器的高是900px,1vh求得的值為9px廷蓉。同理,如果顯示窗口寬度為750px,1vw求得的值為7.5px马昙。
    10)vw:設(shè)置一個(gè)字體大小桃犬。這個(gè)大小將會(huì)隨著瀏覽器的寬度按比例縮放

其中:1in = 2.54cm = 25.4 mm = 72pt = 6pc 行楞;
雖然收集了10個(gè)單位但是在我們開(kāi)發(fā)中實(shí)際能用到的比較少攒暇,目前我所接觸的項(xiàng)目最多的就是 px/rem


  1. REM的出現(xiàn)
    說(shuō)到REM就要先說(shuō)說(shuō)em,可能也看到了和rem 就差了一個(gè)r, em 是相對(duì)長(zhǎng)度單位子房,比如 如果你在body元素上設(shè)置一個(gè)字體大小形用,那么在body元素內(nèi)的任何子元素的em值都等于這個(gè)字體大小。
....
<style>
  body{font-size: 16px;}
  div p{ 
        font-size: 1em;// 這時(shí) p的字體大小就是 1*16  = 16px
       }
</style>
<body>
  <div>
    <p>hello worldVず肌田度!</p>
  </div>
</body>

上述代碼表示p設(shè)置了font-size為1em。它是所繼承body的字體大小的1倍解愤,在這個(gè)例子中為16px镇饺。所以結(jié)果為16px.好處:很方便只要設(shè)置一遍body的字體大小就好了
但是,em是相對(duì)于當(dāng)前對(duì)象內(nèi)文本的字體尺寸,所以當(dāng)我們?cè)趯?shí)際運(yùn)用中 出現(xiàn)多層嵌套的時(shí)候

...
<style type="text/css">
        body{font-size: 16px;}
        div{
            font-size: 2em;
        }
    </style>
<body>
    <div class="demo1">
        <p>hello worldK徒病奸笤!</p>
        <div class="demo">
            hello world2!哼鬓!
              <div class="demo2"> hello world3<嘤摇! </div>
           </div>
    </div>
</body>

如果簡(jiǎn)單的設(shè)置了div的大小這樣就會(huì)出現(xiàn)每一個(gè)層級(jí)字體都不一樣結(jié)果如下:

效果

第一個(gè)是216;第二個(gè)就是2216异希;第三個(gè)就是22216了
我們可以通過(guò)去設(shè)置每一個(gè)div的font-size來(lái)解決這個(gè)問(wèn)題秸侣,但是當(dāng)需求復(fù)雜時(shí)就會(huì)出現(xiàn)各種font-size的尺寸,就比如我們要?jiǎng)偛诺娜齻€(gè)嵌套都能達(dá)到同一個(gè)尺寸 2*16而又不想去設(shè)置每一個(gè)div的大小宠互,這個(gè)時(shí)候 就出現(xiàn)了→
rem:基于一個(gè)唯一的度量標(biāo)準(zhǔn)來(lái)按比例縮放
簡(jiǎn)單的來(lái)說(shuō)只要設(shè)置了body的font-size就可以了味榛,頁(yè)面所有的元素都是基于這個(gè)根元素的大小來(lái)改變,在大多數(shù)情況下根元素為html元素予跌;

<style type="text/css">
        body{font-size: 16px;}
        div{
            font-size: 2rem;
        }
    </style>
<body>
    <div class="demo1">
        <p>hello world2!</p>
        <div class="demo">
        hello world2H帷频轿!
        <div class="demo2">
            hello world34寡摹!
        </div>
    </div>
    </div>
    
</body>

同樣的代碼修改下單位效果就改變了航邢;


rem效果

關(guān)于移動(dòng)端H5之1像素邊框

  1. 隨著市場(chǎng)上各種手機(jī)端的出現(xiàn)耕赘,不同手機(jī)物理像素不同,對(duì)應(yīng)的設(shè)備像素比不同膳殷,同樣的1pxcss像素操骡,轉(zhuǎn)換成物理像素后,尺寸是不同的赚窃,所以導(dǎo)致了顯示的差異册招,我們前端的開(kāi)發(fā)工程師和UI設(shè)計(jì)的伙伴們就產(chǎn)生了分歧了,我們?cè)O(shè)置一個(gè)div的底部邊框?yàn)?1px solid #000; 實(shí)際表現(xiàn)卻是邊框線是模糊的勒极,或者是大于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,“設(shè)計(jì)響應(yīng)的Web體驗(yàn)” 一講中辱匿,Ted O’Connor 講到關(guān)于“retina hairlines”(retina 極細(xì)的線)在retina屏上僅僅顯示1物理像素的邊框键痛,開(kāi)發(fā)者應(yīng)該如何處理呢。 他們?cè)榻B到 iOS 8 和 OS X Yosemite 即將支持 0.5px 的邊框:

image.png

這樣有個(gè)問(wèn)題:
問(wèn)題是 retina 屏的瀏覽器可能不認(rèn)識(shí)0.5px的邊框匾七,將會(huì)把它解釋成0px散休,沒(méi)有邊框。包括 iOS 7 和 之前版本乐尊,OS X Mavericks 及以前版本戚丸,還有 Android 設(shè)備。
解決方案:通過(guò)JS來(lái)檢測(cè)瀏覽器能否處理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);
}
// 腳本應(yīng)該放在<body>內(nèi)扔嵌, 如果在<head>里面運(yùn)行限府,需要包裝 $(document).ready(function() {   })

然后 直接寫1px即可

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

從上面的方案來(lái)看,只要加上幾行JS代碼即可解決問(wèn)題痢缎,但是如果要兼容安卓設(shè)備胁勺,和 iOS 8 以下設(shè)備怎么辦?在這個(gè)需求上就行不通了

方法二 用圖片實(shí)現(xiàn) border 的

這是我認(rèn)為最‘實(shí)誠(chéng)’的方案独旷,顧名思義 就是用圖片來(lái)平鋪得到一條線
一般會(huì)使用一張6x6的圖片來(lái)通過(guò)background-imageborder-width來(lái)實(shí)現(xiàn)具體我就不細(xì)說(shuō)了可以直接看參考鏈接
這個(gè)方案最不好的地方就是 更換顏色就比較麻煩了署穗,可能你會(huì)需要很多不同的圖片來(lái)做,如果圓角需要特殊處理嵌洼,并且邊緣會(huì)模糊

方法三 用多背景漸變實(shí)現(xiàn)

.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;
}
效果

這個(gè)的缺點(diǎn) 顯而易見(jiàn) 代碼太多 而且圓角也很不好弄

方法四 偽類 + transform
單條border樣式設(shè)置:

.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樣式設(shè)置:

.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;
}

嚴(yán)謹(jǐn)點(diǎn)的話 在使用前也判斷一下案疲,結(jié)合 JS 代碼,判斷是否 Retina 屏:

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

優(yōu)點(diǎn):
所有場(chǎng)景都能滿足
支持圓角(偽類和本體類都需要加border-radius)
缺點(diǎn):
對(duì)于已經(jīng)使用偽類的元素(例如clearfix)麻养,可能需要多層嵌套

還有其他的方法 例如 動(dòng)態(tài)改變 viewport 褐啡,借助JavaScript來(lái)動(dòng)態(tài)修改meta標(biāo)簽中viewport中的initial-scale的值,然后根據(jù)dpr修改html中的font-size值鳖昌,再使用rem簡(jiǎn)稱Flexible方案

總結(jié):相對(duì)而言 偽類的方案更好用备畦,目前我一直在用的也是這個(gè)方案低飒,之前有搜索過(guò)各種資料包括實(shí)踐,目前來(lái)說(shuō)都是這種方式最好使用懂盐,兼容性也最好褥赊。(如果有看官們有好的歡迎貼碼謝謝)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莉恼,隨后出現(xiàn)的幾起案子拌喉,更是在濱河造成了極大的恐慌,老刑警劉巖类垫,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琅坡,居然都是意外死亡悉患,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門榆俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)售躁,“玉大人,你說(shuō)我怎么就攤上這事茴晋∨憬荩” “怎么了呕屎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵颁湖,是天一觀的道長(zhǎng)腊尚。 經(jīng)常有香客問(wèn)我萨咕,道長(zhǎng)畜号,這世上最難降的妖魔是什么趾徽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任啥供,我火速辦了婚禮忘伞,結(jié)果婚禮上撮执,老公的妹妹穿的比我還像新娘微峰。我一直安慰自己,他們只是感情好抒钱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蜓肆。 她就那樣靜靜地躺著,像睡著了一般谋币。 火紅的嫁衣襯著肌膚如雪仗扬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天蕾额,我揣著相機(jī)與錄音厉颤,去河邊找鬼。 笑死凡简,一個(gè)胖子當(dāng)著我的面吹牛逼友,可吹牛的內(nèi)容都是我干的精肃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帜乞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼司抱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起黎烈,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤习柠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后照棋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體资溃,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烈炭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溶锭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡符隙,死狀恐怖趴捅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霹疫,我是刑警寧澤拱绑,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丽蝎,受9級(jí)特大地震影響猎拨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屠阻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一迟几、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栏笆,春花似錦类腮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至针饥,卻和暖如春厂抽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁眼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工筷凤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓藐守,卻偏偏與公主長(zhǎng)得像挪丢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卢厂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案乾蓬? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • 一、meta標(biāo)簽的效果 移動(dòng)端頁(yè)面一般會(huì)在head頭部添加如下meta標(biāo)簽慎恒。 該meta標(biāo)簽是否添加對(duì)頁(yè)面渲染的影...
    nimw閱讀 3,545評(píng)論 0 5
  • 剛開(kāi)始做移動(dòng)端web開(kāi)發(fā)的同學(xué)應(yīng)該都碰到過(guò)頁(yè)面適配問(wèn)題任内,為什么我在開(kāi)發(fā)手機(jī)上調(diào)試好的頁(yè)面在其他手機(jī)會(huì)有這樣或那樣的...
    留七七閱讀 19,364評(píng)論 5 80
  • 作者:HelKyle鏈接:http://www.w3cplus.com/css/when-to-use-em-vs...
    紅葉丶秋鳴閱讀 3,231評(píng)論 0 3
  • 信任是我們的資產(chǎn),別人信任你很難融柬,你騙別人很容易死嗦,所以,請(qǐng)不要騙取別人對(duì)你的信任粒氧,不劃算越除,騙別人的同時(shí),你...
    安好生活家閱讀 360評(píng)論 0 0