2008-10-23 17 views
5

Chciałbym wyrównać pary etykiet/wartości w środku za pomocą CSS bez użycia bezwzględnego pozycjonowania lub tabel (patrz zrzut ekranu). Na tym zrzucie ekranu ustawiłem wartość bezwzględną (tj. 4,500 USD/tydz.), A następnie przesunąłem etykietę w górę. Ale absolut nie działa tak dobrze w IE i słyszałem, że to nie jest dobra technika.Pytanie dotyczące pozycjonowania CSS - Tabele vs. bezwzględne vs. DL

Ale jak mogę osiągnąć ten efekt, gdy etykiety są uzasadnione bez absolutnych?

alt text http://www.amherstparents.org/files/shot.jpg

+0

Poniższy komentarz zawiera punkt. Thsi to dane tabelaryczne, dlaczego nie używać tabel? –

+0

Podczas gdy jest to prawda, może być wyświetlane jako dane tabelaryczne, wyświetlacz wizualny (2 zestawy kluczy => pary wartości) czyni to niezręcznym pod względem dostępności, jeśli jest to tabela. Możesz także wyświetlić go jako listę kluczy i wartości, które są wyświetlane w 2 kolumnach ... więc używanie CSS do pozycjonowania również jest rozwiązaniem. – Rahul

+0

(Oczywiście, możesz zrobić dwie tabele i unieść je obok siebie.) To też by się udało.) – Rahul

Odpowiedz

9

Jestem zdezorientowany, co jest tabelaryczne na temat tych danych? Gdzie są zapisy? Rzędy różnych pól naprawdę nie tworzą stołu w tradycyjnym sensie. (Nie hackując go, aby mieć dwie pozycje w wierszu).

Jeśli interesuje nas ten pomysł, to jaka jest różnica między lewą połówką stołu a prawą stroną? Jakie byłyby nagłówki kolumn, gdyby były?

Preferuję propozycję listy definicji, zdecydowanie lepiej pasuje niż tabela. I nie potrzebujesz dwóch kolumn, jeśli wszystkie ID i DD były zmienne: lewe i szerokość: 25%, w następującej kolejności: Koszt, Zwierzęta, Śpiochy, Palenie, itd ... Dlatego możesz użyć 1 listy definicji, tak jak powinno być.

Chociaż prawdopodobnie będziesz potrzebować wyraźnego: pozostawionego na każdym innym ID, na wypadek gdyby zawartość któregokolwiek z tych elementów zawinęła się w dwa wiersze.

<style> 
    dl 
    { 
     float:left; 
     width:100%; 
    } 
    dt, 
    dd 
    { 
     float:left; 
     width:24%; 
     margin:0; 
     padding:0; 
    } 
    dt 
    { 
     text-align:right; 
     padding-right:.33em; 
    } 
    dd 
    { 
     text-align:left; 
    } 
</style> 
<dl> 
    <dt>Cost:</dt> 
    <dd>$4,500/wk</dd> 
    <dt>Pets:</dt> 
    <dd>No</dd> 
    <dt>Sleeps:</dt> 
    <dd>1</dd> 
    <dt>Smoking:</dt> 
    <dd>No</dd> 
</dl> 
+0

Tabele nie zawsze wymagają nagłówków kolumn, ponieważ czasami można użyć nagłówków wierszy - wystarczy pamiętać, aby ustawić atrybut scope = "wiersz | kolumna". –

+0

Dzięki, że udowodni, jak źle byłoby używać stołu.Jako "Koszt" w tym przykładzie nie jest ani nagłówkiem dla wiersza ani kolumny. Tylko * połowa * rzędu! Jak to ma sens dla czytnika ekranu? –

13

Jeśli pokazując danych tabelarycznych nie ma wstydu w użyciu tabeli.

+0

W tym przypadku umieszczenie tekstu w tabeli jest nawet korzystne, ponieważ jest to tytuł tabeli, dlatego "nagłówek" tabeli. Pozostałe kategorie też są, ale wprowadzenie go dodaje wartości semantycznej. – cdeszaq

+0

To nie są dane tabelaryczne. Nie oznacza to, że tabela jest z konieczności nieodpowiednia, ale jest to zestaw par etykiet/wartości, a nie tabela z wierszami i kolumnami. –

3

Użyj stałej szerokości div z właściwością CSS text-align. Nie zapomnij spuścić swoich lewych div.

3

Powiedzmy używasz DL, DT i DD:

<dl> 
<dt>Cost:</dt> 
<dd>$4,500/wk</dd> 
<dt>Sleeps:</dt> 
<dd>1</dd> 
</dl> 

można użyć następujących przybliżonych CSS (niesprawdzone):

dl { width: 200px; } 
dt { width: 100px; text-align: right; float: left; clear: both; } 
dd { width: 100px; margin: 0; float: left; } 

