In diesem Artikel werden einige reine CSS-Layout- und Satztechniken vorgestellt, die vielleicht nicht jedem bekannt, aber sehr praktisch sind, um einige allgemeine oder spezielle Layouts
zu erreichen.
常见或特殊的布局排版
。
开发每一张网页都离不开布局排版
,基于良好布局排版
打下基础,才能使后续的开发更顺利。当然不能停留在IExplorer
时代那种局限思维上,没办法解决的布局排版
都用JS实现。今时不同往日,现代CSS属性能更好地快速实现各种布局排版
,节约更多时间去摸鱼。
不过按照笔者目前了解的情况来看,大部分同学即使在无需兼容IExplorer
的情况下还是遵循CSS+JS
的方式完成一些常见或特殊的布局排版
。从HTML/CSS/JS
前端三剑客的定位来看,HTML
映射网页的结构,CSS
映射网页的表现,JS
映射网页的行为。
布局排版指将图形、文本、图像、媒体等可视化信息元素在页面布局上调整位置
、尺寸
等属性使页面布局变得条理化的过程。大部分同学认为布局排版
就是几个合理的CSS属性随便拼凑在一起,但多数情况即使实现也会存在瑕疵,此时就可能使用JS介入。
从布局排版
的特征可知它属于表现
范畴,因此笔者认为大部分布局排版
都能使用纯CSS
完成,无需JS介入。
本文秉承能使用CSS实现的效果都优先使用CSS的原则,为大家讲解笔者如何巧妙运用各种纯CSS开发技巧完成一些常见或特殊的布局排版
。
在进入主题前,笔者总结出布局排版
一些必备属性,这些属性能快速搭建整体效果,再通过一些常用选择器加以修饰达到完美效果。看似简单,但使用起来不一定完全驾驭。
必备属性都是一些几何属性,主要用于声明位置
和尺寸
。
float
position/left/right/top/bottom/z-index
display:flex/inline-flex
、flex系列属性
box-sizing/margin/padding/border/width/height
选择器因CSS模块
众多而派生出的数量也众多,若无特别方式记熟这些选择器对应的功能,也很难将其发挥到最大作用。
笔者根据选择器的功能划分出八大类,每个类别的选择器都能在一个应用场景里互相组合,记熟这些类别的选择器,相信就能将选择器发挥到最大作用,也能游刃有余将其应用到一些常见或特殊的布局排版
里。
布局排版
可能只应用到某些选择器,但也不妨碍大家通过以下归类方式记忆。选择器作为CSS的重要组成部分,比起属性组合会有更多的玩法。
基础选择器
选择器 | 别名 | 说明 | 版本 | 常用 |
---|---|---|---|---|
tag |
标签选择器 | 指定类型的标签
|
1 | √ |
#id |
ID选择器 | 指定身份的标签
|
1 | √ |
.class |
类选择器 | 指定类名的标签
|
1 | √ |
* |
通配选择器 | 所有类型的标签 Die Entwicklung jeder Webseite ist untrennbar mit Layout und Schriftsatz , basierend auf einem guten Layout und Schriftsatz , können die spätere Entwicklung reibungsloser gestalten. Natürlich können wir nicht im begrenzten Denken der IExplorer -Ära bleiben. Das nicht lösbare Layout und der Schriftsatz werden alle mit JS implementiert. Heute ist es anders als früher. Moderne CSS-Eigenschaften können verschiedene Layouts und Schriftsätze besser und schneller implementieren, wodurch mehr Zeit beim Fischen gespart wird. | Nach dem aktuellen Verständnis des Autors folgen die meisten Schüler jedoch immer noch der Struktur | der Webseite und
Position
, Größe
und anderer Attribute visueller Informationselemente wie Grafiken, Text, Bilder und Medien auf dem Seitenlayout, um das Seitenlayout zu ändern. Der Prozess der Organisation. Die meisten Studenten denken, dass layout
nur ein paar vernünftige CSS-Eigenschaften sind, die beiläufig zusammengestellt werden, aber in den meisten Fällen wird es Fehler geben, selbst wenn es implementiert wird, und JS kann zum Eingreifen verwendet werden. 🎜Aus den Merkmalen von Layout und Schriftsatz
geht hervor, dass es zur Kategorie Ausdruck
gehört, sodass der Autor davon ausgeht, dass die meisten Layouts verwendet werden und Schriftsatz
kann verwenden. Komplettiert mit reinem CSS, kein JS erforderlich. 🎜Dieser Artikel folgt dem Prinzip, der Verwendung von CSS🎜 für Effekte, die mit CSS erzielt werden können, Vorrang einzuräumen, und erklärt, wie der Autor verschiedene reine CSS-Entwicklungstechniken gekonnt einsetzt, um einige <code>allgemeine oder spezielle Layouts . <h2>🎜Attribute🎜</h2>🎜Vor dem Betreten des Themas fasste der Autor einige wesentliche Attribute von <code>Layout und Schriftsatz
zusammen. Diese Attribute können schnell den Gesamteffekt aufbauen und dann weiter Einige gängige Entscheidungen können geändert werden, um perfekte Ergebnisse zu erzielen. Es scheint einfach zu sein, aber es ist möglicherweise nicht ganz meisterhaft zu bedienen. 🎜Erforderliche Attribute sind einige geometrische Attribute, die hauptsächlich zum Deklarieren von position
und size
verwendet werden. float
position /left/right/top/bottom/z-index
display:flex/inline-flex
, Flex-Serieneigenschaften
box-sizing/margin/padding/border/width/height
allgemeine oder spezielle Layouts
angewendet werden. 🎜Layout
gilt möglicherweise nur für bestimmte Selektoren, hindert jedoch nicht jeden daran, es sich durch die folgenden Klassifizierungsmethoden zu merken. Als wichtiger Bestandteil von CSS bieten Selektoren mehr Spielmöglichkeiten als Attributkombinationen. 🎜Grundlegender Selektor
Selektor | Alias | Beschreibung | Version | Häufig verwendet | 🎜||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Typ des tag angeben🎜🎜1🎜🎜√🎜🎜 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Geben Sie das -Tag des Klassennamens an 🎜🎜1🎜🎜√🎜🎜 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Alle Typen tag 🎜🎜2🎜🎜√🎜🎜🎜🎜
elemP>elemC 🎜🎜Kinderselektor 🎜 |
Die untergeordneten Elemente des Elements 🎜🎜2🎜🎜√🎜🎜🎜🎜elem1+elem2 🎜🎜Angrenzende Geschwisterselektor 🎜 |
Benachbarte sibling elements 🎜🎜2🎜🎜√🎜🎜🎜🎜elem1~elem2 🎜🎜Universeller Geschwisterselektor 🎜 |
Sibling Element nach dem Element 🎜🎜 Häufig verwendet 🎜🎜🎜🎜🎜🎜elem1,elem2 🎜🎜Union-Selektor 🎜 |
Mehrere angegebene Elemente🎜🎜1🎜 🎜√🎜🎜🎜🎜<code>elem.class 🎜🎜Intersection Selector 🎜 |
Element, das den Klassennamen angibt 🎜🎜1🎜🎜√ 🎜🎜🎜🎜🎜🎜Bedingter Selektor🎜🎜🎜🎜🎜🎜Selektor🎜🎜Beschreibung🎜🎜Version🎜🎜Häufig verwendet🎜🎜🎜 🎜🎜🎜:lang 🎜 |
Markup-Sprache angebenElement🎜🎜2🎜🎜×🎜🎜🎜🎜:dir() 🎜 |
Element, das die Schreibrichtung angibt 🎜🎜4🎜🎜× 🎜🎜🎜🎜:has 🎜 |
Das element , das das angegebene Element enthält🎜🎜4🎜🎜×🎜🎜🎜🎜: ist 🎜Elemente, die Bedingungen angeben 🎜🎜4🎜🎜×🎜🎜🎜🎜:nicht 🎜 |
Elemente, die dies nicht tun Bedingungen angeben 🎜🎜 4🎜🎜√🎜🎜🎜🎜:where 🎜 |
Element, das Bedingungen angibt 🎜🎜4🎜🎜×🎜🎜🎜🎜 :scope 🎜 |
Geben Sie element als Referenzpunkt an🎜🎜4🎜🎜×🎜🎜🎜🎜:any-link 🎜 |
Alle, die das link-Element von href enthalten🎜🎜4🎜🎜×🎜🎜🎜🎜:local-link 🎜 |
alle enthalten href und sind absolute Link-Elemente der Adresse 🎜🎜4🎜🎜×🎜🎜🎜🎜
:visited 🎜 |
Besuchtes Link-Element 🎜🎜1🎜🎜×🎜🎜🎜🎜:target 🎜 |
Das Element des aktuellen Ankers 🎜🎜3🎜🎜×🎜🎜🎜 🎜: Fokus 🎜 |
Eingabefokussiertes Formularelement 🎜🎜2🎜🎜√🎜🎜🎜🎜:erforderlich 🎜 |
Eingabe erforderliche Formularelemente 🎜🎜3🎜🎜√🎜🎜🎜🎜:valid 🎜 |
Geben Sie zulässige Formularelemente ein🎜🎜3 🎜🎜√🎜🎜🎜🎜:invalid 🎜 |
Geben Sie ein ungültiges Formularelement ein🎜🎜3🎜🎜√🎜🎜🎜🎜:in-range🎜<td>
<code> Formularelemente innerhalb des Eingabebereichs 🎜🎜3🎜🎜×🎜🎜🎜🎜:out-of-range 🎜 |
Außerhalb des Eingabebereichs Formularelement 🎜🎜3🎜🎜×🎜🎜🎜🎜:checked 🎜 |
Option ausgewählt Formularelement 🎜🎜3🎜🎜 √🎜🎜🎜🎜:optional 🎜 |
Optionales Formularelement 🎜🎜3🎜🎜×🎜🎜🎜🎜:aktiviert 🎜 |
Ereignisaktiviertes Formularelement🎜🎜3🎜🎜×🎜🎜🎜🎜<code>:disabled 🎜 | Event-disabled form element 🎜🎜3🎜🎜√🎜🎜🎜🎜:read-only 🎜 |
Read-only form element 🎜🎜3🎜🎜×🎜🎜🎜🎜:read-write 🎜 |
Lesbares und beschreibbares Formularelement 🎜🎜3🎜🎜×🎜🎜🎜🎜:target-within 🎜Das Element, in dem das interne Ankerelement aktiviert ist 🎜🎜4🎜🎜×🎜🎜🎜🎜:focus-within 🎜 |
Das interne Formularelement ist im Fokus element 🎜🎜4🎜🎜√ 🎜🎜🎜🎜:focus-visible 🎜 |
Geben Sie das fokussierte Formularelement ein 🎜🎜4🎜🎜 ×🎜🎜🎜🎜:blank 🎜 |
Eingabe ist leer Formularelement 🎜🎜4🎜🎜×🎜🎜🎜🎜:user-invalid code>🎜<td>Geben Sie ein zulässiges <code>Formularelement ein code>🎜🎜4🎜🎜×🎜🎜🎜🎜<code>:indeterminate 🎜 | Option unbestimmt Formularelement🎜🎜4🎜🎜×🎜🎜🎜🎜<code>: placeholder-shown 🎜 |
Formularelement angezeigt durch Platzhalter 🎜🎜4🎜🎜√🎜🎜🎜 🎜:current() 🎜 |
Element beim Durchsuchen 🎜🎜4🎜🎜×🎜🎜🎜🎜:past() 🎜Durchsuchtes element 🎜🎜4🎜🎜×🎜🎜 🎜🎜:future() 🎜 |
Unbrowsed element 🎜 🎜 4🎜🎜 /code>🎜 |
Wiedergabe anhalten media element 🎜 🎜4🎜🎜×🎜🎜🎜🎜
:empty 🎜 |
Element ohne untergeordnete Elemente 🎜🎜3🎜🎜√🎜🎜🎜🎜 : nth-child(n) 🎜 |
Das Element mit dem angegebenen sequentiellen Index 🎜🎜3🎜🎜√🎜🎜🎜🎜:nth-last-child(n ) Das 🎜 |
-Element gibt den umgekehrten Reihenfolgeindex des element 🎜🎜3🎜🎜×🎜🎜🎜🎜:first-child 🎜 |
-Elements an Das führende element 🎜🎜2🎜🎜√🎜🎜🎜🎜:last-child 🎜 |
-Element ist das Schwanz-element 🎜🎜 3 🎜🎜√🎜🎜🎜🎜:only-child 🎜 |
Das übergeordnete Element hat nur das element dieses Elements🎜🎜3🎜🎜√🎜🎜🎜🎜:nth-of-type(n)🎜 |
-Tag, das den sequentiellen Index im Tag angibt 🎜🎜3🎜🎜√🎜🎜🎜🎜:nth- last-of-type(n) 🎜 |
-Tag, das den umgekehrten Index des -Tags 🎜🎜3🎜🎜×🎜🎜🎜🎜:first-of-type angibt 🎜 |
Das erste Tag im Tag 🎜🎜3🎜🎜√🎜🎜🎜🎜:last-of-type 🎜 |
Das letzte Tag im TagTag 🎜🎜3🎜🎜√🎜🎜🎜🎜:only-of-type 🎜 |
Das übergeordnete Element hat nur das tag dieses Tags🎜🎜 3🎜🎜√🎜🎜🎜🎜🎜🎜Attribute-Selektor🎜🎜🎜🎜🎜🎜Selector🎜🎜Beschreibung🎜🎜Version🎜🎜Häufig verwendet🎜🎜 🎜🎜🎜🎜<code>[attr] 🎜<td> <code>Element mit dem angegebenen Attribut 🎜🎜2🎜🎜√🎜🎜🎜🎜[attr=val] 🎜 |
Element mit dem Attribut gleich dem angegebenen Wert 🎜🎜2🎜🎜√🎜🎜🎜🎜<code>[attr*=val] 🎜 | Das Element, dessen Attribut den angegebenen Wert enthält🎜🎜3🎜🎜√🎜🎜🎜🎜 <code>[attr^=val] 🎜 |
Element, dessen Attribut mit dem angegebenen Wert beginnt 🎜🎜3🎜🎜 √🎜🎜🎜🎜[attr$=val] 🎜 |
Element, dessen Attribut mit dem angegebenen Wert endet 🎜🎜3🎜🎜√🎜🎜🎜🎜 [attr~=val] 🎜 |
Attribut Element , das den angegebenen Wert (vollständiges Wort) enthält (veraltet) 🎜🎜2🎜🎜×🎜🎜🎜🎜[attr| =val] 🎜 |
-Attribut mit Element , beginnend mit dem angegebenen Wert (vollständiges Wort) (veraltet) 🎜🎜2🎜🎜×🎜🎜🎜🎜🎜🎜Pseudoelement 🎜🎜🎜 🎜🎜🎜Selektor 🎜🎜 Beschreibung 🎜🎜 Version 🎜 🎜Häufig verwendet🎜🎜🎜🎜🎜🎜::before 🎜 |
Inhalt vor dem Element eingefügt 🎜🎜2🎜 🎜√🎜🎜🎜🎜:: after 🎜 |
content 🎜🎜2🎜🎜√🎜🎜🎜🎜::first-letter 🎜 |
element Anfangsbuchstabe 🎜🎜1🎜🎜×🎜🎜🎜🎜::first-line 🎜 |
Die erste Zeile 🎜🎜1🎜 des Elements 🎜×🎜🎜🎜🎜::selection 🎜 |
Das mit der Maus ausgewählte element 🎜🎜3🎜🎜×🎜🎜🎜🎜 ::backdrop 🎜 |
Vollbildmodus element 🎜🎜4🎜🎜×🎜🎜🎜🎜::placeholder 🎜 |
Form Element Platzhalter code>🎜🎜4🎜🎜√🎜🎜🎜🎜TechnikenMit den oben genannten Vorkenntnissen folgen wir dem Autor, um zu erfahren, wie er verschiedene reine CSS-Entwicklungstechniken geschickt einsetzt, um einige 主体布局主体布局指在大部分情况下通用且具备统一特征的占位布局。掌握 全屏布局经典的全屏布局由 <div class="fullscreen-layout"> <header></header> <main></main> <footer></footer> </div> Nach dem Login kopieren
三部分统一声明 .fullscreen-layout { position: relative; width: 400px; height: 400px; header, footer, main { position: absolute; left: 0; right: 0; } header { top: 0; height: 50px; background-color: #f66; } footer { bottom: 0; height: 50px; background-color: #66f; } main { top: 50px; bottom: 50px; background-color: #3c9; } } Nach dem Login kopieren
使用 .fullscreen-layout { display: flex; flex-direction: column; width: 400px; height: 400px; header { height: 50px; background-color: #f66; } footer { height: 50px; background-color: #66f; } main { flex: 1; background-color: #3c9; } } Nach dem Login kopieren 若 div { overflow: hidden; height: 100%; } Nach dem Login kopieren 两列布局经典的两列布局由 <div class="two-column-layout"> <div class="left"></div> <div class="right"></div> </div> Nach dem Login kopieren
左列声明 .two-column-layout { width: 400px; height: 400px; .left { float: left; width: 100px; height: 100%; background-color: #f66; } .right { margin-left: 100px; height: 100%; background-color: #66f; } } Nach dem Login kopieren
左列声明同上,右列声明 .two-column-layout { width: 400px; height: 400px; .left { float: left; width: 100px; height: 100%; background-color: #f66; } .right { overflow: hidden; height: 100%; background-color: #66f; } } Nach dem Login kopieren Nach dem Login kopieren
使用 .two-column-layout { width: 400px; height: 400px; .left { float: left; width: 100px; height: 100%; background-color: #f66; } .right { overflow: hidden; height: 100%; background-color: #66f; } } Nach dem Login kopieren Nach dem Login kopieren 三列布局经典的三列布局由 <div class="three-column-layout"> <div class="left"></div> <div class="center"></div> <div class="right"></div> </div> Nach dem Login kopieren 为了让右列宽度自适应计算,就不使用 HauptlayoutHauptlayout bezieht sich auf das Platzhalterlayout, das üblich ist und in den meisten Situationen einheitliche Eigenschaften aufweist. Die Beherrschung desHauptlayouts ist eine wesentliche Frontend-Fähigkeit. Um anhand von Entwurfszeichnungen einen groben Plan des Gesamtlayouts zu entwickeln, müssen Sie mit den Eigenschaften und der Struktur dieses Hauptlayouts< vertraut sein /code> . <blockquote><h6 data-id="heading-4"><p>Vollbild-Layout</p></h6>🎜Klassisches 🎜Vollbild-Layout🎜 besteht aus <code>oben , unten und < code> Der Hauptkörper besteht aus drei Teilen und seine Eigenschaften sind die drei Teile sind auf den gesamten Bildschirm gestreckt , die Höhe oben und unten ist festgelegt</ code> und <code>die Höhe des Hauptkörpers ist adaptiv . Dieses Layout ist weit verbreitet und auch das Mainstream-Layout der meisten Webanwendungskörper. Normalerweise werden drei Tags <header> , <footer> und <main> für den semantischen Schriftsatz verwendet, < main> ; kann auch die Seitenleiste <aside> oder andere semantische Tags einfügen. 🎜🎜🎜.three-column-layout { width: 400px; height: 400px; .left { float: left; width: 50px; height: 100%; background-color: #f66; } .center { float: left; width: 100px; height: 100%; background-color: #66f; } .right { overflow: hidden; height: 100%; background-color: #3c9; } } Nach dem Login kopieren left:0 und right:0 , um es nach links und rechts auf dem Bildschirm auszudehnen; die Ober- und Unterseite Deklarieren Sie top:0 und bottom:0 , um die Ober- und Unterseite zu absorbieren, und deklarieren Sie die beiden Höhen als feste Werte, um die < zu ändern code>top und bottom werden als obere bzw. untere Höhe deklariert. Die drei Teile werden durch absolute Positionierung an bestimmten Positionen fixiert, sodass sie sich nicht gegenseitig beeinflussen. 🎜.three-column-layout { display: flex; width: 400px; height: 400px; .left { width: 50px; background-color: #f66; } .center { width: 100px; background-color: #66f; } .right { flex: 1; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren flex wird prägnanter sein. display:flex ordnet die untergeordneten Knoten standardmäßig horizontal an. Sie müssen flex-direction:column deklarieren, um die Anordnungsrichtung der untergeordneten Knoten in eine vertikale Anordnung zu ändern und untere Höhen sind fest, daher muss der Hauptkörper als flex:1 Höhe adaptiv deklariert werden. 🎜<div class="grail-layout-x"> <div class="left"></div> <div class="right"></div> <div class="center"></div> </div> Nach dem Login kopieren Nach dem Login kopieren <main> in einem scrollbaren Zustand angezeigt werden muss, deklarieren Sie nicht overflow:auto , um ein adaptives Scrollen des Containers zu ermöglichen Formatierungsprobleme Der Einfluss des Kontexts kann dazu führen, dass das adaptive Scrollen fehlschlägt oder andere unbekannte Effekte hervorruft. Sie müssen einen <div> in <main> einfügen und ihn wie folgt deklarieren. 🎜.grail-layout-x { padding: 0 100px; width: 400px; height: 400px; .left { float: left; margin-left: -100px; width: 100px; height: 100%; background-color: #f66; } .right { float: right; margin-right: -100px; width: 100px; height: 100%; background-color: #66f; } .center { height: 100%; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren 🎜Zweispaltiges Layout🎜🎜Das klassische 🎜zweispaltige Layout🎜 besteht auszwei Spalten links und rechts , und seine Eigenschaften sind Eine Spalte hat eine feste Breite , die andere Spalte hat eine adaptive Breite und zwei Spalten haben eine feste und gleiche Höhe . Im Folgenden wird als Beispiel die feste Breite der linken Spalte und die adaptive Breite der rechten Spalte verwendet und umgekehrt. 🎜🎜🎜<div class="grail-layout-y"> <div class="left"></div> <div class="right"></div> <div class="center"> <div></div> </div> </div> Nach dem Login kopieren Nach dem Login kopieren float:left und eine feste Breite. Da float den Knoten entfließen lässt, muss die rechte Spalte < deklarieren code>margin -left ist die Breite der linken Spalte, um sicherzustellen, dass sich die beiden Spalten nicht überlappen. 🎜.grail-layout-y { width: 400px; height: 400px; .left { float: left; width: 100px; height: 100%; background-color: #f66; } .right { float: right; width: 100px; height: 100%; background-color: #66f; } .center { margin: 0 100px; height: 100%; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren overflow:hidden , um einen BFC-Bereich zu bilden und diesen zu isolieren die Außenwelt. 🎜<div class="grail-layout"> <div class="left"></div> <div class="center"></div> <div class="right"></div> </div> Nach dem Login kopieren Nach dem Login kopieren flex wird prägnanter sein. Die linke Spalte deklariert eine feste Breite und die rechte Spalte deklariert die adaptive Breite flex:1 . 🎜.grail-layout { display: flex; width: 400px; height: 400px; .left { width: 100px; background-color: #f66; } .center { flex: 1; background-color: #3c9; } .right { width: 100px; background-color: #66f; } } Nach dem Login kopieren Nach dem Login kopieren 🎜Dreispaltiges Layout🎜🎜Das klassische 🎜dreispaltige Layout🎜 besteht ausdrei Spalten links, in der Mitte und rechts</code > und seine Eigenschaften sind: code>Die Breite von zwei aufeinanderfolgenden Spalten ist fest , Die Breite der verbleibenden Spalte ist adaptiv und Die Höhe von drei Spalten ist fest und gleich . Im Folgenden werden als Beispiel die feste Breite der linken mittleren Spalte und die adaptive Breite der rechten Spalte verwendet und umgekehrt. Das allgemeine Implementierungsprinzip stimmt mit dem oben genannten zweispaltigen Layout überein. 🎜🎜🎜<div class="average-layout"> <div class="one"></div> <div class="two"></div> <div class="three"></div> <div class="four"></div> </div> Nach dem Login kopieren Nach dem Login kopieren float + margin-left nicht verwendet. Wenn margin-left verwendet wird, muss sie berechnet werden in Verbindung mit der Breite der linken mittleren Spalte. 🎜🎜🎜Überlauf + Float🎜🎜.one { background-color: #f66; } .two { background-color: #66f; } .three { background-color: #f90; } .four { background-color: #09f; } Nach dem Login kopieren Nach dem Login kopieren .three-column-layout { display: flex; width: 400px; height: 400px; .left { width: 50px; background-color: #f66; } .center { width: 100px; background-color: #66f; } .right { flex: 1; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren 圣杯布局/双飞翼布局经典的圣杯布局和双飞翼布局都是由
float 和margin负值 将其拉回与中间列处在同一水平线上
padding 为左右列留出空位,将左右列固定在空位上<li>双飞翼布局:中间列插入子节点并声明margin 为左右列让出空位,将左右列固定在空位上
由于浮动节点在位置上不能高于前面或平级的非浮动节点,否则会导致浮动节点下沉。因此在编写HTML结构时,将中间列节点挪到右列节点后面。 <div class="grail-layout-x"> <div class="left"></div> <div class="right"></div> <div class="center"></div> </div> Nach dem Login kopieren Nach dem Login kopieren .grail-layout-x { padding: 0 100px; width: 400px; height: 400px; .left { float: left; margin-left: -100px; width: 100px; height: 100%; background-color: #f66; } .right { float: right; margin-right: -100px; width: 100px; height: 100%; background-color: #66f; } .center { height: 100%; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren
HTML结构大体同上,只是在中间列里插入一个子节点 <div class="grail-layout-y"> <div class="left"></div> <div class="right"></div> <div class="center"> <div></div> </div> </div> Nach dem Login kopieren Nach dem Login kopieren .grail-layout-y { width: 400px; height: 400px; .left { float: left; width: 100px; height: 100%; background-color: #f66; } .right { float: right; width: 100px; height: 100%; background-color: #66f; } .center { margin: 0 100px; height: 100%; background-color: #3c9; } } Nach dem Login kopieren Nach dem Login kopieren
使用flex实现 <div class="grail-layout"> <div class="left"></div> <div class="center"></div> <div class="right"></div> </div> Nach dem Login kopieren Nach dem Login kopieren .grail-layout { display: flex; width: 400px; height: 400px; .left { width: 100px; background-color: #f66; } .center { flex: 1; background-color: #3c9; } .right { width: 100px; background-color: #66f; } } Nach dem Login kopieren Nach dem Login kopieren 均分布局经典的均分布局由 <div class="average-layout"> <div class="one"></div> <div class="two"></div> <div class="three"></div> <div class="four"></div> </div> Nach dem Login kopieren Nach dem Login kopieren .one { background-color: #f66; } .two { background-color: #66f; } .three { background-color: #f90; } .four { background-color: #09f; } Nach dem Login kopieren Nach dem Login kopieren
每列宽度声明为相等的百分比,若有4列则声明 .average-layout { width: 400px; height: 400px; div { float: left; width: 25%; height: 100%; } } Nach dem Login kopieren
使用flex实现会更简洁。节点声明 .average-layout { display: flex; width: 400px; height: 400px; div { flex: 1; } } Nach dem Login kopieren 居中布局居中布局由 在此直接上一个目前最简单最高效的居中方式。 <div class="center-layout"> <div></div> </div> Nach dem Login kopieren .center-layout { display: flex; width: 400px; height: 400px; background-color: #f66; div { margin: auto; width: 100px; height: 100px; background-color: #66f; } } Nach dem Login kopieren 自适布局自适布局指相对视窗任何尺寸都能占据特定百分比的占位布局。 搭建
1vw 表示1% 视窗宽度<li>1vh 表示1% 视窗高度<li>1vmin 表示1% 视窗宽度和1% 视窗高度里最小者<li>1vmax 表示1% 视窗宽度和1% 视窗高度里最大者视窗宽高在JS里分别对应 /* 基于UI width=750px DPR=2的网页 */ html { font-size: calc(100vw / 7.5); } Nach dem Login kopieren 上述代码使用
+ 、- 、* 、/ 作为运算符号<li>运算顺序:遵循加减乘除运算顺序,可用() 提升运算等级<li>符号连接:每个运算符号必须使用空格 间隔起来<li>混合计算:可混合不同计量单位动态计算第三点尤为重要,若未能遵守,浏览器直接忽略该属性。 上述 在SPA里有遇过因为有滚动条或无滚动条而导致页面路由在跳转过程里发生向左或向右的抖动吗?这让强迫症患者很难受,此时可用 .elem { padding-right: calc(100vw - 100%); } Nach dem Login kopieren 不直接声明 有了 <div class="modal"> <div class="modal-wrapper"></div> </div> Nach dem Login kopieren .modal { display: flex; position: fixed; left: 0; right: 0; top: 0; bottom: 0; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, .5); &-wrapper { width: 50vw; height: 200px; background-color: #f66; } } Nach dem Login kopieren 当然使用 <ul class="selfadaption-layout"> <div class="box-1"></div> <div class="box-2"></div> <div class="box-3"></div> </ul> Nach dem Login kopieren .selfadaption-layout { width: 200px; height: 567px; .box-1 { height: 123px; background-color: #f66; } .box-2 { height: 15%; background-color: #3c9; } .box-3 { height: calc(100% - 123px - 15%); background-color: #09f; } } Nach dem Login kopieren 吸附布局吸附布局指相对视窗任何滚动都能占据特定位置的占位布局。视窗滚动到特定位置,布局固定在该位置,后续不随视窗滚动而滚动。该布局产生的效果俗称 In der jQuery时代 就有很多吸附效果插件,现在三大前端框架也有自身第三方的吸附效果组件。它们都有着共通的实现原理:监听scroll 事件,判断scrollTop 和目标节点 的位置范围,符合条件则将目标节点 的position 声明为fixed 使目标节点 相对于视窗定位,让用户看上去就像钉在视窗指定位置上。JS实现吸附效果的代码在网上一搜一大堆,更何况笔者喜欢耍CSS,在此就不贴相关的JS代码了。在此推荐一个很少见很少用的CSS属性 简单回顾
Standardfluss 🎜🎜2🎜🎜Relative Positionierung 🎜🎜2🎜🎜< tr >🎜absolut🎜🎜Absolute Positionierung 🎜🎜2🎜🎜Feste Positionierung 🎜 🎜2🎜🎜klebrige Positionierung 🎜🎜3🎜🎜🎜🎜当值为 <div class="adsorption-position"> <ul> <li>Top 1</li> <li>Top 2</li> <li>Normal</li> <li>Bottom 1</li> <li>Bottom 2</li> </ul> </div> Nach dem Login kopieren .adsorption-position { overflow: auto; position: relative; width: 400px; height: 280px; outline: 1px solid #3c9; ul { padding: 200px 0; } li { position: sticky; height: 40px; line-height: 40px; text-align: center; color: #fff; &:nth-child(1) { top: 0; z-index: 9; background-color: #f66; } &:nth-child(2) { top: 40px; z-index: 9; background-color: #66f; } &:nth-child(3) { background-color: #f90; } &:nth-child(4) { bottom: 0; z-index: 9; background-color: #09f; } &:nth-child(5) { bottom: 40px; z-index: 9; background-color: #3c9; } } } Nach dem Login kopieren 两行核心CSS代码分别是 细心的同学可能发现这些节点在
<li> :top 为0px ,滚动到容器顶部 就固定<li>第2个<li> :top 为40px ,滚动到距离容器顶部40px 就固定<li>第3个<li> :未声明top/bottom ,就一直保持相对定位<li>第4个<li> :bottom 为40px ,滚动到距离容器底部40px 就固定<li>第5个<li> :bottom 为0px ,滚动到容器底部 就固定当然,换成 值得注意, 兼容性勉强还行,近2年发版的浏览器都能支持, 横向布局横向布局指容器内节点以水平方向排列且溢出部分被隐藏的占位布局。 为了方便使用多种方式实现 <div class="horizontal-layout"> <ul> <li>Alibaba</li> <li>Tencent</li> <li>Baidu</li> <li>Jingdong</li> <li>Ant</li> <li>Netease</li> <li>Meituan</li> <li>ByteDance</li> <li>360</li> <li>Sina</li> </ul> </div> Nach dem Login kopieren .horizontal-layout { overflow: hidden; width: 300px; height: 100px; ul { overflow-x: auto; cursor: pointer; &::-webkit-scrollbar { height: 10px; } &::-webkit-scrollbar-track { background-color: #f0f0f0; } &::-webkit-scrollbar-thumb { border-radius: 5px; background-color: #f66; } } li { overflow: hidden; height: 90px; background-color: #66f; line-height: 90px; text-align: center; font-size: 16px; color: #fff; &:not(:first-child) { margin-left: 10px; } } } Nach dem Login kopieren 有些同学可能会使用 .horizontal-layout.inline { height: 102px; ul { overflow-y: hidden; white-space: nowrap; } li { display: inline-block; width: 90px; } } Nach dem Login kopieren 上述方式在笔者在开发认知里觉得太繁琐,实质上将所有节点当成文本排列,也是醉了。笔者推荐使用 .horizontal-layout.flex { ul { display: flex; flex-wrap: nowrap; justify-content: space-between; } li { flex-shrink: 0; flex-basis: 90px; } } Nach dem Login kopieren 凸显布局凸显布局指容器内节点以同一方向排列且存在一个节点在某个方向上较突出的占位布局。该布局描述起来可能比较拗口,直接看以下效果吧,这是一个横向列表,节点从左往右排列,最右边的节点特别突出。这就是 这里巧妙运用 在此同样原理,当节点声明 <ul class="highlight-layout"> <li>Alibaba</li> <li>Tencent</li> <li>Baidu</li> <li>Jingdong</li> <li>Ant</li> <li>Netease</li> </ul> Nach dem Login kopieren .highlight-layout { display: flex; align-items: center; padding: 0 10px; width: 600px; height: 60px; background-color: #3c9; li { padding: 0 10px; height: 40px; background-color: #3c9; line-height: 40px; font-size: 16px; color: #fff; } &.left li { &:not(:first-child) { margin-left: 10px; } &:last-child { margin-left: auto; } } &.right li { &:not(:last-child) { margin-right: 10px; } &:first-child { margin-right: auto; } } &.top { flex-direction: column; width: 120px; height: 400px; li { &:not(:first-child) { margin-top: 10px; } &:last-child { margin-top: auto; } } } &.bottom { flex-direction: column; width: 120px; height: 400px; li { &:not(:last-child) { margin-bottom: 10px; } &:first-child { margin-bottom: auto; } } } } Nach dem Login kopieren 在此还有一个小技巧,那就是
间距布局间距布局指容器内节点从左往右从上往下排列且以特定间距间隔的占位布局。 在进入编码环节前,笔者想重点讲解
分析
margin 声明<li>B:确定容器内的间距,使用padding 声明,后续方便声明background-color (该步骤很易与上一步骤混淆,请特别注意)<li>C:确定靠近容器边界的节点与容器的间距,使用padding 声明容器而不是使用margin 声明节点(该步骤说明上一步骤的处理结果)<li>D:确认每行节点的左右间距,使用margin-left/margin-right (二选一)声明节点<li>E:确认最左列节点或最右列节点与容器的间距,使用margin-left:0 声明最左列节点或使用margin-right:0 声明最右列节点<li>F:除了首行节点,使用margin-top 声明其余节点<li>G:若希望容器顶部底部留空,使用border-top/border-bottom 代替padding-top/padding-bottom 全部步骤串联起来理解可能会产生混乱,但结合以下代码理解相信就能很快熟悉。以一行排列3个节点总共8个节点为例,最终效果为三行三列。 <ul class="spacing-layout"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> </ul> Nach dem Login kopieren .spacing-layout { display: flex; overflow: auto; flex-wrap: wrap; margin-top: 20px; // 对应A padding: 20px; // 对应B和C // padding-top: 0; // 对应G // padding-bottom: 0; // 对应G // border-top: 20px solid #f66; // 对应G // border-bottom: 20px solid #f66; // 对应G width: 700px; // 稍微留空用于显示滚动条 height: 400px; background-color: #f66; li { width: 200px; height: 200px; background-color: #66f; line-height: 200px; text-align: center; font-size: 20px; color: #fff; &:not(:nth-child(3n)) { margin-right: 20px; // 对应D和E } &:nth-child(n+4) { margin-top: 20px; // 对应F } } } Nach dem Login kopieren 空载布局空载布局指容器内无任何节点时使用其他形式代替的占位布局。还有使用JS判断列表集合为空时显示占位符吗?相信很多使用MVVM框架开发的同学都会使用条件判断的方式渲染虚拟DOM,若列表长度不为0则渲染列表,否则渲染占位符。 <div> <ul v-if="list.length">...</ul> <div v-esle>Empty</div> </div> Nach dem Login kopieren 然而CSS提供一个空判断的选择器
<ul class="empty-layout"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> </ul> <ul class="empty-layout"></ul> Nach dem Login kopieren $empty: "https://yangzw.vip/img/empty.svg"; .empty-layout { overflow: auto; width: 200px; height: 150px; outline: 1px solid #3c9; &:empty { display: flex; justify-content: center; align-items: center; background: url($empty) no-repeat center/100px auto; &::after { margin-top: 90px; font-weight: bold; content: "没钱就没数据"; } } li { padding: 0 10px; height: 30px; background-color: #09f; line-height: 30px; color: #fff; &:nth-child(even) { background-color: #f90; } } } Nach dem Login kopieren 另外还存在一种特殊的 没事, // 作用于所有节点 :empty { display: none; } // 作用于指定节点 .empty-layout:empty { display: none; } Nach dem Login kopieren 多格布局多格布局指容器内节点以动态数量的格子形式排列的占位布局。微信朋友圈的相册就是最常见的 在此留个悬念,不讲解如何实现,看看大家能不能根据笔者列出的提示尝试将该效果复原。主要原理是 <ul class="multigrid-layout"> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> <li class="item"><img src="https://static.yangzw.vip/codepen/ab-3.jpg" alt="8 wissenswerte reine CSS-Layouttechniken" ></li> </ul> Nach dem Login kopieren @mixin square($count: 2) { $length: calc((100% - #{$count} * 10px) / #{$count}); width: $length; height: $length; } .multigrid-layout { display: flex; flex-wrap: wrap; justify-content: flex-start; align-content: flex-start; padding: 5px; border: 1px solid #ccc; border-radius: 5px; width: 400px; height: 400px; li { display: flex; overflow: hidden; justify-content: center; margin: 5px; background-color: #f0f0f0; @include square(3); } img { width: 100%; height: 100%; object-fit: cover; } } // 一个元素 .item:only-child { border-radius: 10px; width: auto; max-width: 80%; height: auto; max-height: 80%; } // 两个元素 .item:first-child:nth-last-child(2), .item:first-child:nth-last-child(2) ~ .item:nth-child(2) { @include square(2); } .item:first-child:nth-last-child(2) { border-radius: 10px 0 0 10px; } .item:first-child:nth-last-child(2) ~ .item:nth-child(2) { border-radius: 0 10px 10px 0; } // 三个元素 .item:first-child:nth-last-child(3), .item:first-child:nth-last-child(3) ~ .item:nth-child(2), .item:first-child:nth-last-child(3) ~ .item:nth-child(3) { @include square(2); } .item:first-child:nth-last-child(3) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(3) ~ .item:nth-child(2) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(3) ~ .item:nth-child(3) { border-bottom-left-radius: 10px; } // 四个元素 .item:first-child:nth-last-child(4), .item:first-child:nth-last-child(4) ~ .item:nth-child(2), .item:first-child:nth-last-child(4) ~ .item:nth-child(3), .item:first-child:nth-last-child(4) ~ .item:nth-child(4) { @include square(2); } .item:first-child:nth-last-child(4) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(4) ~ .item:nth-child(2) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(4) ~ .item:nth-child(3) { border-bottom-left-radius: 10px; } .item:first-child:nth-last-child(4) ~ .item:nth-child(4) { border-bottom-right-radius: 10px; } // 五个元素 .item:first-child:nth-last-child(5) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(5) ~ .item:nth-child(3) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(5) ~ .item:nth-child(4) { border-bottom-left-radius: 10px; } // 六个元素 .item:first-child:nth-last-child(6) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(6) ~ .item:nth-child(3) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(6) ~ .item:nth-child(4) { border-bottom-left-radius: 10px; } .item:first-child:nth-last-child(6) ~ .item:nth-child(6) { border-bottom-right-radius: 10px; } // 七个元素 .item:first-child:nth-last-child(7) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(7) ~ .item:nth-child(3) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(7) ~ .item:nth-child(7) { border-bottom-left-radius: 10px; } // 八个元素 .item:first-child:nth-last-child(8) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(8) ~ .item:nth-child(3) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(8) ~ .item:nth-child(7) { border-bottom-left-radius: 10px; } // 九个元素 .item:first-child:nth-last-child(9) { border-top-left-radius: 10px; } .item:first-child:nth-last-child(9) ~ .item:nth-child(3) { border-top-right-radius: 10px; } .item:first-child:nth-last-child(9) ~ .item:nth-child(7) { border-bottom-left-radius: 10px; } .item:first-child:nth-last-child(9) ~ .item:nth-child(9) { border-bottom-right-radius: 10px; } Nach dem Login kopieren 总结很多同学可能觉得CSS很简单,但真正玩起来也能与JS有得一比。笔者从事前端领域多年,一直致力于CSS技术的研究与应用,当然真的不是为了玩,而是在玩的过程里将实践到的知识充分应用于工作上。 JS重要但CSS同样重要,希望喜欢CSS的同学多多关注笔者,相信你一定会有更多CSS方面的收获。
更多编程相关知识,请访问:编程入门!! Das obige ist der detaillierte Inhalt von8 wissenswerte reine CSS-Layouttechniken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Verwandte Etiketten:
Quelle:juejin.cn
Vorheriger Artikel:So richten Sie eine hierarchische CSS-Beziehung ein
Nächster Artikel:Ein genauerer Blick auf Selektoren in CSS
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Aktuelle Ausgaben
verwandte Themen
Mehr>
|