CSS面試題

css

盒模型

回答問題的時(shí)候要整理思路,也就是你的思考方式是怎么樣的?
盒模型有兩種,W3C 和IE 盒子模型
1、W3C定義的盒模型包括margin、border、padding、content,元素的寬度width=content的寬度
2、IE盒模型與W3C盒模型的唯一區(qū)別就是元素的寬度,元素的width=border + padding + content
2) 對盒模型的理解
IE定義的盒模型較為合理,所以在css3中新增了box-sizing,包含兩個(gè)屬性content-box和border-box。
(1)content-box 元素的width = content
(2)border-box 元素的width = border + padding + content

3)更多理解
對于行內(nèi)元素 margin-top/margin-bottom對于上下元素?zé)o效,margin-left/margin-right有效
對于相鄰的塊級元素margin-top和margin-bottom兩者疊加按照一定的規(guī)則
(1) 都是整數(shù) margin值取兩者的最大值
(2) 都是負(fù)數(shù) margin值取最小值
(3)兩者正負(fù)相反,margin值取兩者之和

css單位

px
它是圖像顯示的基本單元,既不是一個(gè)確定的物理量,也不是一個(gè)點(diǎn)或者小方塊,而是一個(gè)抽象概念。很多時(shí)候,px也常被稱為 CSS 像素。
rem
我們將從你已經(jīng)熟悉的東西開始。em單位被定義為當(dāng)前字體大小。例如,如果你在body元素上設(shè)置一個(gè)字體大小,那么在body元素內(nèi)的任何子元素的em值都等于這個(gè)字體大小。

<body>
    <div class="test">Test</div>
</body> 

body { font-size: 14px; } 
div { font-size: 1.2em; // calculated at 14px * 1.2, or 16.8px 
}

在這里,我們說這個(gè)div將有一個(gè)1.2em的font-size。它是所繼承的字體大小的1.2倍,在這個(gè)例子中為14px。結(jié)果為16.8px.
但是,當(dāng)你在每個(gè)元素內(nèi)都級聯(lián)em定義的字體大小將會發(fā)生什么?在下面的代碼片段中我們應(yīng)用和上面一模一樣的CSS.每個(gè)div從它們的父節(jié)點(diǎn)繼承字體大小,帶給我們逐漸增加的字體大小。

<body> 
    <div> Test <!-- 14 * 1.2 = 16.8px -->          
        <div> Test <!-- 16.8 * 1.2 = 20.16px -->        
        <div> Test <!-- 20.16 * 1.2 = 24.192px--></div> 
    </div> 
 </div> 
 </body>

em
在CSS 中,如果沒有任何 CSS 規(guī)則影響的前提之下,通常情況下:

1em的長度是:1em = 16px = 0.17in = 12pt = 1pc = 4.mm = 0.42cm

<body style=“font-size:1.5em”>
    <h3 style=“font-size:1.5em”>em單位<h3>
<body>

vh和vw
vh等于viewport高度的1/100.例如,如果瀏覽器的高是900px,1vh求得的值為9px。同理,如果顯示窗口寬度為750px,1vw求得的值為7.5px。

.slide {
    height: 100vh;
}

vmin 和 vmax
vh和vm總是與視口的高度和寬度有關(guān),與之不同的,vmin和vmax是與這次寬度和高度的最大值或最小值有關(guān),取決于哪個(gè)更大和更小。例如,如果瀏覽器設(shè)置為1100px寬、700px高,1vmin會是7px,1vmax為11px。然而,如果寬度設(shè)置為800px,高度設(shè)置為1080px,1vmin將會等于8px而1vmax將會是10.8px。
設(shè)想你需要一個(gè)總是在屏幕上可見的元素。使用高度和寬度設(shè)置為低于100的vmin值將可以實(shí)現(xiàn)這個(gè)效果。例如,一個(gè)正方形的元素總是至少接觸屏幕的兩條邊可能是這樣定義的:

.box { 
    height: 100vmin; 
    width: 100vmin; 
    }

如果你需要一個(gè)總是覆蓋可視窗口的正方形(一直接觸屏幕的四條邊),使用相同的規(guī)則只是把單位換成vmax。

.box {
    height: 100vmax; 
    width: 100vmax; 
    }

ex 和 ch
ex和ch單位,與em和rem相似,依賴于當(dāng)前字體和字體大小。然而,與em和rem不同的是,這兩個(gè)單位只也依賴于font-family,因?yàn)樗鼈儽欢榛谔厥庾煮w的方案。

css選擇器

1、標(biāo)簽名選擇器:通過標(biāo)簽的名稱找到指定標(biāo)簽
格式:元素名{ }
2、類選擇器:通過標(biāo)簽的class屬性值選中指定標(biāo)簽,多個(gè)標(biāo)簽可以有相同的class值
格式:.d1{ }
3、id選擇器:通過id找到標(biāo)簽,一個(gè)html文件中id不能重復(fù)
格式: #id{}
4、派生選擇器(后代選擇器):類似于路徑,找到符合要求的標(biāo)簽,會匹配所有的后代標(biāo)簽
格式: ul li a{} #id li a{}
5、子元素選擇器:和后代類似,但是只能獲得子元素
格式: ul>li>a{}
6、分組選擇器:可以將多種選擇器結(jié)合到一起使用,用來統(tǒng)一設(shè)定樣式
格式: h1,h2,#abc,.m{ }
7、偽元素選擇器:偽元素選擇器選擇的是元素的狀態(tài),狀態(tài)分為以下幾種:

bfc 清除浮動(dòng)

BFC的原理(渲染規(guī)則):
1.垂直方向發(fā)生重疊
2.BFC的區(qū)域不會與box重疊(因此可以用來清除浮動(dòng))
3.BFC是一個(gè)獨(dú)立的容器,外面的元素不會影響里面的元素,反之,里面的元素也不會影響外面的元素
4.計(jì)算BFC的高度時(shí),浮動(dòng)元素不參與計(jì)算

如何創(chuàng)建BFC
1.float的值不為null
2.position的值不為static或者relative
3.display的值是inline-block、table-cell、flex、table-caption或者inline-flex
4.overflow的值為hidden或者auto

清除浮動(dòng)的四種方式
1.overflow: hidden
找到浮動(dòng)元素的父元素,添加overflow: hidden,觸發(fā)BFC清除浮動(dòng)
缺點(diǎn):內(nèi)容增多的時(shí)候容易造成不會自動(dòng)換行導(dǎo)致內(nèi)容被隱藏掉,無法顯示要溢出的元素
2.額外標(biāo)簽法
在最后一個(gè)浮動(dòng)標(biāo)簽后,新加一個(gè)標(biāo)簽,給其設(shè)置clear:both;
缺點(diǎn):margin失效。兩個(gè)div之間,沒有任何的間隙
3.使用after偽元素清除浮動(dòng)

  .clearfix:after{
   content:"";//設(shè)置內(nèi)容為空
   height:0;//高度為0
   line-height:0;//行高為0
           display:block;//將文本轉(zhuǎn)為塊級元素
   visibility:hidden;//將元素隱藏
   clear:both//清除浮動(dòng)
 }
 .clearfix{
   zoom:1;為了兼容IE
  }

4.使用before和after雙偽元素清除浮動(dòng)

.clearfix:after,.clearfix:before{
        content: "";
        display: table;
    }
    .clearfix:after{
        clear: both;
    }
    .clearfix{
        *zoom: 1;
    }
層疊上下文