Edit: Jak Chris Marasti-Georg wskazał :

Dodatkowo, jeśli chcesz 2 kolumny, stosowanie 2 listy definicji i unoszą je

+0

Dodatkowo, jeśli potrzebujesz 2 kolumn, użyj 2 list definicji i przenieś je. –

+0

Dzięki za skinienie! * thumbs up * Najbardziej podoba mi się ta odpowiedź. –

2

@jon ma rację, jeśli jego dane tabelaryczne, możesz użyć tabeli. Jednakże, jeśli naprawdę nie chcesz korzystać z tabeli, myślę, że to jest to, co chcesz:

CSS

.label { 
    min-width: 20%; 
    text-align: right; 
    float: left; 
} 

HTML

<div class="pair"> 
    <div class="label">Cost</div> 
    <div class="value">$4,500/wk</div> 
</div> 
<div class="pair"> 
    <div class="label">Sleeps</div> 
    <div class="value">1</div> 
</div> 
<div class="pair"> 
    <div class="label">Bedrooms</div> 
    <div class="value">9</div> 
</div> 

EDIT @ Chris Marasti-Georg wskazuje, że listy definicji byłyby tutaj bardziej odpowiednie. Zgadzam się, ale myślę, że chciałem pokazać, że to samo można łatwo zrobić z dowolnym elementem blokowym, i nie ma nic w domyślnej stylizacji list definicji, która jest potrzebna do osiągnięcia tego celu.

+0

Po co fałszować listę definicji, gdy taka istnieje? –

+0

dobre pytanie. Listy definicji byłyby tutaj bardziej odpowiednie. Zaktualizuję, aby to odnotować. – pkaeding

+0

Jak zauważyłem w podobnym pytaniu, po prostu nie zgadzam się, że jest to semantycznie lista definicji. Jest to zestaw par etykiet/wartości, dla których nie ma standardowego elementu HTML. Ani listy definicji, elementy div, ani tabele nie są bardziej odpowiednie dla tego kontekstu. –

0

Co powiesz na temat używania tabeli do układania tabeli, a następnie używania CSS do pozycjonowania tej tabeli w dowolnym miejscu na swojej stronie?

2

Rozszerzenie na stanowisku Rahul za:

CSS

#list { width: 450px; } 
#left { float: left; background: lightgreen; } 
#right { float: right; background: lightblue; } 
dl { width: 225px; } 
dt { width: 100px; text-align: right; float: left; clear: both; } 
dd { width: 100px; margin: 0; float: left; padding-left: 5px; } 

HTML

<div id="list"> 
    <dl id="left"> 
     <dt>Cost:</dt> 
     <dd>$4,500/wk</dd> 
     <dt>Sleeps:</dt> 
     <dd>1</dd> 
     <dt>Bedrooms:</dt> 
     <dd>9</dd> 
     <dt>Baths:</dt> 
     <dd>6</dd> 
    </dl> 
    <dl id="right"> 
     <dt>Pets:</dt> 
     <dd>No</dd> 
     <dt>Smoking:</dt> 
     <dd>No</dd> 
     <dt>Pool:</dt> 
     <dd>No</dd> 
     <dt>Waterfront:</dt> 
     <dd>No</dd> 
    </dl> 
</div> 

Przetestowałem to pod FF 3.0.1, IE6 i IE7. Kolor tła jest po prostu pomocny w wizualizacji miejsca rozpoczęcia i zakończenia kolumn.

+0

Stosując podejście @ pkaeding, nie musisz dzielić tego arbitralnie na dwa 'dl's. Po prostu przenieś element '.pair' w lewo i nadaj mu szerokość 50%, a uzyskasz efekt dwukolumnowy za darmo. –

0

Krótka uwaga na temat implementacji tego przy użyciu tabel, istnieje kilka konstrukcji, które sprawią, że będzie to dużo dostępne. Najprostszym z nich byłoby proste użycie TH dla etykiet i TD dla wartości. This site ma miłą dyskusję i idzie głębiej w rzeczy takie jak nagłówki dla komórek, itp.

0

zawsze traktowane jako list definicji mają być stosowane do definicji przedmiotów, a nie dla par klucz/wartość. (9 nie jest definicją "sypialni"). Jednak ta konkretna konstrukcja (listy par klucz/wartość) powodowała argumenty od lat, ponieważ nie ma natywnego semantycznego znacznika, który odzwierciedla to poprawnie.

Idź na DL, jeśli nie mówisz o tym, co to jest definicja. Albo idź po stolik. Tabela z parami klucz/wartość w wierszach, jeśli zakres nagłówka/komórki jest poprawnie ustawiona, jest całkowicie poprawna. Robiłem to ostatnio i wydaje mi się, że jest to najdokładniejsza reprezentacja semantyczna.