整合營銷服務商

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

          免費咨詢熱線:

          下一代 CSS:@container

          下一代 CSS:@container

          章轉自掘金@優弧 https://juejin.cn/post/7044181023696879652

          Chrome 正在試驗 CSS @container 查詢器功能,這是由 Oddbird 的 Miriam Suzanne 和一群網絡平臺開發者支持的 CSS 工作組 Containment Level 3 規范。@container 查詢器使我們能夠根據父容器的大小來設置元素的樣式

          你可以把這些想象成一個媒體查詢(@media),但不是依靠 viewport 來調整樣式,而是你的目標元素的父容器會調整這些樣式。

          容器查詢將是自 CSS3 以來 Web 樣式的最大變化,將會改變我們對“響應式設計”含義的看法。

          viewport 和用戶代理不再是我們創建響應式布局和 UI 樣式的唯一目標。通過容器查詢,元素將能夠定位自己的父元素并相應地應用自己的樣式。這意味著存在于側邊欄、主體或頭圖中的相同元素可能會根據其可用大小和動態看起來完全不同。

          @container 實例

          在本示例中,我在父級中使用了兩張帶有以下標記的卡片:

          <div class="card-container">
              <div class="card">
                  <figure> ...</figure>
                  <div>
                      <div class="meta">
                          <h2>...</h2>
                          <span class="time">...</span>
                      </div>
                      <div class="notes">
                          <p class="desc">...</p>
                          <div class="links">...</div>
                      </div>
                      <button>...</button>
                  </div>
              </div>
          </div>
          復制代碼

          然后,我在將查詢容器樣式的父級(.card-container)上設置 Containment(contain 屬性)。我還在 .card-container 的父級上設置了一個相對網格布局,因此它的 inline-size 將根據該網格而改變。這就是我使用 @container 查詢的內容:

          .card-container {
            contain: layout inline-size;
            width: 100%;
          }
          復制代碼

          現在,我可以查詢容器樣式來調整樣式!這與使用基于寬度的媒體查詢設置樣式的方式非常相似,當元素小于指定尺寸時使用 max-width 設置樣式,當元素大于指定尺寸時使用 min-width。

          /* 當父容器寬度小于 850px,
          不再顯示 .links
          并且減小 .time 字體尺寸 */
          
          @container (max-width: 850px) {
            .links {
              display: none;
            }
          
            .time {
              font-size: 1.25rem;
            }
          
            /* ... */
          }
          
          /* 當父容器寬度小于 650px 時,
          減小 .card 元素之間的網格間距到 1rem */
          
          @container (max-width: 650px) {
            .card {
              gap: 1rem;
            }
          
            /* ... */
          }
          復制代碼

          容器查詢 + 媒體查詢

          容器查詢的最佳功能之一是能夠將 微觀上的布局宏觀上的布局 分開。我們可以使用容器查詢設置單個元素的樣式,創建細微的微觀布局,并使用媒體查詢(宏布局)設置整個頁面布局的樣式。這創造了一個新的控制水平,使界面更具響應性。

          這是另一個示例。它展示了使用媒體查詢進行宏觀布局(即日歷從單面板到多面板)和微觀布局(即日期布局/大小和事件邊距/大小移動),以創建一個漂亮的和諧的查詢。

          容器查詢 + CSS 網格

          我個人最喜歡的查看容器查詢影響的方法之一是查看它們在網格中的工作方式。以下面的植物貿易 UI 為例:

          本網站根本沒有使用媒體查詢。相反,我們只使用容器查詢和 CSS 網格來在不同的視圖中顯示購物卡組件。

          在產品網格中,布局使用了 grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); 標記創建。這將創建一個布局,告訴卡片占用可用的小數空間,直到它們的大小達到 230px,然后下一格切換到下一行。你可以在 1linelayouts.com 上查看更多網格技巧。

          然后,我們有一個容器查詢,當卡片寬度小于 350px 時,它會將卡片樣式設置為采用垂直塊布局,并通過應用 display: flex(默認情況下具有內聯流)轉換為水平內聯布局。

          @container (min-width: 350px) {
            .product-container {
              padding: 0.5rem 0 0;
              display: flex;
            }
          
            /* ... */
          }
          復制代碼

          這意味著每張卡片擁有自己的響應式樣式。這是我們使用產品網格創建宏觀布局以及使用產品卡片創建微觀布局的另一個示例,酷斃了!

          用法

          為了使用@container,首先需要創建一個具有 Containment 的父元素。為此,我們需要在父級上設置 contain: layout inline-size。因為我們目前只能將容器查詢應用于內聯軸,所以我們只可以使用 inline-size。這也可以防止我們的布局在塊方向上中斷。

          設置 contain: layout inline-size 會創建一個新的 Containment 塊 和新的塊格式上下文,讓瀏覽器將其與布局的其余部分分開,現在我們就可以使用容器查詢了!

          限制

          目前,您不能使用基于高度的容器查詢,只能使用塊軸方向上的查詢。為了讓網格子元素與 @container 一起工作,我們需要添加一個容器元素。盡管如此,添加容器仍可讓我們獲得所需的效果。

          試試看

          您現在可以在 Chromium 中試驗 @container 屬性,方法是導航到:Chrome Canary 中的 chrome://flags 頁面并打開 #experimental-container-queries 標志。

          ,Mayuyu來介紹Go語言中一個重要的東西,叫做container。具體源碼可以參考Go語言的源代碼,如下

          路徑:/usr/local/go/src/pkg/container

          Github上的路徑為:https://github.com/astaxie/gopkg/tree/master/container

          container的結構如下

          可以看出包含三部分:heap,list和ring。下面分別介紹

          1. heap

          heap即為堆,是一種常用的數據結構,在源碼里面,提供了接口,在實際使用時需要實現。

          下面是一個關于heap使用的實例。

          代碼:

          package main
          
          import (
              "fmt"
              "container/heap"    
          )
          
          //heap提供了接口,需要自己實現如下方法
          type Heap []int
          
          //構造的是小頂堆,大頂堆只需要改一下下面的符號
          func (h *Heap) Less(i, j int) bool {
              return (*h)[i] < (*h)[j]
          }
          
          func (h *Heap) Swap(i, j int) {
              (*h)[i], (*h)[j]=(*h)[j], (*h)[i]
          }
          
          func (h *Heap) Len() int {
              return len(*h)
          }
          
          func (h *Heap) Pop() interface{} {
              x :=(*h)[h.Len() - 1]
              *h=(*h)[: h.Len() - 1]
              return x
          }
          
          func (h *Heap) Push(x interface{}) {
              *h=append(*h, x.(int))
          }
          
          func (h *Heap) Remove(idx int) interface{} {
              h.Swap(idx, h.Len() - 1)
              return h.Pop()
          }
          
          func main(){
              
              //創建一個heap
              h :=&Heap{}
              
              heap.Init(h)
              //向heap中插入元素
              h.Push(5)
              h.Push(2)
              h.Push(1)
              h.Push(8)
              h.Push(4)
              h.Push(6)
              h.Push(2)
          
              //輸出heap中的元素,相當于一個數組,原始數組
              fmt.Println(h)
          
              //這里必須要reheapify,建立好堆了
              heap.Init(h)
          
              //小頂堆對應的元素在數組中的位置
              fmt.Println(h)
          
              //移除下標為5的元素,下標從0開始
              h.Remove(5)
          
              //按照堆的形式輸出
              for h.Len() > 0 {
                  fmt.Printf("%d ", heap.Pop(h))
              }
              fmt.Println()
          }

          2. list

          list類型是雙向鏈表,具體用法如下

          代碼:

          package main
          
          import (
              "fmt"
              "container/list"    
          )
          
          func main(){
          
              //創建一個雙向鏈表
              ls :=list.New()
          
              //向雙向鏈表中插入26個小寫字母
              for i :=97; i < 123; i++ {
                  ls.PushFront(i)     //PushFront()代表從頭部插入,同樣PushBack()代表從尾部插入
              }
          
              //遍歷雙向鏈表ls中的所有字母
              for it :=ls.Front(); it !=nil; it=it.Next() {
                  fmt.Printf("%c ", it.Value)
              }
              fmt.Println()
          }

          3. ring

          ring是一個環形鏈表,具體用法可以參考如下代碼

          代碼:

          package main
          
          import (
              "fmt"
              "container/ring"    //閉環包引入,詳見/usr/local/go/src/pkg/container/ring
          )
          
          func main(){
              //創建10個元素的閉環
              r :=ring.New(10)
          
              //給閉環中的元素賦值
              for i :=1; i <=r.Len(); i++ {
                  r.Value=i
                  r=r.Next()
              }
          
              //循環打印閉環中的元素值
              r.Do(
                  func(p interface{}){
                      println(p)
                  })
              
              //獲得當前元素之后的第5個元素
              r5 :=r.Move(5)
              fmt.Println(r5)
              fmt.Println(r)
          
              //鏈接當前元素r與r5,相當于刪除了r與r5之間的元素
              r1 :=r.Link(r5)
              fmt.Println(r1)
              fmt.Println(r)
          }

          本文來自博客園,作者:孫龍-程序員,轉載請注明原文鏈接:https://www.cnblogs.com/sunlong88/p/13475647.html


          個網頁前端是由HTML DOM與嵌套組合形成視圖結加上 CSS 樣式的修飾形成視圖,由JavaScript 接受用戶的交互請求,以事件機制來響應用戶交互操作而形成的。CSS是前臺頁面形式最重要的部分,它負責控制DOM元素的頁面布局和顏色、大小的屬性。

          在CSS中有一著名的盒子模型理論,可以用它來控制DOM的位置。基于div+css技術的“盒子模型”的出現大大代替了傳統的table表格嵌套。

          雖然其十分好用,但是對于很多新手來說,卻很難搞清楚它幾個屬性和內容之間的聯系個區別。

          盒子模型概念

          所有頁面的元素都可以看做一個盒子,占據著一定的頁面空間。一般來說這些被占據的空間往往會比單純的內容要大。因此,可以通過盒子的邊框和距離等參數來控制內容的位置。

          Div+CSS 盒子模型

          說明:

          1、Margin:中文叫外邊距,主要作用是控制邊框外(Border以外)的區域,外邊距是透明的

          2、Border:中文叫邊框,是圍繞在內邊距(Padding)和內容外的邊框。注意,它不是透明的

          3、Padding:中文叫內邊距,控制內容周圍的區域,內邊距是透明的

          4、Content:內容,盒子的內容,顯示文本和圖像。

          5、在Css文件中設置的Div的Css.width和Css. height就是內容的寬和高。

          6、盒子實際尺寸有可能大于內容尺寸:

          盒子模型的總寬度等于content(寬)+padding(左右)+border(左右)+margin(左右);

          盒子模型的總高度等于content(高)+padding(上下)+border(上下)+margin(上下);

          實例演示--原始樣式

          接下來通過實例演示的方式來一一講解Margin、Border、Padding的作用和區別。

          頁面如圖所示:


          原始樣式

          代碼:

          HTML:
          <body>
              <div class="TsetUpper"></div>
              <div class="TsetMiddle"></div>
              <div class="TsetDown"></div>
          </body>
          CSS:
          .TsetUpper{
          	width: 400px;
          	height: 200px;
          	background-color: black;
          	position: relative;
          	margin: auto;
          	text-align: center;
          }
          .TsetMiddle{
          	width: 600px;
          	height: 200px;
          	background-color: red;
          	position: relative;
          	margin: auto;
          }
          .TsetDown{
          	width: 400px;
          	height: 200px;
          	background-color: black;
          	position: relative;
          	margin: auto;
          	text-align: center;
          }

          Border

          元素邊框:我們可以在CSS邊框屬性中設置元素邊框的樣式和顏色。

          按如下代碼設置Div(TsetMiddle)的Border(邊框):

          border-style:solid;
          border-width: 10px;
          border-color: aqua;

          刷新頁面如下圖:此時TsetMiddle這個盒子的總寬度已經變成200+30+30了,而且可以設置其底色和線條樣式。

          Border

          Margin

          margin 控制周圍的元素區域。margin 沒有背景顏色,是完全透明的。通過margin可以控制元素與四周元素的空隙距離;

          按如下代碼設置Div(TsetMiddle)的margin(外邊距):

          margin: 30px auto;

          刷新頁面如下圖:此時TsetMiddle這個盒子的總寬度已經變成200+30(Border)+30(Margin)+30(Border)+30(Margin)了。

          Margin

          Padding

          Padding:當元素的 padding(填充)內邊距被清除時,所釋放的區域將會受到元素背景顏色的填充。

          按如下代碼設置Div(TsetMiddle)的margin(外邊距):

          padding: 30px;

          刷新頁面如下圖:此時TsetMiddle這個盒子的總寬度已經變成200+30(Padding)+30(Border)+30(Margin)+30(Padding)+30(Border)+30(Margin)了。

          Padding

          總結

          1、各屬性的值可以用px為單位,也可以用em,百分比等。

          2、可以利用盒子的各種屬性,調整其內容在父容器中的位置。


          主站蜘蛛池模板: 久久精品一区二区三区资源网| 久久精品免费一区二区| 亚洲永久无码3D动漫一区| 精品一区二区三区在线播放视频| 日韩精品一区二区三区不卡 | 中文字幕一区二区三区久久网站| 日韩一区二区三区视频久久| 男人的天堂av亚洲一区2区| 亚洲av无码一区二区三区观看| 中文字幕一区二区人妻| 国产一区二区三区高清视频| 日韩精品无码Av一区二区| 日本精品夜色视频一区二区| 日韩精品一区二区三区中文版 | 一区二区在线观看视频| 亚洲无线码在线一区观看| 成人午夜视频精品一区| 亚洲成a人一区二区三区| 国产一区二区三区在线免费观看| 正在播放国产一区| 国产成人精品一区二区三在线观看| 亚洲日韩AV一区二区三区四区| 国产一区二区三区乱码网站| 国产成人综合一区精品| 精品无码人妻一区二区三区18| 丝袜美腿一区二区三区| 精品国产一区二区三区香蕉事| 国产怡春院无码一区二区| 亚洲综合色一区二区三区| 日韩在线一区二区三区视频| 天堂成人一区二区三区| 精品一区二区三区在线播放| 香蕉久久AⅤ一区二区三区| 精品福利一区二区三区| 国产一区二区女内射| 亚洲综合无码一区二区三区 | 中文字幕无码免费久久9一区9| 国产韩国精品一区二区三区| 中文字幕日本一区| 精品一区二区三区东京热 | 丰满人妻一区二区三区视频53|