BeautifulCode

Promocje Heliona

Bestsellery Heliona

11 Efekty wizualne

11.1 Przepełnienie i obcinanie

Zwykle zawartość pola blokowego w całości mieści się w granicach tego pola. Jednak w pewnych sytuacjach może się zdarzyć przepełnienie pola, czyli wyjście części lub całej treści poza pole, np.:

Gdy wystąpi przepełnienie, ustawienie własności 'overflow' decyduje o tym, czy pole zostanie obcięte do krawędzi dopełnienia i, jeśli tak, czy zostanie udostępniony jakiś mechanizm przewijania pozwalający uzyskać dostęp do obciętej treści.

11.1.1 Przepełnienie: własność 'overflow'

'overflow'
Wartość:  visible | hidden | scroll | auto | inherit
Wartość domyślna:  visible
Zastosowanie:  niezastępowane elementy blokowe, komórki tabeli oraz elementy blokowo-śródliniowe
Dziedziczenie:  nie
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  jak określono

Własność ta służy do określania, czy treść elementu blokowego wychodząca poza jego pole ma zostać obcięta. Własność ta dotyczy całej treści elementu z wyjątkiem elementów potomnych (oraz ich treści i potomków), których blokiem zawierającym jest obszar widoku lub przodek tego elementu. Opis wartości:

visible
Wartość ta powoduje, że treść nie będzie obcinana, tzn. może zostać zaprezentowana poza polem blokowym.
hidden
Wartość ta powoduje, że treść zostanie obcięta i nie powinien zostać udostępniony żaden mechanizm przewijania pozwalający dotrzeć do obciętego obszaru.
scroll
Wartość ta powoduje, że treść zostanie obcięta i aplikacja kliencka udostępni mechanizm przewijania widoczny na ekranie (np. pasek przewijania). Mechanizm ten powinien być widoczny bez względu na to czy treść została obcięta, czy nie. W ten sposób daje się uniknąć problemu pojawiających się i znikających pasków przewijania w środowiskach dynamicznych. Gdy wartość ta zostanie użyta w druku, przelewająca się treść może zostać wydrukowana.
auto
Działanie wartości 'auto' zależy od aplikacji klienckiej, ale powinna ona powodować pojawianie się mechanizmu przewijania w przepełnionych polach.

Nawet przy własności 'overflow' ustawionej na 'visible' rodzime środowisko operacyjne może obciąć treść do rozmiaru okna dokumentu aplikacji klienckiej.

Aplikacje klienckie muszą własność 'overflow' zastosowaną na rzecz elementu głównego stosować na rzecz obszaru widoku. Jeśli elementem głównym jest HTML języka HTML lub html języka XHTML i element ten zawiera dziecko BODY (HTML) lub body (XHTML), aplikacje klienckie muszą zastosować własność 'overflow' pierwszego takiego dziecka na rzecz obszaru widoku, jeśli wartość dla elementu głównego to 'visible'. Wartość 'visible' zastosowana na rzecz obszaru widoku musi zostać zinterpretowana jako 'auto'. Wartość używana własności 'overflow' elementu, z którego wartość jest przekazywana musi mieć wartość 'visible'.

Pasek przewijania umieszczony na krawędzi pola elementu powinien znajdować się między wewnętrzną krawędzią obramowania a zewnętrzną krawędzią dopełnienia. Przestrzeń zajmowana przez paski przewijania powinna zostać odjęta od wymiarów bloku zawierającego tworzonego przez element zawierający te paski.

Przykłady:

Poniżej znajduje się przykładowy komentarz blokowy (<blockquote>), który nie mieści się w swoim bloku zawierającym (ustanowionym przez element <div>). Kod źródłowy:


<div>
<blockquote>
<p>I didn't like the play, but then I saw
it under adverse conditions - the curtain was up.</p>
<cite>- Groucho Marx</cite>
</blockquote>
</div>

Poniżej znajduje się arkusz stylów służący do kontrolowania rozmiarów i stylu wygenerowanych pól:


div { width : 100px; height: 100px;
      border: thin solid red;
      }

blockquote   { width : 125px; height : 100px;
      margin-top: 50px; margin-left: 50px; 
      border: thin dashed black
      }

cite { display: block;
       text-align : right; 
       border: none
       }

