iT邦幫忙

0

如何讓兩個<div>之間沒有間距合併在一起

  • 分享至 

  • xImage

目前實做的方式,是會跑兩次迴圈垂直長四個資料,之後再水平呈現。
在純粹使用<div>,不考慮使用<table><div>模擬table的方式下,想將如下兩個<div>做合併,但嘗試很久都無法實現(程式碼),想詢問可以怎麼調整呢?

補充 : 目前這個case因為資料來源是直向的,無法直接使用<div>模擬table的方式跑迴圈橫向長出表格,故為了避免轉至list,才會使用目前的方式進行。

[目前長相]
https://ithelp.ithome.com.tw/upload/images/20200423/20115336SaMa3IGyjn.png

[期望長相]
https://ithelp.ithome.com.tw/upload/images/20200423/20115336qFSchaR3XC.png

[程式碼]

<style>
    .content_TestTable {
        height: 20px;
        padding: 3px 3px 3px 3px;
        font-size: 10px;
        font-family: Arial;
        text-align:left;
        vertical-align: top;
        border: solid windowtext 1px;    
        margin:-1px 0 0 -1px;
        table-layout: fixed;
        /*font-size:0px;*/
        /*padding:0;*/
        /*margin:0;*/
    }
</style>
 
<div style='display:inline-block;'>
  <div class='content_TestTable'>voltage(V)</div>
  <div class='content_TestTable'>Tmin(°C)</div>
  <div class='content_TestTable'>Tmax(°C)</div>
  <div class='content_TestTable'>Tma(°C) </div>
</div>

<div style='display:inline-block;'>
  <div class='content_TestTable'>100</div>
  <div class='content_TestTable'>200</div>
  <div class='content_TestTable'>300</div>
  <div class='content_TestTable'>400</div>
</div>

20200427更新 :
謝謝浩瀚星空的指導,若使用div仿table的方式,也可以達到,請參考範例

