時(shí)間:2024-02-08 02:25:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2024-02-08 02:25:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)
網(wǎng)頁(yè)設(shè)計(jì) 兩欄布局或者是三欄布局,css+div在定位方面的使用?:.columns { display: grid; grid-template-columns: 1fr 1fr; gap: 20px;}
完畢!當(dāng)然可以,但是如果我們需要支持一些較舊的瀏覽器怎么辦?然后是 Flexbox。好的!那么文本從一欄流到另一欄呢?沒(méi)問(wèn)題,多列。舊的電子郵件客戶端怎么樣?好吧,我們中的一些人仍然記得如何使用表格布局。<table class="columns"><tr> <td class="columns__item columns__item--first"> <!-- Left --> </td> <td class="columns__item columns__item--second"> <!-- Right --> </td></tr></table>
我將對(duì)類名使用 BEM 表示法,就像我在真實(shí)項(xiàng)目中所做的那樣。我們將為所有演示使用幾乎相同的列組件結(jié)構(gòu),但在某些情況下,我們不需要第一/第二修飾符。.columns { border-collapse: collapse;}.columns__item { padding: 0; width: 50%; vertical-align: top;}
為了在 2002 年留下一個(gè)空白,我會(huì)在中間使用另一個(gè)空單元格和一些額外的元素來(lái)固定寬度。瘋狂的時(shí)代!但今天我更喜歡一些填充:左邊 10px,右邊 10px,不要太花哨。.columns__item--first { padding-right: 10px;}.columns__item--second { padding-left: 10px;}
您可能認(rèn)為在 <div> 上使用 display: table 可以被視為制作兩列布局的另一種方式。但我認(rèn)為表格就是表格,這種行為是來(lái)自瀏覽器還是作者風(fēng)格并不重要。<article class="news"> <h2 class="news__title">Title</h2> <p class="news__lead">Content</p></article>
一旦我們?cè)诿總€(gè)表格單元格中都有兩個(gè)新聞,第一個(gè)“合理”的布局就準(zhǔn)備好了。還有十個(gè)去!<div class="columns"> <div class="columns__item columns__item--first"> <!-- Left --> </div> <div class="columns__item columns__item--second"> <!-- Right --> </div></div>
這是浮動(dòng)的主要問(wèn)題:它們需要被“清除”。如果您的容器中有浮動(dòng)元素,它們會(huì)掉出容器并且容器會(huì)折疊到零高度。.columns { display: flow-root;}
我會(huì)稱它為 display: clear-floats,但這就是我沒(méi)有機(jī)會(huì)進(jìn)入 CSSWG 的原因。.columns__item { width: calc(50% - 10px);}
最后,讓我們將它們浮動(dòng)到父對(duì)象的不同側(cè)面:.columns__item--first { float: left;}.columns__item--second { float: right;}
你有它!第二個(gè)稍微“合理”的雙列選項(xiàng)。讓我們?cè)囋囅乱粋€(gè)!.columns__item { display: inline-block; width: calc(50% - 10px); vertical-align: top;}
現(xiàn)在我們的news塊在“欄目”中,但它們之間的差距看起來(lái)不對(duì)。它看起來(lái)像一個(gè)典型的白色空間。.columns { font-size: 0;}.columns__item { font-size: 16px;}
一旦我們的兩個(gè)列都緊挨著放置,我們就可以在它們之間精確地留出 20px 的間距。由于它是內(nèi)聯(lián)上下文,我們可以將我們的父元素視為一個(gè)句子,這使得嵌套列成為單詞……你看到它的去向了嗎?那就對(duì)了!word-spacing 屬性可以解決問(wèn)題。.columns { word-spacing: 20px; font-size: 0;}.columns__item { word-spacing: normal; font-size: 16px;}
我們不要忘記將嵌套元素重置為正常,就像我們對(duì)字體大小所做的那樣。.columns { columns: 2 20px;}
而已!我不是像 flex 這樣神奇的速記屬性的忠實(shí)粉絲,但我就是無(wú)法抗拒。在一個(gè)屬性中設(shè)置了兩列和一個(gè) 20 像素的間距!是不是很優(yōu)雅?但是有一點(diǎn)不對(duì)勁:.columns__item { break-inside: avoid;}
那很快!第四種雙列布局。讓我們看看是否有比這更好的東西。.columns { display: flex; gap: 20px;}.columns__item { width: 50%;}
但是,如果您不能只支持最近的瀏覽器版本,那么您將不得不告別 gap 屬性并使用一些額外的代碼在列之間留出一些空間。將列推到兩側(cè)并確保它們的寬度像我們之前所做的那樣使用 calc 設(shè)置。.columns { display: flex; justify-content: space-between;}.columns__item { width: calc(50% - 10px);}
最后,一些現(xiàn)代且可用的東西,已經(jīng)是第五個(gè)了!與我們討論過(guò)的許多技術(shù)不同,F(xiàn)lexbox 在今天很重要。但這些天我經(jīng)常尋求下一個(gè)選擇。.columns { display: grid; grid-template-columns: 1fr 1fr; gap: 20px;}
它的美妙之處在于整個(gè)布局由容器定義。當(dāng)然,在某些情況下,您需要將一些屬性應(yīng)用于嵌套元素,但可以僅使用容器的屬性來(lái)實(shí)現(xiàn)基本布局。它對(duì)于使您的布局響應(yīng)媒體查詢特別有用。.columns { position: relative;}.columns__item { position: absolute; top: 0; width: calc(50% - 10px);}
由于絕對(duì)定位元素處于它們的平行世界中,它們往往以一種有趣的方式包含事物,所以讓我們用 calc 來(lái)限制它們的寬度。就像浮動(dòng)一樣,讓我們將列推到兩側(cè),這樣它們就不會(huì)重疊。.columns__item--first { left: 0;}.columns__item--second { right: 0;}
嗯,這個(gè)演示有些不同!與之前的紫色演示不同,這個(gè)演示的頁(yè)面背景充滿了番茄色。那是因?yàn)橥怀鲞@個(gè)群體的性質(zhì)看起來(lái)稍微危險(xiǎn)一些。.columns { writing-mode: vertical-lr;}
看,這已經(jīng)看起來(lái)像一個(gè)布局了!但有些事情需要修復(fù)才能使其可用。就像在 font-size: 0 的情況下,我們需要將列的 writing-mode 恢復(fù)到以前的狀態(tài)。當(dāng)我們這樣做的時(shí)候,讓我們?yōu)槲覀兊牧刑砑訉挾取?br>.columns__item { width: 390px; writing-mode: horizontal-tb;}
不幸的是,我們無(wú)法在 Flexbox 或 Grid 布局之外使用 gap 屬性。因此,讓我們使用古老的技巧:一列后跟另一列將獲得正確的邊距。.columns__item + .columns__item { margin-left: 20px;}
我可能應(yīng)該改用 .columns__item——第一個(gè)選擇器,但這太容易了。我在這里嘗試使用盡可能多的技巧!.columns { display: block; width: 100%; height: 100%;}
你已經(jīng)可以看到這種方式對(duì)內(nèi)容流的友好程度不亞于絕對(duì)定位(一點(diǎn)也不)。至于 HTML,它看起來(lái)不會(huì)很漂亮:<svg class="columns"> <foreignObject> <article class="news news--first"> <h2 class="news__title">Title</h2> <p class="news__lead">Content</p> </article> </foreignObject> <foreignObject> <article class="news news--second"> <h2 class="news__title">Title</h2> <p class="news__lead">Content</p> </article> </foreignObject></svg>
好吧,它不完全是 HTML,而是帶有一些 HTML 的 SVG。盡管如此,在 HTML 文檔中。我不知道它是否合法,但它是完全有效的:<foreignObject x="0" y="0" width="390" height="100%"> <!-- Left --></foreignObject><foreignObject x="410" y="0" width="390" height="100%"> <!-- Right --></foreignObject>
不幸的是,SVG 包裝的內(nèi)容無(wú)法像 HTML 元素那樣影響父元素的尺寸。所以我們必須自己設(shè)置它:在我們的例子中,它占據(jù)了整個(gè)頁(yè)面的高度。.columns__item { position: absolute; clip-path: inset(50%); width: calc(50% - 10px);}
看,柱子還在那里,但它們是看不見(jiàn)的。讓我們把它們放回我們需要的地方!但是父級(jí)的高度現(xiàn)在折疊起來(lái)沒(méi)有任何內(nèi)容,讓我們用 height: 100% 來(lái)修復(fù)它。相對(duì)定位將保持這些列相對(duì)于父塊的大小和位置。.columns { position: relative; height: 100%;}
現(xiàn)在是施展魔法的時(shí)候了。僅對(duì)于此演示,我們?cè)跇?biāo)記中為每個(gè)新聞設(shè)置了 ID:news-first 和 news-second。我們可以使用這些 ID 使這些元素成為具有 -moz-element 函數(shù)的 background-image 屬性的來(lái)源。多虧了多個(gè)背景圖片,我們可以只使用一個(gè)元素。定位我們的元素:第一個(gè)到左上角,第二個(gè)到右上角。我們不需要重復(fù)。.columns { background-image: -moz-element(#news-first), -moz-element(#news-second); background-position: left top, right top; background-repeat: no-repeat;}
VS Code 的 CSS 語(yǔ)法認(rèn)為函數(shù)中的 ID 有問(wèn)題,但它有效!好吧,目前僅在 Firefox 中。正如我之前提到的,它還沒(méi)有準(zhǔn)備好用于任何生產(chǎn)代碼。雖然它不只是編造的,因?yàn)樗?CSS Images Module Level 4 草案的一部分。<frameset cols="50%, 20, 50%" border="0"> <frame frameborder="0" src=""> <frame frameborder="0" src=""> <frame frameborder="0" src=""><frameset>
與“i”代表“內(nèi)聯(lián)”的 <iframe> 元素不同,<frameset> 應(yīng)該占據(jù)整個(gè)窗口。不僅如此,它還應(yīng)該取代 <body> 元素。在包含其他元素的頁(yè)面上使用這種布局技術(shù)是不可能的。沒(méi)問(wèn)題!我們可以將它包裝在另一個(gè)內(nèi)聯(lián)框架中。.columns { display: block; width: 100%; height: 100%; border: none;}
標(biāo)記來(lái)了,這是最令人興奮的部分。我們?cè)?src 屬性中沒(méi)有文件的 URL,而是用特殊的 data:text/html 前綴讓瀏覽器知道它不是 URL,而是“文件”本身。<iframe class="columns" src="data:text/html, <!DOCTYPE html> <meta charset='utf-8'> <frameset cols='50%,20,50%' border='0'> <frame frameborder='0' src='data:text/html,'> <frame frameborder='0' src='data:text/html,'> <frame frameborder='0' src='data:text/html,'> </frameset>"></iframe>
現(xiàn)在我們?cè)?src 屬性中有三個(gè)帶有空文件的嵌套框架。我們要讓中間的那個(gè)空著,因?yàn)樗皇且粋€(gè)缺口。至于另外兩個(gè),會(huì)有我們的新聞文件。我通常在我的標(biāo)記中使用雙引號(hào),但我必須在嵌套文檔中切換為單引號(hào)才能使其正常工作。在下一個(gè)嵌套級(jí)別,我將完全停止使用它們。<iframe class="columns" src="data:text/html, <!DOCTYPE html> <meta charset='utf-8'> <frameset cols='50%, 20, 50%' border='0'> <frame frameborder='0' src='data:text/html, <!DOCTYPE html> <meta charset=utf-8> <style> /* News styles */ </style> <article class=news> <h2 class=news__title>Title</h2> <p class=news__lead>Content</p> </article> '> </frameset>"></iframe>
第二條news也是如此,唯一不同的是背景顏色和內(nèi)容。最讓我吃驚的是它可以在 Firefox、Chrome 和 Safari 中運(yùn)行,盡管 <frameset> 和 <frame> 元素已經(jīng)被棄用了很長(zhǎng)時(shí)間。關(guān)鍵詞:布局,定位,使用,方面,設(shè)計(jì)
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。