這個CSS問題屏幕前的你是否熟悉,而後懵逼,最後放棄

本文做者:IMWeb·結一 原文出處:IMWeb社區 未經贊成,禁止轉載
css

當決定寫這篇博文時候,忽然一道閃電從腦海劈過,因而臨時決定將這個熟悉而後到懵逼最後到放棄的問題分爲兩部分。html

閒話少說,直接上題:前端

icons

要求以下:web

  • 三個橙色圓的大小爲60px,固定不變
  • 全部間隙相等,也就是被三個橙色圓劃分紅的四個間距相等
  • 應用在移動端,整個黃色爲全屏寬度(因此這裏圖片的大小不是真實的大小,如iphone 5那就是320px,6就是375px,6s就是414px等等)
  • 兼容安卓4.0以上(悄悄透露下安卓4.3- 屬性calc不支持)
  • html & css (no js)


方法不惟一,歡迎你們把本身解決方案分享到評論區
bash

答案分割線————

1、flex方法

一、插入四個空標籤,設置flex:1,這個多是你們最早想到的。iphone

<ul class="share-list">
    <li class="gap"></li>
    <li class="share-item"></li>
    <li class="gap"></li>
    <li class="share-item"></li>
    <li class="gap"></li>
    <li class="share-item"></li>
    <li class="gap"></li>
</ul>
複製代碼
.share-list{
    display: flex;
}
.share-item{
    width: 60px;
    height: 60px;
}
.gap{
    flex: 1;
    width: 1%;
}
複製代碼

二、第一個和第三個設置flex爲1,第二個爲icon的固定寬度;內嵌一層處理具體的icon寬度工具

<ul class="share-list">
    <li class="share-item"><div class="item-inner"></div></li>
    <li class="share-item"><div class="item-inner"></div></li>
    <li class="share-item"><div class="item-inner"></div></li>
</ul>
複製代碼
.share-list{
    display: flex;
}
.share-item:nth-child(1),
.share-item:nth-child(3){
    flex: 1;
    width: 1%;
}
.share-item:nth-child(2){
    width: 60px;
}
.item-inner{
    width: 60px;
    margin-left: auto;
    margin-right: auto;
}
複製代碼

三、對justify-content: space-between;進行變通佈局

每一個間隙的寬度 = (100% - 60px * 3)/ 4 = 25% - 45px學習

先外套一層wrap,設置左右的padding各位25%,再對list設置負的左右margin各位45px(至關於左右的padding減小了45px),獲得第一個和最後一個間隙;中間的間隙經過justify-content: space-between;自由分配flex

<div class="share-list-wrap">
  <ul class="share-list">
      <li class="share-item"></li>
      <li class="share-item"></li>
      <li class="share-item"></li>
  </ul>
</div>
複製代碼
share-list-wrap{
    padding-left: 25%;
    padding-right: 25%;
}
.share-list{
    display: flex;
    margin-left: -45px;
    margin-right: -45px;
    justify-content: space-between;
}
複製代碼

四、高級justify-content: space-between;

直接使用list的before和after僞元素參與佈局

<ul class="share-list">
      <li class="share-item"></li>
      <li class="share-item"></li>
      <li class="share-item"></li>
  </ul>
複製代碼
.share-list{
    display: flex;
    justify-content: space-between;
}
.share-list:before,
.share-list:after{
    content: "";
}
.share-item{
    width: 60px;
    height: 60px;
}複製代碼

2、絕對定位

計算各個位置,第一個位置爲25% - 60px

75%,第二個爲50% - 60px

50%,第三個位置爲75% - 60px*25%

這裏就再也不多講,根據上面的間隙寬度計算公式總會算出來的,可能一開始想錯了,調整下就對了。

最終的計算公式爲:(假設n爲間隙數,w爲圖標的寬度)

第i圖標的位置爲: i/n (%) - w(n-i)/n (px),結合left和transform表示就是

left: i/n*100%;
transform: translate( -(n-1)/n*100%,0);複製代碼

3、float方法

設置第二個爲絕對定位在中間;第一個的寬度爲50%,padding-right爲30px,第二個的寬度爲50%,padding-left爲30px,而後裏面居中

.share-item:nth-child(2){
    position: absolute;
    left: 50%;
    transform: translate(-50%, 0);
    width: 60px;
}
.share-item:nth-child(1),
.share-item:nth-child(3){
    float: left:
    width: 100%;
    text-align: center;
    box-sizing: border-box;
}
.share-item:nth-child(1){
    padding-right: 30px;
}
.share-item:nth-child(3){
    padding-left: 30px;
}
.item-inner{
    display: inline-block;
    vertical-align: middle;
}複製代碼

4、table方法

設置table-layout:fixed,第二個td爲60px,那麼第一個和第三個自動等分剩餘的空間,而後再單元格居中便可

總結

這個問題,其實全部的人都能解答(請忽略有點譁衆取寵的文章標題),只是答題運用的方法不一樣而已,有靈活的,有死板的,最關鍵的仍是咱們對遇到問題怎麼對應上本身的知識庫。

關鍵問題不是你實現不了,而是你選擇的方案可能不是最優的,這就是css,你瞭解越多,你就會越接近那個最優的捷徑。


關於這個題目你的CSS功力是否經得住考驗呢

因此前端的路上,須要不斷學習系統先進的前端知識,瞭解業界的頂尖標準,不斷自我進步......不管是鞏固基礎仍是進階充電,都須要保持進步的驅動力!


說了這麼多......那還不快加入騰訊官方出品的NEXT學位課程

NEXT學位的優點騰訊課堂官方出品、技術總監設計、高級工程師教學、硅谷最新的教學工具、前端崗位的項目實戰、專家1V一、直播課答疑、騰訊內推、專屬就業通道...種種優點助你走向前端的人生巔峯!

動動手指點擊官網瞭解NEXT學位

第四期招生立刻截止,限定席位等你來搶

更多課程詳情可掃描下方二維碼諮詢助教

相關文章
相關標籤/搜索