整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          CSS 實現兩邊固定寬,中間自適應

          CSS 實現兩邊固定寬,中間自適應
          1. lexbox 實現
          2. css復制代碼.container {
            display: flex;
            }

            .fixed {
            width: 200px; /* 兩邊固定寬度 */
            }

            .flexible {
            flex: 1; /* 中間自適應 */
            }html復制代碼<div class="container">
            <div class="fixed">Left</div>
            <div class="flexible">Center</div>
            <div class="fixed">Right</div>
            </div>

          是路程lucky,6年web前端開發經驗,目前參與的項目技術棧主要是React,歡迎關注~

          今天給大家分享一下解決一個遇到的樣式布局問題經歷,“標簽寬度自適應,間距固定,每行指定個數”,看似簡單,但新手朋友如果不注意很容易踩坑,下面我們就來逐步分析解決這個css布局小問題。

          場景描述

          工作中遇到這樣一個需求場景:由于視覺設計師的視覺審美要求下,h5頁面中,查詢的商品列表每行有多個標簽標簽個數不固定,寬度自適應,左右間距固定。整體左右間距30px,標簽之間間距6px,頁面整體寬度640px(不同機型不同寬度)。

          注:當前h5腳手架開發采用的scss,已集成了px2rem也就是像素轉rem,編寫px即可實現不同寬度的自適應。

          初步思考

          通常,由于移動端布局有一定兼容性等問題,一些特定的布局如display:grid等,我們還是謹慎使用。我們想到的第一想法是flex布局,可以使得寬度自適應,閃現的思路是:

          • 父元素設置為display:flex,自動換行
          • 子元素設置間距:距離上下左右,然后寬度就自適應,然后就好了?

          // scss

          // 父元素

          .parent {

          display:flex;

          flex-wrap:wrap;

          margin-left: 10px;

          margin-right: 30px;

          }

          // 大致的想法

          .child {

          flex: 1;

          margin: 10px 6px;

          width: auto; // ?這個寬度如何處理

          }

          對于justify-content:space-between,期初也想使用這種,但需求要間距固定,無法適用。

          問題來了

          現實是殘酷的,你會發現子元素全部在一排,沒有寬度,也發現這里的最大難點就是如何確定標簽寬度

          • 如何實現一行三個
          • 每行的三個標簽第二個標簽和第三個標簽之間有間距,而第一個和左邊相對頁面左右邊是沒有間距的。

          嘗試解決

          我們知道問題中使用flex布局的核心問題是要有最小寬度,沒有寬度就不會撐開。css3的calc在移動h5中的兼容性還是不錯的,我們可以動態計算寬度。根據每行顯示3個,間距固定,那么我們可以得出以下計算公式:

          子元素標簽寬度=( 頁面總寬度100% - 頁面左右寬度30px * 2 - 標簽左右邊框2px * 3 - 邊框左右間距6px * 2 ) / 3;

          化簡:

          子元素標簽寬度=100% / 3 - 30px * 2 / 3 - 2px * 3 / 3 - 6px * 2 / 3

          =100% / 3 - 26px

          // 子元素寬度

          .child {

          width: calc(100% / 3 - 26px);

          }

          還是有問題,1行只能展示2個

          這樣布局,還是發現出現問題,雖然我們按照思路進行布局,但我們忽略了一個重點:標簽的左右間距規律是:第1、4、7等最左側第一個,也就是3n+1距離左側是空的。第一時間,你會想通過偽類 nth-chilld(3n+1)來實現標簽。但如果真這樣做,這里對于h5頁面來說,

          • 誤差大,這種間距稍不留神就會出現溢出換行
          • 維護成本高,其他小伙伴維護需要注意這個偽類控制

          我們換一種思路來考慮。其實這類場景PC端是很常見的,我們可以聯動父元素來解決。

          思路:

          • 父元素寬度設置為100%加上一個間距的距離
          • 父元素距離左側減少一個間距的距離

          優點:

          • 間距可以抽出為變量,方便維護
          • 誤差小

          最終方案

          父元素flex布局,距離左側為指定寬度,子元素寬度應該為正常的三個相同寬度和間距元素。

          子元素標簽寬度=( 頁面總寬度100% - 頁面左右寬度30px * 2 - 標簽左右邊框2px * 3 - 邊框左右間距6px * 3 ) / 3;

          化簡:

          子元素標簽寬度=100% / 3 - 30px * 2 / 3 - 2px * 3 / 3 - 6px * 3 / 3

          =100% / 3 - 28px

          // scss

          $width: 6px;

          // 父元素

          .parent {

          display:flex;

          flex-wrap:wrap;

          margin-left: (30px - $width);

          margin-right: 30px;

          width: calc(100% + $width);

          }

          // 大致的想法

          .child {

          flex: 1;

          margin: 10px $width;

          width: calc(100% / 3 - 30px * 2 / 3 - 2px * 3 / 3 - $width * 3 / 3)

          // width: calc(100% / 3 - 28px);

          }

          總結

          看似一個很容易很常見標簽寬度自適應的布局樣式問題,卻引發了坑,各種思考,當然方案遠不止這一種。我們可以通過實踐經驗總結出以下幾點:

          • 寬度自適應問題可以通過動態計算(當前主流瀏覽器基本都支持)
          • 子節點的寬度問題可以去思考父元素是不是能夠做一些改變實現
          • 多思考,大膽實踐,方法總比困難多,這樣你才會摸索出更多的方法。

          web前端開發崗位,一定要能夠腦洞靈活,各種角度各種方法思考。我們才能游刃有余。謝謝大家。

          我是路程lucky,6年web前端開發經驗,目前參與的項目技術棧主要是React,歡迎關注~

          常,我們希望限制元素相對于其父元素的寬度,同時使其具有動態性。因此,有一個基礎寬度或高度的能力,使其擴展的基礎上,可用的空間。比如說,我們有一個按鈕,它的寬度應該是最小的,不應該低于它的寬度。這就是最大和最小屬性變得方便的地方。

          在本文中,我們將詳細介紹CSS的最大和最小寬度和高度屬性,并使用可能的用例和技巧詳細解釋每一個屬性。

          width 屬性

          首先要討論的是與寬度相關的屬性。我們有min-width和max-width,它們中的每一個都很重要,都有自己的用例。

          Min Width

          設置min-width的值時,其好處在于防止width屬性使用的值變得小于min-width的指定值。 請注意,min-width的默認值是auto,它解析為0。

          讓我們舉一個基本的例子來說明這一點。

          我們有一個按鈕,里面有一個變化的文本。文本的范圍可能從一個單詞到多個單詞。為了確保即使只有一個單詞,它也有最小寬度,應該使用min-width。

          最小寬度為100px,這樣即使按鈕的內容很短,比如Done,或者只有一個圖標,它仍然足夠大,可以被注意到。在使用阿拉伯語等多語言網站時,這一點非常重要。 考慮以下來自Twitter的示例:

          在以前的情況下,按鈕上帶有單詞“??”,表示完成。 按鈕的寬度太小,因此在后面的案例中,我增加了它的最小寬度。

          min-width 和 padding

          在內容較長的情況下,min-width可以擴展按鈕的寬度,而水平方向上的padding應該被添加,以實現一個合適的外觀按鈕。

          Max Width

          在設置max-width值時,它的好處在于防止width屬性使用的值超過max-width的指定值。max-width的默認值是none。

          max-width的常見且簡單的用例是將其與圖像一起使用。 考慮以下示例:

          圖像比它的父元素大。通過使用max-width: 100%,圖像的寬度不會超過其父圖像的寬度。如果圖像比父圖像小,則max-width: 100%不會對圖像產生實際影響,因為它比父圖像小。

          使用最小寬度和最大寬度

          當min-width和max-width都用于一個元素時,它們中的哪一個將覆蓋另一個?換句話說,哪個優先級更高?

          html

          <div class="wrapper">
            <div class="sub"></div>
          </div>

          css

          .sub {
            width: 100px;
            min-width: 50%;
            max-width: 100%;
          }

          初始width值為100px,并在其上加上min-width和max-width值。 結果是元素寬度未超過其包含的塊/父元素的50%。

          height 屬性

          除了最小和最大寬度屬性外,我們還具有與高度相同的屬性。

          min-height

          設置min-height的值時,其好處在于防止使用的height屬性值變得小于min-height的指定值。 請注意,最小高度的默認值為auto,它解析為0。

          我們用一個簡單的例子來演示一下。

          我們有一個帶有描述文本的部分。目標是為section設置一個最小高度,這樣它就可以處理短或長內容??紤]下面的基本情況

          .sub {
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 1rem;
            min-height: 100px;
            color: #fff;
            background: #3c78dB;
          }

          最小高度為100px,使用flexbox時,內容水平和垂直居中。 如果內容更長,會發生什么? 例如一段?

          是的,你猜對了!section的高度將展開以包含新內容。有了它,我們就可以構建靈活的組件,并對其內容做出響應。

          事例源碼:https://codepen.io/shadeed/pen/cfb600cf30acdae9cf6f9cb5347a37cf

          max-height

          在設置max-height值時,它的好處在于防止height屬性使用的值超過max-height的指定值。注意,max-height的默認值是none。

          考慮下面的示例,其中我為內容設置了max-height。 但是,因為它大于指定的空間,所以會發生溢出。 因此,文本超出了其父邊界。

          最小和最大屬性的用例

          我們將介紹min-width,min-height,max-width和max-height的一些常見和不常見的用例。

          標簽列表

          當有一個標簽列表時,建議限制一個標簽的最小寬度,這樣如果它的內容很短,它的外觀就不會受到影響。

          通過具有這種靈活性,無論內容有多短,標簽都將看起來不錯。 但是,如果內容作者輸入了一個非常長的標簽名稱,而他使用的內容管理系統沒有標簽的最大字符長度,將會發生什么情況呢? 我們也可以使用max-width。

          .c-tag {
            display: inline-block;
            min-width: 100px;
            max-width: 250px;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
            /*Other styles*/
          }

          通過使用max-width,標簽寬度將被限制為特定值。 但是,這還不夠,標簽名稱應被截斷。

          事例地址:https://codepen.io/shadeed/pen/320e42b7ad75c438a9e633417d737d16

          按鈕

          對于按鈕的最小值和最大值有不同的用例,因為按鈕組件有多種變體??紤]下面的圖:

          請注意,按鈕的“Get”寬度太小。 如果不設置最小寬度,則由于任何原因而沒有文本時,情況可能會變得更糟。 在這種情況下,設置最小寬度很重要。

          使用 flexbox 將最小寬度設置為零

          min-width的默認值是auto,它被計算為0。當一個元素是一個flex項時,min-width的值不會計算為零。flex 項目的最小大小等于其內容的大小。

          根據CSSWG:

          默認情況下,flex項目不會縮小到它們的最小內容大小(最長單詞或固定大小元素的長度)以下。要更改此設置,請設置min-width或 min-height屬性。

          考慮下面的例子

          這個人的名字有一個很長的單詞,這導致了溢出和水平滾動。盡管如此,我還是在標題中添加了下面的CSS來截斷它

          .c-person__name {
              white-space: nowrap;
              overflow: hidden;
              text-overflow: ellipsis;
          }

          由于title是flex項目,因此解決方案是重置min-width并將其強制為零。

          .c-person__name {
              /*Other styles*/
              min-width: 0;
          }

          下面是修復后的樣子

          根據CSSWG:

          在彈性項目的主軸上可見溢出的項目上,當在彈性項目的主軸min-size屬性中指定時,指定自動最小尺寸。

          意味著,將overflow設置為visible值以外的值會導致min-width被計算為0,這解決了我們不設置min-width: 0的問題。

          事例源碼:https://codepen.io/shadeed/pen/398ccffcd437a2fb042f5ce3bdd68c57

          使用 flexbox 將最小高度設置為零

          雖然與min-width相比,這是一個不太常見的問題,但是它可能發生。 只是為了確認,問題與不能少于其內容的彈性項目有關。 結果min-height值被設置為與內容一樣長。

          考慮以下示例:

          用紅色表示的文本應該在父文本中裁剪。因為面板主體是一個flex項目,所以它的min-height與它的內容相等。為了防止這種情況,我們應該重新設置最小高度值。看看HTML和CSS是怎么樣的。

          HTML

          <div class="c-panel">
            <h2 class="c-panel__title"><!-- Title --></h2>
            <div class="c-panel__body">
              <div class="c-panel__content"><!-- Content --></div>
            </div>
          </div>

          CSS

          .c-panel {
            display: flex;
            flex-direction: column;
            height: 180px;
          }
          
          .c-panel__body {
            min-height: 0;
          }
          
          .c-panel__content {
            overflow-y: scroll;
            height: 100%;
          }

          通過向面板主體添加min-height: 0,這將重置該屬性,并且現在應該可以正常工作。

          事例源碼:https://codepen.io/shadeed/pen/dea75b84b1fcfd03e5c21173a40afc20?editors=0100

          混合最小寬度和最大寬度

          在某些情況下,我們有一個最小寬度的元素,但同時,它沒有最大寬度。這可能會導致組件太寬,而我們并不想這樣做??紤]以下示例

          由于寬度是以像素為單位定義的,因此不能保證上面的方法適用于移動視口。為了解決這個問題,我們可以使用百分比來代替像素作為最小和最大屬性??紤]下面這個具有article主體的示例。

          我為圖像添加了以下CSS:

          img {
            min-width: 35%;
            max-width: 70%;
          }

          事例源碼:https://codepen.io/shadeed/pen/11f49fd1a35ad06ce241bee17c3d3124

          #### 頁面包裝器/容器

          最常用的`max-width`用例之一是頁面包裝器或容器。通過向頁面添加最大寬度,我們可以確保內容對用戶來說是可讀的、易于瀏覽的。

          下面是一個包裝器的例子,它是居中的,左右兩邊有水平的填充。

          .wrapper {
              max-width: 1170px;
              padding-left: 16px;
              padding-right: 16px;
              margin-left: auto;
              margin-right: auto;
          }

          最大寬度和ch單位

          ch 是一個相對于數字0的大小,1ch 就是數字 0 的寬度。如定義一個3ch的寬度,那么就只能裝下 3個0。

          <!-- HTML代碼 -->
          
          <div>0000</div>
          
          /* CSS代碼 */
          
          div {
            width: 3ch;
            background: powderblue;
          }

          在前面的wrapper元素示例中,我們可以利用ch單元,因為它是一個article 主體。

          .wrapper {
              max-width: 70ch;
              /* Other styles */
          }

          對高度未知的元素進行動畫處理

          在某些情況下,我們面臨著使手風琴或移動菜單具有意想不到的內容高度的挑戰。在這種情況下,max-height可能是一個很好的解決方案。

          請考慮以下示例:

          單擊菜單按鈕后,菜單應隨動畫從上到下滑動。 如果沒有固定的高度(不建議這樣做),除非使用JavaScript,否則這是不可能的。 但是,對于max-height,這是可能的。 想法是為高度添加一個較大的值,例如max-height:20rem,可能無法達到,然后我們可以使用動畫從max-height: 0變換到max-height: 20rem。

          .c-nav {
              max-height: 0;
              overflow: hidden;
              transition: 0.3s linear;
          }
          
          .c-nav.is-active {
              max-height: 22rem;
          }

          點擊菜單按鈕可以看到動畫的運行。

          事例源碼:https://codepen.io/shadeed/pen/164c7ef67f5d4541bddb8bc12b2772da

          Hero 元素的最小高度

          一般來說,我不喜歡給元素添加固定的高度。我覺得這樣做,會破壞流式布局的結構。但有些情況設置固定高度卻很有用。

          考慮下面的例子,在這里我們有一個設置了固定高度的hero部分。

          是,當內容較長時,它會溢出并離開hero包裝器,這可不太好。

          為了預先解決這個問題,我們可以使用min-height來代替height。我們可以用這種方式先解決問題,盡管這可能會導致頁面看起來很奇怪,但是我認為應該首先防止內容管理系統(CMS)中發生這樣的事情。這樣,問題就解決了,看起來也不錯。

          內容溢出的問題不僅在于內容是否大于固定的hero 高度。它可以發生在屏幕大小調整作為文本換行的結果。

          如果改用min-height,則上述情況根本不會發生。

          模態組件

          對于模態組件,它需要最小和最大寬度,以便可以適應移動設備到PC的屏幕上的適應。

          思路1

          .c-modal__body {
              width: 600px;
              max-width: 100%;
          }

          思路2

          .c-modal__body {
              width: 100%;
              max-width: 600px;
          }

          對于我來說,我更喜歡第二個思路,因為我只需要定義max-width: 600px。modal是一個<div>元素,因此它已經具有其父元素的100%寬度,對嗎?

          考慮下面為模態設計簡化的測試案例。 請注意,如果可用視口空間不足,則寬度如何更改為其父級的100%。

          事例源碼:https://codepen.io/shadeed/pen/5dcb1c4c6773cc3a97a766c327c36443

          最小高度和粘性頁腳

          當一個網站的內容不夠長,它希望看到頁腳粘到底部。讓我們用一個可視化的例子來更好地展示這一點。

          請注意,頁腳未粘貼在瀏覽器窗口的末尾。 那是因為內容不足以達到瀏覽器窗口高度的長度。 修復后,其外觀應如下所示:

          首先,將body元素作為flexbox容器,然后將其最小高度設置為視口高度的100%。

          事例源碼:https://codepen.io/shadeed/pen/aeb14f2819b9cc4805275b88c2d55645?editors=1100

          最大寬度/高度和視口單位的流體比率

          為了使比例容器能夠根據視口大小進行響應縮放,引入了padding hack。 現在,我們可以通過組合CSS中的視口單位和最大寬度/高度來模仿相同的行為。

          我們有一個尺寸為644 * 1000像素的圖像。 為了使其流暢,我們需要以下內容:

          • 縱橫比:高度/寬度
          • 容器的寬度:可以是固定數字,也可以是動態數字(100%)
          • 設置height為視口寬度的100%乘以縱橫比
          • 設置max-heigh,該高度是容器的寬度乘以縱橫比
          • max-width設置為等于容器寬度

          人才們的 【三連】 就是小智不斷分享的最大動力,如果本篇博客有任何錯誤和建議,歡迎人才們留言,最后,謝謝大家的觀看。


          作者:Ahmad shaded 譯者:前端小智 來源:sitepoint 原文:https://www.impressivewebs.com/min-max-width-height-css


          主站蜘蛛池模板: 中文无码AV一区二区三区| 日本激情一区二区三区| 日韩爆乳一区二区无码| 99久久精品日本一区二区免费| 爆乳熟妇一区二区三区霸乳| 亚洲国产精品一区二区第一页免| 国产精品乱码一区二区三| 精品无码国产AV一区二区三区| 少妇激情一区二区三区视频 | 韩国福利一区二区三区高清视频 | 亚洲视频在线一区二区| 亚洲av无码片vr一区二区三区| 亚洲欧洲一区二区三区| 国产精品一区二区在线观看| 国产aⅴ精品一区二区三区久久| 无码日韩精品一区二区人妻| 视频在线一区二区三区| 亚洲一区二区免费视频| 亚洲线精品一区二区三区| 亚洲av无码片vr一区二区三区| 九九久久99综合一区二区| 中文字幕一区二区三匹| 国内自拍视频一区二区三区| 亚洲一区二区三区免费在线观看| 国产高清一区二区三区| 日本一区二区不卡视频| 日韩精品人妻一区二区中文八零| 波多野结衣中文字幕一区| 无码一区二区波多野结衣播放搜索 | 亚洲AV无码国产一区二区三区| 亚洲另类无码一区二区三区| 综合久久一区二区三区| 国产香蕉一区二区精品视频| 国产婷婷一区二区三区| 中文国产成人精品久久一区| 日本一区二区三区在线网 | 一本大道东京热无码一区| 91午夜精品亚洲一区二区三区 | 国产人妖在线观看一区二区 | 日韩精品中文字幕无码一区| 人妻AV一区二区三区精品|