Wartość domyślna własności 'overflow' to 'visible', dzięki czemu element <blockquote> nie zostałby obcięty. Wyglądałoby to mniej więcej tak:

Widoczne przepełnienie   [O]

Ustawienie własności 'overflow' na 'hidden' dla elementu <div> powoduje, że element <blockquote> zostanie obcięty do rozmiaru bloku zawierającego:

Obcięcie przepełnienia   [O]

Wartość 'scroll' spowodowałaby, że aplikacje klienckie posiadające mechanizm przewijania wyświetliłyby go, aby umożliwić dostęp do obciętej treści.

Poniżej znajduje się przykład ilustrujący zachowanie elementu pozycjonowanego bezwzględnie znajdującego się w elemencie wyświetlającym mechanizm przewijania przy przepełnieniu.

Arkusz stylów:


  container { position: relative; border: solid; }
  scroller { overflow: scroll; height: 5em; margin: 5em; }
  satellite { position: absolute; top: 0; }
  body { height: 10em; }

Fragment dokumentu:


  <container>
   <scroller>
    <satellite/>
    <body/>
   </scroller>
  </container>

W tym przypadku element "scroller" nie wyświetli mechanizmu przewijania dla elementu "satellite", ponieważ blok zawierający tego drugiego leży poza elementem, którego nadmiar treści jest obcinana i przewijana.

11.1.2 Obcinanie: własność 'clip'

Wycinek określa jaka część pola obramowania elementu jest widoczna. Domyślnie element nie jest wycinany. Jednak za pomocą własności 'clip' można bezpośrednio określić obszar wycięcia.

'clip'
Wartość:  <shape> | auto | inherit
Wartość domyślna:  auto
Zastosowanie:  elementy pozycjonowane bezwzględnie
Dziedziczenie:  nie
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  dla wartości prostokątnych — prostokąt składający się z czterech wartości obliczanych; w pozostałych przypadkach — jak określono

Własność 'clip' ma zastosowanie tylko do elementów pozycjonowanych bezwzględnie. Opis wartości:

auto
Element nie jest wycinany.
<shape>
W CSS 2.1 jedyną poprawną wartością typu <shape> jest: rect(<top>, <right>, <bottom>, <left>), gdzie <top> i <bottom> określają przesunięcie względem górnej krawędzi obramowania pola, a <right> i <left> określają przesunięcie względem lewej krawędzi obramowania pola w tekście pisanym od lewej i względem prawej krawędzi pola w tekście pisanym od prawej strony. Wartości przesunięć należy oddzielać przecinkami. Aplikacje klienckie muszą rozpoznawać wartości oddzielane przecinkami, ale mogą też obsługiwać zapis bez przecinków (ale nie mieszane rozwiązania), ponieważ poprzednia wersja tej specyfikacji nie była pod tym względem jasna.

<top>, <right>, <bottom> oraz <left> mogą być wartościami wyrażonymi w jednostkach długości lub (<length>) określać wartość 'auto'. Można stosować wartości ujemne. Wartość 'auto' oznacza, że dana krawędź wycinka będzie pokrywała się z krawędzią wygenerowanego pola obramowania elementu (tzn. 'auto' oznacza to samo, co '0' dla wartości <top> i <left> (w tekście pisanym od lewej, <right> w tekście pisanym od prawej strony), to samo, co wartość obliczona wysokości plus suma szerokości pionowych części dopełnienia i krawędzi obramowania dla <bottom>, oraz to samo, co wartość obliczona szerokości plus suma szerokości poziomych części dopełnienia i krawędzi obramowania dla <right> (w tekście pisanym od lewej, <left> w tekście pisanym od prawej), tak, że cztery wartości 'auto' tworzą wycinek pokrywający się z polem obramowania elementu).

Przy zaokrąglaniu współrzędnych na współrzędne pikselowe należy uważać, aby żadne piksele nie pozostały widoczne, gdy <left> i <right> (lub <top> i <bottom>) mają taką samą wartość oraz, aby żadne piksele znajdujące się w obrębie pola obramowania elementu nie pozostały ukryte, gdy wartości te zostaną ustawione na 'auto'.

Wycinek elementu odcina każdy rodzaj treści elementu (np. treść, elementy potomne, tło, obramowanie, ozdobniki tekstu, obrys oraz mechanizm przewijania, jeśli jest widoczny) znajdującej się poza tym obszarem. Treść, która została odcięta nie powoduje przepełnienia.

