2015-04-14 35 views
9

我使用flexbox layout風格的過去任務列表。任務描述和時間總是變化很大。flexbox |彈出的項目被推出包含div(屏幕外)

一切看起來都很棒,直到輸入任務描述足夠長的時間才能包裝到第二行,然後'時間'項目(在屏幕的最右側)稍微向右 - 離開屏幕 - 隱藏了一些內容。

您可以在下方看到完美的簡短說明,但是長的推子會將'00:08'推離屏幕,任務描述也向左移動!

flex-item-pushed-off-screen-chrome

這裏的a fiddle針對碼(其下面是按照#1的規則)。 如果您調整包含結果的窗格的大小,'00:08'不會脫離頁面,但它確實移動得太靠右了。

上述屏幕截圖在縮小窗口寬度之前將Chrome或Safari(我使用的兩個瀏覽器)放在第二行描述中。

如果可能,我希望所有內容都按第一條(簡短說明)行顯示!而且還要理解爲什麼這是現在的行爲。

P.S.我曾嘗試使用浮動,並使用表格顯示佈局,但這兩種技術都造成了相當多的錯誤,主要是因爲可變長度的內容(所以請不要將這些作爲替代方法:))。

ul { 
 
     margin:0; 
 
     padding: 0; 
 
    } 
 
    #tasklist{ 
 
     width: 100%; 
 
    } 
 
    
 
     .task-one-line{ 
 
     display: flex; 
 
     flex-direction:row; 
 
     flex-wrap: nowrap; 
 
     justify-content: space-between; 
 
     align-item: baseline; /*flex-end*/ 
 
     display: -webkit-flex; 
 
     -webkit-flex-direction:row; 
 
     -webkit-flex-wrap: nowrap; 
 
     -webkit-justify-content: space-between; 
 
     -webkit-align-item: baseline; 
 
     border-bottom: 1px solid #d3d3d3; 
 
     width: 100%; 
 
     } 
 
    
 
     .task-one-line i{ 
 
      width:1.5em; 
 
      padding: 0.5em 0.3em 0.5em 0.3em; 
 
      /*border: 1px solid green;*/ 
 
     } 
 
    
 
      span.task-desc{ 
 
      flex-grow: 5; 
 
      -webkit-flex-grow: 5; 
 
      text-align:left; 
 
      padding: 0.3em 0.4em 0.3em 0.4em; 
 
      /*border: 1px solid red;*/ 
 
      } 
 
      
 
      span.task-time{ 
 
      flex-grow: 1; 
 
      -webkit-flex-grow: 1; 
 
      flex-basis:4em; 
 
      -webkit-flex-basis:4em; 
 
      text-align:right; 
 
      padding: 0.3em 0.5em 0.3em 0.5em; 
 
      /*border: 1px solid blue ;*/ 
 
      }
<ul id="tasklist"> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">And a short one</span> 
 
      <span class="task-time">00:01</span> 
 
     </li> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">Here's a super long long long long long long description that might wrap onto another line</span> 
 
      <span class="task-time">00:08</span> 
 
     </li> 
 
    </ul>

回答

5

真的,你只需要在文本內容有一個靈活的寬度(時間和圖標應該有一個固定的寬度,而不是收縮)。這可以通過表格,絕對定位或flexbox輕鬆完成。

下面是你需要知道的Flexbox的:

.task-time: flex: 1 0 4em 
.task-one-line i.fa { flex: 0 0 auto; } 