首先,z-index屬性值并不是在任何元素上都有效果。它僅在定位元素(定義了position屬性,且屬性值為非static值的元素)上有效果。
判斷元素在Z軸上的堆疊順序,不僅僅是直接比較兩個(gè)元素的z-index值的大小,這個(gè)堆疊順序?qū)嶋H由元素的層疊上下文、層疊等級共同決定。
如何產(chǎn)生“層疊上下文”
層疊上下文也基本上是有一些特定的CSS屬性創(chuàng)建的,一般有3種方法:
1、HTML中的根元素<html></html>本身j就具有層疊上下文,稱為“根層疊上下文”。
2、普通元素設(shè)置position屬性為非static值并設(shè)置z-index屬性為具體數(shù)值,產(chǎn)生層疊上下文。
3、CSS3中的新屬性也可以產(chǎn)生層疊上下文。

常見頁面布局

(1)流式布局 Fluid
流布局與固定寬度布局基本不同點(diǎn) 就在于對網(wǎng)站尺寸的側(cè)量單位不同。固定寬度布局使用的是像素,但是流布局使用的是百分比,這位網(wǎng)頁提供了很強(qiáng)的可塑性和流動(dòng)性。換句話說,通過設(shè)置百分比,我們不需要考慮設(shè)備尺寸或者屏幕寬度大小了,可以為每種情形找到一種可行的方案,應(yīng)為你的設(shè)計(jì)尺寸將適應(yīng)所有的設(shè)備尺寸。流布局與媒體查詢和優(yōu)化樣式技術(shù)密切相關(guān)。
(2)固定布局 Fixed
在固定布局中,網(wǎng)頁的寬度是必須指定為一個(gè)像素值,一般為960px。過去,開發(fā)人員發(fā)現(xiàn)960px是最適合作為網(wǎng)格布局的寬度,因?yàn)?60可以整除3,4,5,6,8,10,12和15。在今天,在web開發(fā)中還是比較普遍使用固定寬度布局的,因?yàn)檫@種布局具有很強(qiáng)的穩(wěn)定性與可控性。但是同時(shí)也有一些劣勢,固定寬度必須考慮網(wǎng)站是否可以適用于不同的屏幕寬度。
(3)彈性布局 Elastic
彈性布局跟流布局很像,主要不同是大小單位。彈性布局的大小單位不是像素或者百分比,而是em或者rem,避免了根據(jù)px局部在高分辨率下幾乎無法辨識的缺點(diǎn),又相對于%百分比更加靈活,同時(shí)可以支持瀏覽器的字體大小調(diào)整和縮放等的正常顯示,需要一段時(shí)間適應(yīng)而且不易從其他布局轉(zhuǎn)換過來。
(4)伸縮 Flex box
使用css3 Flex系列屬性進(jìn)行相對布局。對于富媒體和復(fù)雜排版的支持非常大,但是存在兼容性問題。
(5)響應(yīng)式
使用@media媒體查詢給不同尺寸和介質(zhì)的設(shè)備切換不同的樣式。優(yōu)秀的響應(yīng)范圍設(shè)計(jì)可以給適配范圍內(nèi)的設(shè)備做好的體驗(yàn)。

響應(yīng)式布局

響應(yīng)式布局等于流動(dòng)網(wǎng)格布局,而自適應(yīng)布局等于使用固定分割點(diǎn)來進(jìn)行布局。
(1)設(shè)置 Meta 標(biāo)簽

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

(user-scalable = no 屬性能夠解決 iPad 切換橫屏之后觸摸才能回到具體尺寸的問題。 )
(2)通過媒介查詢來設(shè)置樣式 Media Queries
Media Queries 是響應(yīng)式設(shè)計(jì)的核心。
它根據(jù)條件告訴瀏覽器如何為指定視圖寬度渲染頁面。假如一個(gè)終端的分辨率小于980px,那么可以這樣寫:

@media screen and (max-width: 980px) {
  #head { … }
  #content { … }
  #footer { … }
}

(3)設(shè)置多種試圖寬度
假如我們要設(shè)定兼容 iPad 和 iphone 的視圖,那么可以這樣設(shè)置:

/** iPad **/
@media only screen and (min-width: 768px) and (max-width: 1024px) {}
/** iPhone **/
@media only screen and (min-width: 320px) and (max-width: 767px) {}
css預(yù)處理,后處理

Sass、LESS和Stylus的對比
Less:變量處理方式–懶加載,所有 Less 變量的計(jì)算,都是以這個(gè)變量最后一次被定義的值為準(zhǔn)。

Less

@size: 10px;
.box { width: @size; } 
@size: 20px; 
.ball { width: @size; }

輸出:

.box { width: 20px; } 
.ball { width: 20px; }

Stylus

size = 10px
.box
  width: size
size = 20px
.ball
  width: size

輸出:

.box {
  width: 10px;
}
.ball {
  width: 20px;
}
css3新特性
  • 圓角邊框
  • 多背景圖
  • 顏色和透明度(由原來的rgb到現(xiàn)在的rgba)
  • 多列布局和彈性盒模型
  • 盒子的變幻(2D、3D)
  • 過渡和動(dòng)畫
  • 引入web字體(在服務(wù)器端存儲)
  • 媒體查詢
  • 陰影
animation和transiton的相關(guān)屬性

transition:
過渡屬性 過渡所需要時(shí)間 過渡動(dòng)畫函數(shù) 過渡延遲時(shí)間;默認(rèn)值分別為:all 0 ease 0
1、局限性:
1)只能設(shè)置一個(gè)屬性
2)需要偽類/事件觸發(fā)才執(zhí)行
3)只能設(shè)置動(dòng)畫初始值和結(jié)束值
2、過渡函數(shù):
liner :勻速
ease-in:減速
ease-out:加速
ease-in-out:先加速再減速
cubic-bezier:三次貝塞爾曲線
3、以下情況下,屬性值改變不能產(chǎn)生過渡效果
1)background-image,如url(a.jpg)到url(b.jpg)(與瀏覽器支持相關(guān),有的瀏覽器不支持)等,瀏覽器支持情況
2)float浮動(dòng)元素
3)height或width使用auto值=>解決:用js計(jì)算
4)display屬性在none和其他值(block、inline-block、inline)之間變換 =>解決:加上延時(shí) setTimeout(function(){ },0)
5)position在stativ和absolute之間變換
animation:
1)可以控制到每一幀

  1. 結(jié)合@ keyframes使用
    配合動(dòng)畫:
    1)寬高變化
      高度從0到auto:
      a、用max-height (缺陷:實(shí)際內(nèi)容不會達(dá)到該高度,卡頓)
      b、transition+js
    2)縮放scale(中心開始)
    3)位置移動(dòng)
      a、transform: translate(不適用position: absolute;transform: translate布局)
      b、top/left/right/bottom與absolute
      c、margin-top(left,right,bottom)
display哪些取值

block 此元素將顯示為塊級元素,此元素前后會帶有換行符。
none 此元素不會被顯示。
inline-block 行內(nèi)塊元素。
list-item 此元素會作為列表顯示。
table 此元素會作為塊級表格來顯示
inherit 規(guī)定應(yīng)該從父元素繼承 display 屬性的值

相鄰的兩個(gè)inline-block節(jié)點(diǎn)為什么會出現(xiàn)間隔,該如何解決

元素被當(dāng)成行內(nèi)元素排版的時(shí)候,原來HTML代碼中的回車換行被轉(zhuǎn)成一個(gè)空白符,在字體不為0的情況下,空白符占據(jù)一定寬度,所以inline-block的元素之間就出現(xiàn)了空隙。這些元素之間的間距會隨著字體的大小而變化,當(dāng)行內(nèi)元素font-size:16px時(shí),間距為8px。
方法1: font-size
方法2:改變書寫方式
方法3:使用margin負(fù)值
方法4:使用word-spacing或letter-spacing

meta viewport 移動(dòng)端適配