Przodkowie elementu również mogą odcinać części swojej treści (np. poprzez własną własność 'clip' i/lub jeśli ich własność 'overflow' nie jest ustawiona na 'visible'). Ostateczna prezentacja jest wypadkową tych wszystkich czynników.

Jeśli wycinek wychodzi poza granice okna dokumentu aplikacji klienckiej, treść może zostać obcięta do rozmiaru tego okna przez rodzime środowisko operacyjne.

Przykłady:

Spójrz na następujące reguły:


p { clip: rect(5px, 40px, 45px, 5px); }
p { clip: rect(5px, 55px, 45px, 5px); }

Tworzą one prostokątne wycinki oznaczone przerywaną linią na poniższych ilustracjach:

Dwa wycinki   [O]

Uwaga: w CSS 2.1 wszystkie wycinki rysowania są prostokątne. Przewidujemy dodanie w przyszłości możliwości tworzenia wycinków rysowania o innych kształtach. W przyszłości może także zostać ponownie wprowadzona składnia ustawiania przesunięcia tych kształtów względem każdej krawędzi zamiast przesuwania względem punktu.

11.2 Widzialność: własność 'visibility'

'visibility'
Wartość:  visible | hidden | collapse | inherit
Wartość domyślna:  visible
Zastosowanie:  wszystkie elementy
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  jak określono

Własność 'visibility' określa, czy pola wygenerowane przez element mają zostać zaprezentowane. Niewidoczne pola mimo to mają wpływ na układ (aby wyłączyć generowanie bloku należy ustawić własność 'display' na 'none'). Opis wartości:

visible
Wygenerowane pole jest widoczne.
hidden
Wygenerowane pole jest niewidoczne (całkowicie przezroczyste, nic nie zostaje narysowane), ale bierze udział w układzie. Ponadto potomkowie takiego elementu, których własność 'visibility' jest ustawiona na 'visible' będą widoczni.
collapse
Zobacz podrozdział o dynamicznych efektach wierszy i kolumn w tabelach. Dla elementów innych niż wiersze, grupy wierszy, kolumny i grupy kolumn wartość 'collapse' działa tak samo, co wartość 'hidden'.

Własności tej można używać w połączeniu ze skryptami w celu uzyskania efektów dynamicznych.

W poniższym przykładzie naciśnięcie któregokolwiek przycisku formularza powoduje wywołanie funkcji zdefiniowanej przez autora, która powoduje pojawienie się odpowiedniego pola i ukrycie drugiego. Ponieważ pola te mają takie same rozmiary i położenie, efekt jest taki, że jedno zastępuje drugie. (Kod skryptu został napisany w hipotetycznym języku skryptowym. Może on, ale nie musi, działać w aplikacji klienckiej obsługującej CSS.)


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD><TITLE>Przykład dynamicznej widzialności</TITLE>
<META 
 http-equiv="Content-Script-Type"
 content="application/x-hypothetical-scripting-language">
<STYLE type="text/css">
<!--
   #container1 { position: absolute; 
                 top: 2in; left: 2in; width: 2in }
   #container2 { position: absolute; 
                 top: 2in; left: 2in; width: 2in;
                 visibility: hidden; }
-->
</STYLE>
</HEAD>
<BODY>
<P>Wybierz podejrzanego:</P>
<DIV id="container1">
   <IMG alt="Al Capone" 
        width="100" height="100" 
        src="suspect1.png">
   <P>Imię i nazwisko: Al Capone</P>
   <P>Miejsce pobytu: Chicago</P>
</DIV>

<DIV id="container2">
   <IMG alt="Lucky Luciano" 
        width="100" height="100" 
        src="suspect2.png">
   <P>Imię i nazwisko: Lucky Luciano</P>
   <P>Miejsce pobytu: Nowy Jork</P>
</DIV>

<FORM method="post" 
      action="http://www.suspect.org/process-bums">
   <P>
   <INPUT name="Capone" type="button" 
          value="Capone" 
          onclick='show("container1");hide("container2")'>
   <INPUT name="Luciano" type="button" 
          value="Luciano" 
          onclick='show("container2");hide("container1")'>
</FORM>
</BODY>
</HTML>