Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ CSS _ :first-child i :last-child nie działa

Napisany przez: siutek 24.10.2017, 19:05:08

Witam,
tworzę sobie widok tabelaryczny z następującym układem:

  1. <http://december.com/html/4/element/div.html class="postsDiv">
  2. <http://december.com/html/4/element/div.html class="postRow">1</http://december.com/html/4/element/div.html>
  3. <http://december.com/html/4/element/div.html class="postRow">2</http://december.com/html/4/element/div.html>
  4. <http://december.com/html/4/element/div.html class="postRow">3</http://december.com/html/4/element/div.html>
  5. </http://december.com/html/4/element/div.html>


css:
  1. .postsDiv {
  2. width: ~"calc(100% - 100px)";
  3. padding: 20px 50px;
  4. text-align: center;
  5. }
  6. .postRow {
  7. background-color: #fff;
  8. border-radius: 5px;
  9. padding: 15px;
  10. margin-bottom: 10px;
  11. text-align: left;
  12. font-size: 14px;
  13. border-bottom: 2px solid transparent;
  14. }
  15. .postRow:first-child {
  16. margin-top:30px;
  17. }
  18. .postRow:last-child {
  19. margin-bottom:30px;
  20. }


zapisałem calc w taki a nie inny sposób gdyż do generowania cssa korzystam z lessa


Chciałbym aby nad pierwszym elementem na liście zawsze był margines 30px, ten sam odstęp musi się znajdować pod ostatnim elementem. Dlatego wykorzystałem następujący zapis:

Niestety instrukcje first-child i last-child nie działają :/

Drugie pytanie:

Jak zrobić by mając tylko jeden element z klasą .postRow zastosowanie do niego miała pseudoklasa zarówno first-child jak i last:child? Tak by przy jednym wyświetlanym wierszu nad nim i pod nim był margines?

Napisany przez: NetPax 24.10.2017, 19:16:10

Hej,

a to nie powinno być tak

  1. .postsDiv:first-child div {
  2. margin-top:30px;
  3. }

Napisany przez: trueblue 24.10.2017, 19:24:05

Twój CSS działa poprawnie.
A co za tym idzie, odpowiadając na drugie pytanie, nic nie musisz robić, bo te pseudoklasy zadziałają również na jeden element.

Napisany przez: siutek 24.10.2017, 20:05:46

Cytat(NetPax @ 24.10.2017, 20:16:10 ) *
Hej,

a to nie powinno być tak

  1. .postsDiv:first-child div {
  2. margin-top:30px;
  3. }


Próbowałem tak, tylko zamiast .postsDiv:first-child div wpisałem .postsDiv:first-child .postRow - muszę się ograniczyć tylko do elementów z klasą .postRow, bo mam tez inne divy w tym kontenerze.
Niestety powyższy zapis nie zadziałał jak należy. Skutkiem działania kodu było to, że KAŻDY element z klasą .postRow przyjął wartość z :last-child, czyli margin-bottom:30px;

trueblue: Natomiast mój pierwotny kod, który twierdzisz, że działa, w moim przypadku nie działa wcale. nawet z instrukcją !inportant (tak na wszelki wypadek, bo pierwotnie .postRow ma margin-bottom: 10px;).
divy z klasą .postRow nie mają przypisanych ani instrukcji przeznaczonych dla :first-child ani dla :last-child sad.gif

Napisany przez: trueblue 24.10.2017, 20:11:54

Być może masz do czynienia ze zjawiskiem margin collapse.
Czy ten blok elementów styka się jeszcze z innymi? Jeśli tak, to dodaj float:left dla .postRow.

Napisany przez: siutek 24.10.2017, 20:29:58

Cytat(trueblue @ 24.10.2017, 21:11:54 ) *
Być może masz do czynienia ze zjawiskiem margin collapse.
Czy ten blok elementów styka się jeszcze z innymi? Jeśli tak, to dodaj float:left dla .postRow.


Spowodowało to całkowite rozjechanie się elementów wewnątrz divów z klasą .postRow, natomiast one same jak nie miały marginów tak nie mają nadal.
Dodam dla ścisłości, że zarówno nad divami .postRow jak i pod nimi są przyciski <button></button> o następujących klasach:

  1. .bttn {
  2. display: block;
  3. min-width: 210px;
  4. color: #ffffff;
  5. border: none;
  6. border-radius: 5px;
  7. font-size: 14px;
  8. padding: 5px 20px;
  9. text-decoration: none;
  10. line-height: 30px;
  11. cursor: pointer;
  12. }
  13. .newElement {
  14. background: #3498db;
  15. border-bottom: 3px solid #2980b9;
  16. }
  17. .center {
  18. text-align: center;
  19. margin: auto;
  20. }


uściślając więc wygląda to tak:

  1. <http://december.com/html/4/element/div.html class="postsDiv">
  2. <http://december.com/html/4/element/button.html class="bttn center newElement">Dodaj</http://december.com/html/4/element/button.html>
  3. <http://december.com/html/4/element/div.html class="postRow">1</http://december.com/html/4/element/div.html>
  4. <http://december.com/html/4/element/div.html class="postRow">2</http://december.com/html/4/element/div.html>
  5. <http://december.com/html/4/element/div.html class="postRow">3</http://december.com/html/4/element/div.html>
  6. <http://december.com/html/4/element/button.html class="bttn center newElement">Dodaj</http://december.com/html/4/element/button.html>
  7. </http://december.com/html/4/element/div.html>


Nie sądzę by to miało znaczenie, ale idąc Twoim tropem trueblue, tak, divy .postRow stykają się jeszcze z innymi elementami wewnątrz diva .postsDiv.

Napisany przez: trueblue 24.10.2017, 20:36:12

Gdybyś od razu pokazał cały kod, byłoby łatwiej.
Nie :first-child i :last-child, a :first-of-type i :last-of-type.

Napisany przez: siutek 24.10.2017, 20:51:34

Cytat(trueblue @ 24.10.2017, 21:36:12 ) *
Gdybyś od razu pokazał cały kod, byłoby łatwiej.
Nie :first-child i :last-child, a :first-of-type i :last-of-type.


Pięknie! teraz działa, wytłumacz mi tylko dlaczego musiałem zastosować .postRow:first-of-type a nie .postRow:first-child? Przecież nawet biorąc pod uwagę, że tam były buttony, to nie miały one klasy .postRow, a first-child i last-child miały się odnosić tylko do elementów z klasą .postRow. Chyba, że dla nich klasa nie ma znaczenia. odnoszą się do pierwszego i ostatniego dziecka, bez względu na to jaką klasę wskażę przed :

Napisany przez: trueblue 24.10.2017, 21:08:06

Klasa jest brana pod uwagę jednak nie w takim sensie. :first-child to zawsze pierwsze dziecko, czyli w tym przypadku warunek spełni element z taką klasą i pierwszy w kolejności (obydwa warunki spełnione).
Oczywiście rozszerzanie selektora :first-child o klasę przy wyborze nie ma sensu - wystarczy :first-child.

P.S. W :first-of-type oraz :last-of-type, klasa również nie ma sensu.
P.P.S. Dodawanie klasy nie ma sensu w Twoim przypadku.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)