Próbuję stworzyć prostą stronę z CSS Grid.
To, czego nie mogę zrobić, to wyśrodkować tekst z HTML do odpowiednich komórek siatki.
Próbowałem umieszczenie treści w oddzielnych div
s zarówno wewnątrz i na zewnątrz left_bg
oraz right_bg
selektorów i gry z niektórych właściwości CSS bezskutecznie.
Jak mam to zrobic?
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
grid-gap: 0px 0px;
}
.left_bg {
display: subgrid;
background-color: #3498db;
grid-column: 1 / 1;
grid-row: 1 / 1;
z-index: 0;
}
.right_bg {
display: subgrid;
background-color: #ecf0f1;
grid-column: 2 / 2;
grid_row: 1 / 1;
z-index: 0;
}
.left_text {
grid-column: 1 / 1;
grid-row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
.right_text {
grid-column: 2 / 2;
grid_row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
<div class="container">
<!--everything on the page-->
<div class="left_bg">
<!--left background color of the page-->
</div>
</div>
<div class="right_bg">
<!--right background color of the page-->
</div>
<div class="left_text">
<!--left side text content-->
<p>Review my stuff</p>
<div class="right_text">
<!--right side text content-->
<p>Hire me!</p>
</div>
</div>
Odpowiedzi:
Ta odpowiedź ma dwie główne sekcje:
Jeśli interesują Cię tylko rozwiązania, pomiń pierwszą sekcję.
Struktura i zakres układu siatki
Aby w pełni zrozumieć, jak działa centrowanie w kontenerze siatki, ważne jest, aby najpierw zrozumieć strukturę i zakres układu siatki.
HTML konstrukcja kontenera siatki ma trzy poziomy:
Każdy z tych poziomów jest niezależny od pozostałych pod względem zastosowania właściwości siatki.
Zakres kontenera sieci jest ograniczony do relacji rodzic-dziecko.
Oznacza to, że kontener siatki jest zawsze elementem nadrzędnym, a element siatki jest zawsze elementem podrzędnym. Właściwości siatki działają tylko w ramach tej relacji.
Potomkowie kontenera siatki poza elementami podrzędnymi nie są częścią układu siatki i nie akceptują właściwości siatki. (Przynajmniej nie do momentu
subgrid
zaimplementowania funkcji, która pozwoli potomkom elementów siatki respektować wiersze głównego kontenera).Oto przykład opisanych powyżej koncepcji struktury i zakresu.
Wyobraź sobie kratkę przypominającą kółko i krzyżyk.
Chcesz, aby X i O były wyśrodkowane w każdej komórce.
Tak więc wyśrodkowujesz na poziomie pojemnika:
Ale ze względu na strukturę i zakres układu siatki,
justify-items
na kontenerze wyśrodkowuje się elementy siatki, a nie treść (przynajmniej nie bezpośrednio).Pokaż fragment kodu
Ten sam problem z
align-items
: Treść może być wyśrodkowana jako produkt uboczny, ale straciłeś projekt układu.Pokaż fragment kodu
Aby wyśrodkować treść, musisz przyjąć inne podejście. Odnosząc się ponownie do struktury i zakresu układu siatki, musisz traktować element siatki jako element nadrzędny, a treść jako element podrzędny.
Pokaż fragment kodu
jsFiddle demo
Sześć metod wyśrodkowania w siatce CSS
Istnieje wiele metod wyśrodkowania elementów siatki i ich zawartości.
Oto podstawowa siatka 2x2:
Flexbox
Aby w prosty i łatwy sposób wyśrodkować zawartość elementów siatki, użyj flexbox.
Dokładniej, zmień element siatki w elastyczny kontener.
W przypadku tej metody nie ma konfliktu, naruszenia specyfikacji ani innego problemu. Jest czysty i ważny.
Pokaż fragment kodu
Zobacz ten post, aby uzyskać pełne wyjaśnienie:
Układ siatki
W ten sam sposób, w jaki element elastyczny może być również kontenerem elastycznym, element siatki może być również kontenerem siatki. To rozwiązanie jest podobne do powyższego rozwiązania flexbox, z tym wyjątkiem, że centrowanie jest wykonywane za pomocą właściwości grid, a nie flex.
Pokaż fragment kodu
auto
marginesySłuży
margin: auto
do wyśrodkowywania elementów siatki w pionie i poziomie.Pokaż fragment kodu
Aby wyśrodkować zawartość elementów siatki, musisz umieścić element w kontenerze grid (lub flex), zawinąć anonimowe elementy w ich własne elementy ( ponieważ nie mogą być bezpośrednio kierowane przez CSS ) i zastosować marginesy do nowych elementów.
Pokaż fragment kodu
Właściwości linii trasowania skrzynki
Rozważając użycie poniższych właściwości w celu wyrównania elementów siatki, przeczytaj
auto
powyższą sekcję dotyczącą marginesów.align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
Aby wyśrodkować zawartość w poziomie w elemencie siatki, można użyć
text-align
właściwości.Pokaż fragment kodu
Zwróć uwagę, że przy centrowaniu w pionie
vertical-align: middle
nie będzie działać.Dzieje się tak, ponieważ
vertical-align
właściwość dotyczy tylko kontenerów wbudowanych i kontenerów komórek tabeli.Pokaż fragment kodu
Można by powiedzieć, że
display: inline-grid
ustanawia kontener na poziomie liniowym i to byłaby prawda. Dlaczego więc nievertical-align
działa w elementach siatki?Powodem jest to, że w kontekście formatowania siatki elementy są traktowane jako elementy blokowe.
W kontekście formatowania bloków , do czego ta
vertical-align
właściwość została pierwotnie zaprojektowana, przeglądarka nie oczekuje, że znajdzie element na poziomie bloku w kontenerze wbudowanym. To nieprawidłowy HTML.Pozycjonowanie CSS
Wreszcie, istnieje ogólne rozwiązanie do centrowania CSS, które działa również w Grid: pozycjonowanie absolutne
Jest to dobra metoda wyśrodkowania obiektów, które należy usunąć z obiegu dokumentów. Na przykład, jeśli chcesz:
Po prostu ustaw
position: absolute
element, który ma być wyśrodkowany, i elementposition: relative
nadrzędny, który będzie służył jako blok zawierający (zwykle jest to element nadrzędny). Coś takiego:Pokaż fragment kodu
Oto pełne wyjaśnienie, jak działa ta metoda:
Oto sekcja dotycząca pozycjonowania bezwzględnego w specyfikacji Grid:
źródło
grid-container
&grid-item
czy tagi HTML?flex
igrid
,align-items
pozostaje takie samo, ale z jakiegoś powodujustify-content
staje sięjustify-items
Możesz użyć flexbox, aby wyśrodkować tekst. Nawiasem mówiąc, nie ma potrzeby stosowania dodatkowych kontenerów, ponieważ tekst jest traktowany jako anonimowy element elastyczny.
Ze specyfikacji flexbox :
Po prostu utwórz elementy siatki jako elastyczne kontenery (
display: flex
) i dodajalign-items: center
ijustify-content: center
wyśrodkuj zarówno w pionie, jak iw poziomie.Przeprowadzono również optymalizację HTML i CSS:
źródło
Nawet nie próbuj używać flex; zostań z siatką css !! :)
https://jsfiddle.net/ctt3bqr0/
wykonuje tutaj pracę centrowania.
Jeśli chcesz wyśrodkować coś, co jest w środku
div
, czyli wewnątrz komórki siatki, musisz zdefiniować zagnieżdżoną siatkę, aby działała. (Proszę spojrzeć na skrzypce w obu przykładach).https://css-tricks.com/snippets/css/complete-guide-grid/
Twoje zdrowie!
źródło
place-self: center;
.Właściwość CSS place-items shortand ustawia odpowiednio właściwości align-items i justify-items. Jeśli druga wartość nie jest ustawiona, używana jest również pierwsza wartość.
źródło
place-items
nie jest obecnie obsługiwany w edgeSpróbuj użyć flex:
Demo Plunkera: https://plnkr.co/edit/nk02ojKuXD2tAqZiWvf9
HTML
źródło
Chcesz to?
źródło
.text{ font-family: Raleway; font-size: large; text-align: center; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); }
Wiem, że to pytanie ma kilka lat, ale jestem zaskoczony, że nikt nie zaproponował:
jest to właściwość bardziej uniwersalna niż justify-content i zdecydowanie nie jest unikalna dla siatki, ale uważam, że kiedy mam do czynienia z tekstem, o co konkretnie chodzi w tym pytaniu, wyrównuje tekst do środka bez wpływu na przestrzeń między elementami siatki lub wyśrodkowaniem w pionie. Wyśrodkowuje tekst w poziomie, w miejscu, w którym stoi na osi pionowej. Uważam również, że usuwa warstwę złożoności, która dodaje usprawiedliwienie-treść i wyrównanie-elementów. justify-content i align-items wpływają na cały element siatki lub elementy, text-align wyśrodkowuje tekst bez wpływu na kontener, w którym się znajduje. Mam nadzieję, że to pomoże.
źródło