meta viewport 的6個(gè)屬性:
width : 設(shè)置viewport 的寬度
height: 設(shè)置viewport 的高度
initial-scale : 設(shè)置頁面的初始縮放值
minimum-scale :允許用戶的最小縮放值
maximum-scale:允許用戶的最大縮放值
user-scalable: 是否允許用戶進(jìn)行縮放,值為"no"或"yes", no 代表不允許,yes代表允許
3個(gè)viewport:
(1)layout viewport
如果把移動(dòng)設(shè)備上瀏覽器的可視區(qū)域設(shè)為viewport的話,某些網(wǎng)站會因?yàn)関iewport太窄而顯示錯(cuò)亂,所以這些瀏覽器就默認(rèn)會把viewport設(shè)為一個(gè)較寬的值,比如980px,使得即使是那些為PC瀏覽器設(shè)計(jì)的網(wǎng)站也能在移動(dòng)設(shè)備瀏覽器上正常顯示。這個(gè)瀏覽器默認(rèn)的viewport叫做 layout viewport。layout viewport的寬度可以通過 document.documentElement.clientWidth來獲取。
(2)visual viewport
layout viewport的寬度是大于瀏覽器可視區(qū)域的寬度的,所以還需要一個(gè)viewport來代表瀏覽器可視區(qū)域的大小,這個(gè)viewport叫做 visual viewport。visual viewport的寬度可以通過 document.documentElement.innerWidth來獲取。
(3)ideal viewport
ideal viewport是一個(gè)能完美適配移動(dòng)設(shè)備的viewport。首先,不需要縮放和橫向滾動(dòng)條就能正常查看網(wǎng)站的所有內(nèi)容;其次,顯示的文字、圖片大小合適,如14px的文字不會因?yàn)樵谝粋€(gè)高密度像素的屏幕里顯示得太小而無法看清,無論是在何種密度屏幕,何種分辨率下,顯示出來的大小都差不多。這個(gè)viewport叫做 ideal viewport。
ideal viewport并沒有一個(gè)固定的尺寸,不同的設(shè)備有不同的ideal viewport。例如,所有的iphone的ideal viewport寬度都是320px,無論它的屏幕寬度是320還是640。
ideal viewport 的意義在于,無論在何種分辨率的屏幕下,針對ideal viewport 而設(shè)計(jì)的網(wǎng)站,不需要縮放和橫向滾動(dòng)條都可以完美地呈現(xiàn)給用戶。

CSS實(shí)現(xiàn)寬度自適應(yīng)100%,寬高16:9的比例的矩形

第一步先計(jì)算高度,假設(shè)寬100%,那么高為h=9/16=56.25%
第二步利用之前所說設(shè)置padding-bottom方法實(shí)現(xiàn)矩形

<div class="box">
  <div class="scale">
    <p>這是一個(gè)16:9的矩形</p>
  </div>
</div>

.box {
  width: 80%;
}

.scale {
  width: 100%;
  padding-bottom: 56.25%;
  height: 0;
  position: relative;
}

.item {
  width: 100%;
  height: 100%;
  background-color: aquamarine;
  position: absolute;
}
畫三角形

2.1 Triangle Up

#triangle-up {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid red;
} 

2.2 Triangle Down

#triangle-down {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 100px solid red;
} 

2.3 Triangle Left

#triangle-left {
    width: 0;
    height: 0;
    border-top: 50px solid transparent;
    border-right: 100px solid red;
    border-bottom: 50px solid transparent;
} 

2.4 Triangle Right

#triangle-right {
    width: 0;
    height: 0;
    border-top: 50px solid transparent;
    border-left: 100px solid red;
    border-bottom: 50px solid transparent;
} 

2.5 Triangle Top Left

#triangle-topleft {
    width: 0;
    height: 0;
    border-top: 100px solid red;
    border-right: 100px solid transparent;
} 

2.6 Triangle Top Right

#triangle-topright {
    width: 0;
    height: 0;
    border-top: 100px solid red;
    border-left: 100px solid transparent;
 
} 