ul { 
 
     margin:0; 
 
     padding: 0; 
 
    } 
 
    #tasklist{ 
 
     width: 100%; 
 
    } 
 
    
 
     .task-one-line i.fa { flex: 0 0 auto; } 
 
     .task-one-line{ 
 
     display: flex; 
 
     flex-direction:row; 
 
     flex-wrap: nowrap; 
 
     justify-content: space-between; 
 
     align-item: baseline; /*flex-end*/ 
 
     display: -webkit-flex; 
 
     -webkit-flex-direction:row; 
 
     -webkit-flex-wrap: nowrap; 
 
     -webkit-justify-content: space-between; 
 
     -webkit-align-item: baseline; 
 
     border-bottom: 1px solid #d3d3d3; 
 
     width: 100%; 
 
     } 
 
    
 
     .task-one-line i{ 
 
      width:1.5em; 
 
      padding: 0.5em 0.3em 0.5em 0.3em; 
 
      /*border: 1px solid green;*/ 
 
     } 
 
    
 
      span.task-desc{ 
 
      flex-grow: 5; 
 
      -webkit-flex-grow: 5; 
 
      text-align:left; 
 
      padding: 0.3em 0.4em 0.3em 0.4em; 
 
      /*border: 1px solid red;*/ 
 
      } 
 
      
 
      span.task-time{ 
 
      flex: 1 0 4em; 
 
      -webkit-flex: 1 0 4em; 
 
      text-align:right; 
 
      padding: 0.3em 0.5em 0.3em 0.5em; 
 
      /*border: 1px solid blue ;*/ 
 
      }
<ul id="tasklist"> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">And a short one</span> 
 
      <span class="task-time">00:01</span> 
 
     </li> 
 
     <li class="task-one-line"> 
 
      <i class="fa fa-check-circle-o"></i> 
 
      <span class="task-desc">Here's a super long long long long long long description that might wrap onto another line long long long long long long description that might wrap onto another line</span> 
 
      <span class="task-time">00:08</span> 
 
     </li> 
 
    </ul>

+0

感謝這個@Adam - 這工作,因爲計時器現在顯示在屏幕上,但是它將文本備份到圖標中,導致了一個醜陋的格式問題,其中b Ÿ文本從一行到另一行沒有對齊:http://imgur.com/VtsaujO你知道一種防止這種情況的方法嗎? (請注意,時間必須靈活,因爲它可以達到9個字符,但只有5個!)。感謝您一直以來的幫助。 – iteles

+0

你有鏈接到你的代碼?這行:'.task-one-line i.fa {flex:0 0 auto; }'應該阻止這個特定問題的發生。在Safari中,您需要爲flexbox代碼添加前綴,以便將「display:flexbox」變爲「display:-webkit-flexbox」,並將「flex:0 0 auto」變爲「-webkit-flex:0 0 auto」(依此類推)。 – Adam

+0

萬歲!它會出現我的緩存沒有正確清除,所以我清除了3次,現在似乎按預期工作。太棒了,非常感謝你的幫助。 – iteles

3

我的柔性一般規則是彎曲的容器要彎曲,不彎曲那些你不要。我會做下面的時間容器。

span.task-time {flex: none;}

+0

感謝尤金,但正如我所說,時間將永遠是一個可變長度,因爲它可以包括小時,因此可以在5到9個字符之間的任何地方。雖然好建議! – iteles

+1

我用上面提到的建議更新了你的小提琴。 Flex沒有將div視爲嵌入塊元素。它將根據其內容而增長。 http://jsfiddle.net/aestheticdrift/pmdav1eg/2/ – Eugene

0

我有一個類似的問題,我創建了修復筆:

https://codepen.io/anon/pen/vRBMMm

<div class="flex"> 
    <div class="a">1st div</div> 
    <div class="b">HELLO2HELLO2 HELLO2HELLO2 2222 HELLO2HELLO 22222</div> 
    <div class="c">3rd div</div> 
</div> 

.flex{ 
    display: flex; 
    padding: 8px; 
    border: 1px solid; 
} 
.a { 
    margin-right: 16px; 
} 
.b { 
    flex: 1; 
    min-width: 0; 
    white-space: nowrap; 
    text-overflow: ellipsis; 
    overflow: hidden; 
} 
.c { 
    flex-shrink: 0; 
}