看更多先前的討論...收起先前的討論...
用表格巴 這裡有教學
https://www.wibibi.com/info.php?tid=116
https://jsfiddle.net/bkLaq4t5/
阿,沒看到已經有回答了,請忽略
anniecat iT邦新手 3 級 ‧ 2020-04-23 13:25:28 檢舉
fillanofeng,謝謝你的幫忙,此方式可行,不過使用float的方式可能會跑版,此部分我再看看有沒有比較全面的方法可以實現,謝謝你!
還是用表格做比較好 表格可以做直的啊 資料格式轉一下就好
你可以先合併資料把資料弄成 [{title:"Tmin",value:"200"} 然後就一整排 <tr><td>Tmin<td>200<tr>
anniecat iT邦新手 3 級 ‧ 2020-04-24 10:27:36 檢舉
那我就選擇一個我後來實做的方式為最佳答案了> <
真的很謝謝大家的幫忙~每一個方法我都有嘗試過,都可以實做,也學到很多!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
淺水員
iT邦大師 6 級 ‧ 2020-04-23 12:47:06
最佳解答

那個間隙是空白字元產生的
不介意程式碼的排版的話,可以拿掉兩個 div 區塊間的所有泛空白字元

<div style='display:inline-block;'>
  <div class='content_TestTable'>voltage(V)</div>
  <div class='content_TestTable'>Tmin(°C)</div>
  <div class='content_TestTable'>Tmax(°C)</div>
  <div class='content_TestTable'>Tma(°C) </div>
</div><div style='display:inline-block;'>
  <div class='content_TestTable'>100</div>
  <div class='content_TestTable'>200</div>
  <div class='content_TestTable'>300</div>
  <div class='content_TestTable'>400</div>
</div>

參考:How to remove the space between inline-block elements in CSS

另外有考慮用 flex 去排嗎?

anniecat iT邦新手 3 級 ‧ 2020-04-23 13:36:12 檢舉

原來是<div><div>之間的空白字元所造成的啊(恍然大悟!)
我會跑迴圈產生四個為一組的<div>區塊,因此,比較困難去拿掉兩個<div>區塊間的所有泛空白字元。
若是使用<div>的設置padding: 0;,我擔心會影響到其他有使用到div的部分
另外,flex的部分是指整個垂直與水平的排版嗎,有稍微看一下範例,但不太清楚此作法會有什麼不一樣呢?

淺水員 iT邦大師 6 級 ‧ 2020-04-23 14:45:46 檢舉

用 flex 的話,外層容器的 display 要稍微改一下。
外層容器如果是 block 要改成 flex
外層容器如果是 inline-block 則要改成 inline-flex
下面是範例

<style>
    .flex-container{
        display: flex;
    }
    .flex-col{
        display: flex;
        flex-direction: column;
    }
    .content_TestTable {
        height: 20px;
        padding: 3px 3px 3px 3px;
        font-size: 10px;
        font-family: Arial;
        text-align:left;
        vertical-align: top;
        border: 1px solid ;    
        margin:-1px 0 0 -1px;
    }
</style>
<!-- 外層容器要設定為 display: flex 或 inline-flex -->
<div class='flex-container'>
    <div class='flex-col'>
        <div class='content_TestTable'>voltage(V)</div>
        <div class='content_TestTable'>Tmin(°C)</div>
        <div class='content_TestTable'>Tmax(°C)</div>
        <div class='content_TestTable'>Tma(°C) </div>
    </div>
    <div class='flex-col'>
        <div class='content_TestTable'>100</div>
        <div class='content_TestTable'>200</div>
        <div class='content_TestTable'>300</div>
        <div class='content_TestTable'>400</div>
    </div>
</div>
淺水員 iT邦大師 6 級 ‧ 2020-04-23 15:04:42 檢舉

另外移除空白的部分,如果不能改,這邊是有個用 js 移除的方式,合不合用再自己衡量了。
PS. 只是有這想法弄看看,不確定所有瀏覽器正常。(只試過 Firefox、Chrome、Edge)

<div class='flex-col'>
    <div class='content_TestTable'>voltage(V)</div>
    <div class='content_TestTable'>Tmin(°C)</div>
    <div class='content_TestTable'>Tmax(°C)</div>
    <div class='content_TestTable'>Tma(°C) </div>
</div>
<div class='flex-col'>
    <div class='content_TestTable'>100</div>
    <div class='content_TestTable'>200</div>
    <div class='content_TestTable'>300</div>
    <div class='content_TestTable'>400</div>
</div>
<script>
//這段 javascript 會移除同層的所有泛空白字元
(()=>{
    let p=document.currentScript.parentElement;
    Array.from(p.childNodes).forEach((ele)=>{
        if(
            ele.nodeType===Node.TEXT_NODE &&
            ele.textContent.search(/^\s*$/)>=0
        ) {
            p.removeChild(ele);
        }
    });
})();
</script>
3
Franky Chen
iT邦研究生 3 級 ‧ 2020-04-23 10:53:12
<div style="display:inline-block;">
  <div class="content_TestTable">voltage(V)</div>
  <div class="content_TestTable">Tmin(°C)</div>
  <div class="content_TestTable">Tmax(°C)</div>
  <div class="content_TestTable">Tma(°C) </div>
</div>

<div style="display:inline-block;position: absolute;" style:"position:="" absolute;"="">
  <div class="content_TestTable">100</div>
  <div class="content_TestTable">200</div>
  <div class="content_TestTable">300</div>
  <div class="content_TestTable">400</div>
</div>    
anniecat iT邦新手 3 級 ‧ 2020-04-23 13:18:39 檢舉

frankychen,謝謝!
不過再嘗試使用這個方法實,若要新增第三個div的話,第三個會與第二個重疊,請問若是這樣的話,還可以怎麼調整呢?

https://www.w3schools.com/code/tryit.asp?filename=GE4HY567S31Q

2
鬼王很慘
iT邦新手 2 級 ‧ 2020-04-23 10:56:52

推薦一個好用的線上工具 http://www.cssdesk.com/ 方便這種簡單測試

你的問題出在外層div,所以應該由它下手
將 display:inline-block 改為 float:left 即可
不過float雖然可以解決你這個部分的問題,但可能造成其他地方跑掉
所以還要再測試

<style>
    .content_TestTable {
        height: 20px;
        padding: 3px 3px 3px 3px;
        font-size: 10px;
        font-family: Arial;
        text-align:left;
        vertical-align: top;
        border: solid windowtext 1px;    
        margin:-1px 0 0 -1px;
        table-layout: fixed;
        /*font-size:0px;*/
        /*padding:0;*/
        /*margin:0;*/
    }
    
    .parent_div {
        /*display:inline-block;*/
        float:left
    }
</style>
 
<div class='parent_div'>
  <div class='content_TestTable'>voltage(V)</div>
  <div class='content_TestTable'>Tmin(°C)</div>
  <div class='content_TestTable'>Tmax(°C)</div>
  <div class='content_TestTable'>Tma(°C) </div>
</div>

<div class='parent_div'>
  <div class='content_TestTable'>100</div>
  <div class='content_TestTable'>200</div>
  <div class='content_TestTable'>300</div>
  <div class='content_TestTable'>400</div>
</div>
anniecat iT邦新手 3 級 ‧ 2020-04-23 13:27:18 檢舉

littleit,此方式確實可行,跑版的部分可能會存在,因此這部分我再看看有沒有比較全面的作法可以達到,謝謝你!

2

一般需要密合式的做法,利用css的話就是如下大法

1.position定位法:frankychen 有提到。我就不說明。
2.表格式定義法:不過你說不想用,我就跳過。
3.萬用的float大法:這可能是最簡單的處理,只是得面臨跑版及瀏覽器版本的問題。
4.背景色劃線應用法:這招也可以,只是我想你不會用。因為有點麻煩。要搭配padding應用跟背景色處理。這招是我在特殊表現時常會使用這招。

基本上來說,這四種方法都有其各自配合的情況。沒有哪一種比較好還是比較不好。
只有適合不適合。
基本上依你目前看來,比較適合用的是表格式定義法最適合。可是偏偏說不想用表格式定義的方式。
如果想用簡單處理的。那就float大法吧。

看更多先前的回應...收起先前的回應...
anniecat iT邦新手 3 級 ‧ 2020-04-23 11:25:56 檢舉

謝謝浩瀚星空,我其他的部分是使用表格式定義法,只是目前這個case因為資料來源是直向的,無法直接使用表格式定義法跑迴圈橫向長出表格,故為了避免轉至list,才會使用目前的方式進行~

其實還是可以的。我簡單處理個給你思考

<div class="table">
   <div class="tr">  <!--在這邊可能可以省略這一TR自已試試-->
      <div class="td">
          <div class="sub_table">
             <div class="sub_td">a</div>
             <div class="sub_td">b</div>
             <div class="sub_td">n</div>
             <div class="sub_td">d</div>
          </div>
      </div>
      <div class="td">
          <div class="sub_table">
             <div class="sub_td">1</div>
             <div class="sub_td">2</div>
             <div class="sub_td">3</div>
             <div class="sub_td">4</div>
          </div>
      </div>
   </div>
</div>

這樣提點一下也是可以做到。這也有點是table包table的觀念在。
當然,兩個div並行的做法也是可以的。只是還是會碰到跑位的可能性,造成不對應。
一般我還是會建議這種。看你吧。

anniecat iT邦新手 3 級 ‧ 2020-04-23 13:40:48 檢舉

恩恩,謝謝你,不過這種方式的話,我一次就需要長出

<div class="sub_td">a</div>
<div class="sub_td">b</div>
<div class="sub_td">n</div>
<div class="sub_td">d</div>

但我在跑迴圈時得到的資料可能會是先長出a再長出1,因此無法使用水平的方式長資料,必須翻轉我得到的資料來源,那因為效能的考量,因此決定從長相去著手~

等等等
你的資料不是先

<div class='content_TestTable'>voltage(V)</div>
<div class='content_TestTable'>Tmin(°C)</div>
<div class='content_TestTable'>Tmax(°C)</div>
<div class='content_TestTable'>Tma(°C) </div>

再有

<div class='content_TestTable'>100</div>
<div class='content_TestTable'>200</div>
<div class='content_TestTable'>300</div>
<div class='content_TestTable'>400</div>

還是我誤會了??
如果資料是
voltage 100
Tmin 200

根本不需要做這個處理啊??
直接就可以用td來表現啊?
我一直以為你是為了分段式連結資料再苦腦。
才會告訴你上面這招的。

anniecat iT邦新手 3 級 ‧ 2020-04-23 14:03:10 檢舉

不好意思 > < 我怕我太笨沒有抓到你要告訴我的事情,請容我再詳細敘述一下...
我目前得到的資料會是一群list,
list.data[0]->
Voltage : 100
Tmin : 200
Tmax : 300
Tma : 4000

list.data[1]->
Voltage : 500
Tmin : 600
Tmax : 700
Tma : 800

list.data[2]->
Voltage : 900
Tmin : 1000
Tmax : 1100
Tma : 1200

因此,我如果使用一般table或是div模擬table,那我跑第一次迴圈的時候,會先撈取list.data[0].Voltage放在第一格(100),接著跑第二次迴圈撈取list.data[1].Voltage放在第二格(500),接著在撈取list.data[2].Voltage放在第三格(900),到這邊第一列完成。
接著我要長出第二列的話,我就要再跑上面的迴圈一次,抓取Tmin的資料。
這樣的話,看起來應該要翻轉我的資料來源。

恩對啊 你應該要把資料邏輯跟頁面邏輯拆開,而不是要頁面邏輯照你的資料邏輯output 所以你應該先把list 轉成頁面好render的array 格式,看起來格式應該要長這樣(類似)

let data = [
  {
   title:"Voltage",
   values:['100','500','900']
  },
  {
   title:"Tmin",
   values:['200','600','1000']
  }
]
Voltage 100 500 900
Tmin 200 600 1000
<table>
    {data.map(d =>{
        return 
        <tr>
            <td>
               {d.title}
            </td>
            {
              d.values(v =>{
                  return 
                  <td>
                      {v}
                  </td>
              })
            }
        </tr>
    })}
</table>

那我將我上面的排法讓你了解一下。我的排法就是要給你確定用的

<div class="table">
   <div class="tr">  <!--在這邊可能可以省略這一TR自已試試-->
      <div class="td">
          <div class="sub_table">
             <div class="sub_tr">a</div>
             <div class="sub_tr">b</div>
             <div class="sub_tr">n</div>
             <div class="sub_tr">d</div>
             <!-- 這邊先標題 -->
          </div>
      </div>
      <div class="td">
          <div class="sub_table">
             <!-- 第一個資料-->
             <div class="sub_tr">1</div>
             <div class="sub_tr">2</div>
             <div class="sub_tr">3</div>
             <div class="sub_tr">4</div>
          </div>
      </div>
      <div class="td">
          <div class="sub_table">
             <!-- 第二個資料-->
             <div class="sub_tr">1</div>
             <div class="sub_tr">2</div>
             <div class="sub_tr">3</div>
             <div class="sub_tr">4</div>
          </div>
      </div>
      
      <div class="td">
          <div class="sub_table">
             <!-- 第三個資料-->
             <div class="sub_tr">1</div>
             <div class="sub_tr">2</div>
             <div class="sub_tr">3</div>
             <div class="sub_tr">4</div>
          </div>
      </div>
      
      
   </div>
</div>

可能我用sub_td讓你搞混了。其實那是直列排省略了tr@@"
我沒寫的很完整給你誤會了

只要去生成 這組資料,要幾個就幾個。

anniecat iT邦新手 3 級 ‧ 2020-04-24 10:29:38 檢舉

對的!是你所表達的意思沒錯~很感謝你的協助!你前面提集的四個方式讓我學到很多~感謝!

1
Re:
iT邦新手 4 級 ‧ 2020-04-23 11:11:24

css的部分可以試試這樣的~
查查 box-sizing 的用法或許有幫助喔!

*{
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-size: 0px;
       
    }
    .content_TestTable{
        border: 1px solid gray;
        padding:3px 5px;
        font-size: 20px;
        margin: -1px;
    }
看更多先前的回應...收起先前的回應...
anniecat iT邦新手 3 級 ‧ 2020-04-23 13:29:45 檢舉

Re:,謝謝!
不過再嘗試使用這個方法,若新增第三個div的話,第三個會與第二個重疊,請問若是這樣的話,還可以怎麼調整呢?

Re: iT邦新手 4 級 ‧ 2020-04-23 14:01:27 檢舉

你的意思是~html部分變成這樣嗎?

<div style='display:inline-block;'>
    <div class='content_TestTable'>voltage(V)</div>
    <div class='content_TestTable'>Tmin(°C)</div>
    <div class='content_TestTable'>Tmax(°C)</div>
    <div class='content_TestTable'>Tma(°C) </div>
</div>
<div style='display:inline-block;'>
    <div class='content_TestTable'>100</div>
    <div class='content_TestTable'>200</div>
    <div class='content_TestTable'>300</div>
    <div class='content_TestTable'>400</div>
</div>
<div style='display:inline-block;'>
    <div class='content_TestTable'>1</div>
    <div class='content_TestTable'>2</div>
    <div class='content_TestTable'>3</div>
    <div class='content_TestTable'>4</div>
</div>
anniecat iT邦新手 3 級 ‧ 2020-04-23 14:06:19 檢舉

噢對的!不好意思,剛剛嘗試了以後發顯沒有此問題~感謝你的協助!
https://www.w3schools.com/code/tryit.asp?filename=GE4O2AU2KV51

Re: iT邦新手 4 級 ‧ 2020-04-23 14:15:14 檢舉

不會~~

anniecat iT邦新手 3 級 ‧ 2020-04-23 14:15:31 檢舉

不好意思,另外想詢問

*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-size: 0px;

}