2.7 Triangle Bottom Left

#triangle-bottomleft {
    width: 0;
    height: 0;
    border-bottom: 100px solid red;
    border-right: 100px solid transparent;
} 

2.8 Triangle Bottom Right

#triangle-bottomright {
    width: 0;
    height: 0;
    border-bottom: 100px solid red;
    border-left: 100px solid transparent;
}

2.1 Triangle Up

#triangle-up {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 100px solid red;
} 

2.2 Triangle Down

#triangle-down {
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 100px solid red;
} 

2.3 Triangle Left

#triangle-left {
    width: 0;
    height: 0;
    border-top: 50px solid transparent;
    border-right: 100px solid red;
    border-bottom: 50px solid transparent;
} 

2.4 Triangle Right

#triangle-right {
    width: 0;
    height: 0;
    border-top: 50px solid transparent;
    border-left: 100px solid red;
    border-bottom: 50px solid transparent;
} 

2.5 Triangle Top Left

#triangle-topleft {
    width: 0;
    height: 0;
    border-top: 100px solid red;
    border-right: 100px solid transparent;
} 

2.6 Triangle Top Right

#triangle-topright {
    width: 0;
    height: 0;
    border-top: 100px solid red;
    border-left: 100px solid transparent;
 
} 

2.7 Triangle Bottom Left

#triangle-bottomleft {
    width: 0;
    height: 0;
    border-bottom: 100px solid red;
    border-right: 100px solid transparent;
} 

2.8 Triangle Bottom Right

#triangle-bottomright {
    width: 0;
    height: 0;
    border-bottom: 100px solid red;
    border-left: 100px solid transparent;
}
1像素邊框問題
  1. 媒體查詢利用設(shè)備像素比縮放,設(shè)置小數(shù)像素
    ? IOS8下已經(jīng)支持帶小數(shù)的px值, media query對應(yīng)devicePixelRatio有個(gè)查詢值-webkit-min-device-pixel-ratio, css可以寫成這樣