是指所有的樣式都套用這個css嗎?
但我若調整所有css裡面都放這段,好像就不會作用了呢?
https://www.w3schools.com/code/tryit.asp?filename=GE4O6VO5H7PM

Re: iT邦新手 4 級 ‧ 2020-04-23 14:30:27 檢舉

我是比較建議一開始就將所有標籤的預設值都歸零
以你目前的狀況可以直接多寫一個

 body{
      font-size: 0px;
 }

簡化一下是這樣

  body{
      font-size: 0px;
  }
  .col_TestTable {
      display:inline-block;
  }
  .content_TestTable{
      border: 1px solid gray;
      box-sizing: border-box;
      padding:3px 5px;
      font-size: 20px;
      margin: -1px;
    }
anniecat iT邦新手 3 級 ‧ 2020-04-24 10:26:39 檢舉

好的!目前看潛水員跟yuwen的方式好像可以直接針對div內做調整,因為html有其他人共用,怕會影響到,所以目前會先獨立調整,非常謝謝你的幫忙~

3
yuwen
iT邦新手 4 級 ‧ 2020-04-24 09:10:52

以你最原始的寫法,只要再最外曾加上font-size: 0px;就可以了,原因就如淺水員大大所說的。

<div style='font-size: 0px;'>
    <div style='display:inline-block;'>
      <div class='content_TestTable'>voltage(V)</div>
      <div class='content_TestTable'>Tmin(°C)</div>
      <div class='content_TestTable'>Tmax(°C)</div>
      <div class='content_TestTable'>Tma(°C) </div>
    </div>

    <div style='display:inline-block;'>
      <div class='content_TestTable'>100</div>
      <div class='content_TestTable'>200</div>
      <div class='content_TestTable'>300</div>
      <div class='content_TestTable'>400</div>
    </div>
</div>

另外也建議從CSS的基礎來學起,站上有Amos老師的金魚教學系列,你所遇到的問題在教學影片裡有提到,建議花點時間學習

anniecat iT邦新手 3 級 ‧ 2020-04-24 10:23:34 檢舉

好的,非常謝謝你們,這部分我會再好好研究的!
如果有兩個最佳答案的話,也希望可以選擇您 > <

我要發表回答

立即登入回答