.border { border: 1px solid #999 }
@media screen and (-webkit-min-device-pixel-ratio: 2) {
    .border { border: 0.5px solid #999 }
}
@media screen and (-webkit-min-device-pixel-ratio: 3) {
    .border { border: 0.333333px solid #999 }
}

【缺點(diǎn)】對設(shè)備有要求,小數(shù)像素目前兼容性較差。

  1. viewport + rem 方案
    該方案是對上述方案的優(yōu)化,整體思路就是利用viewport + rem + js 動(dòng)態(tài)的修改頁面的縮放比例,實(shí)現(xiàn)小于1像素的顯示。在頁面初始化時(shí),在頭部引入原始默認(rèn)狀態(tài)如下:
 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">  
<meta name="viewport" id="WebViewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> 

接下來的任務(wù)就是js的動(dòng)態(tài)修改縮放比 以及 實(shí)現(xiàn)rem根元素字體大小的設(shè)置。

var viewport = document.querySelector("meta[name=viewport]")
if (window.devicePixelRatio == 1) {
    viewport.setAttribute('content', 'width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no')
} 
if (window.devicePixelRatio == 2) {
    viewport.setAttribute('content', 'width=device-width, initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no')
} 
if (window.devicePixelRatio == 3) {
    viewport.setAttribute('content', 'width=device-width, initial-scale=0.333333333, maximum-scale=0.333333333, minimum-scale=0.333333333, user-scalable=no')
} 

var docEl = document.documentElement;
var fontsize = 10 * (docEl.clientWidth / 320) + 'px';
docEl.style.fontSize = fontsize;

【缺點(diǎn)】以為縮放涉及全局的rem單位,比較適合新項(xiàng)目,對于老項(xiàng)目可能要涉及到比較多的改動(dòng)。
3.設(shè)置 border-image 方案

.border-image-1px {
    border-width: 1px 0px;
    -webkit-border-image: url("border.png") 2 0 stretch;
    border-image: url("border.png") 2 0 stretch;
}

【解釋】border-width 指定邊框的寬度,可以設(shè)定四個(gè)值,分別為上右下左border-width: top right bottom left。
border-image 該例意為:距離圖片上方2px(屬性值上沒有單位)裁剪邊框圖片作為上邊框,下方2px裁剪作為下邊框。距離左右0像素裁剪圖片即沒有邊框,以拉伸方式展示

結(jié)合起來就是:在邊框圖片中,裁剪圖片上下方的2個(gè)像素寬度作為上下邊框,并展示在寬度為1個(gè)像素的邊框空間里。左右沒有邊框。 注意這里的1個(gè)像素是特殊的,專指物理像素,而平時(shí)設(shè)定的長寬1px則表示邏輯像素.
當(dāng)然,這種方式引入了圖片,我們還能將圖片裝換成base64形式表現(xiàn)
【缺點(diǎn)】需要制作圖片,圓角可能出現(xiàn)模糊

  1. background-image 漸變實(shí)現(xiàn)
    除了使用圖片外,當(dāng)然也能使用純css來實(shí)現(xiàn),百度糯米團(tuán)就是采用的這種方案。
.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;
  }

【思路】將原本1個(gè)物理像素的邊框大小利用線性漸變分割成幾個(gè)部分(百分比控制),實(shí)現(xiàn)小于1像素效果
【解釋】linear-gradient指定線性漸變,接受大于等于3個(gè)參數(shù),第一個(gè)為漸變旋轉(zhuǎn)角度,第二個(gè)開始為漸變的顏色和到哪個(gè)位置(百分比)全部變?yōu)樵擃伾?,該例子中,第一句就是,漸變方向旋轉(zhuǎn)180度,即從上往下(默認(rèn)為0度從下往上),從紅色開始漸變,到50%的位置還是紅色,再漸變?yōu)槔^承父元素顏色。
【缺點(diǎn)】因?yàn)槊總€(gè)邊框都是線性漸變顏色實(shí)現(xiàn),因此無法實(shí)現(xiàn)圓角

  1. box-shadow 方案
    利用陰影也可以實(shí)現(xiàn),優(yōu)點(diǎn)是沒有圓角問題,缺點(diǎn)是顏色不好控制
div {
    -webkit-box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.5);
}
  1. transform: scale(0.5) 方案 - 推薦: 很靈活
    (1)設(shè)置height: 1px,根據(jù)媒體查詢結(jié)合transform縮放為相應(yīng)尺寸。
div {
    height:1px;
    background:#000;
    -webkit-transform: scaleY(0.5);
    -webkit-transform-origin:0 0;
    overflow: hidden;
}

(2).用::after和::befor,設(shè)置border-bottom:1px solid #000,然后在縮放-webkit-transform: scaleY(0.5);可以實(shí)現(xiàn)兩根邊線的需求

div::after{
    content:'';width:100%;
    border-bottom:1px solid #000;
    transform: scaleY(0.5);
}

(3).用::after設(shè)置border:1px solid #000; width:200%; height:200%,然后再縮放scaleY(0.5); 優(yōu)點(diǎn)可以實(shí)現(xiàn)圓角,京東就是這么實(shí)現(xiàn)的,缺點(diǎn)是按鈕添加active比較麻煩。

.div::after {
    content: '';
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border: 1px solid #bfbfbf;
    border-radius: 4px;
    -webkit-transform: scale(0.5,0.5);
    transform: scale(0.5,0.5);
    -webkit-transform-origin: top left;
}

(4) 媒體查詢 + transfrom 對方案1的優(yōu)化

/* 2倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 2.0) {
    .border-bottom::after {
        -webkit-transform: scaleY(0.5);
        transform: scaleY(0.5);
    }
}

/* 3倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 3.0) {
    .border-bottom::after {
        -webkit-transform: scaleY(0.33);
        transform: scaleY(0.33);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容