CSS ja mitä sillä voi tehdä

Merri

Ylläpitäjä
Vastuuhenkilö
Ylläpitäjä
Eli tyylitiedostot käsittelyyn. Yritän tässä pikaisesti selittää mitä tyylitiedostot ovat, miksi niitä käytetään, mitä hyötyä niistä on ja tietenkin koetan saada jonkinlaista esimerkkiä aikaan.

Tyylitiedostojen perimmäinen tarkoitus on määrätä sivun ulkoasu. Ennen CSS:n vakiintumista kaikki tyylit kirjoitettiin HTML:n mukana: aina kun halusi käyttää jotakin muuta kuin selaimen oletuskirjaisimia, piti määrittää font-tagi ja kertoa mitä kirjasinta käyttää. Ja yleensä tämä vaikutti vain tietyn alueen sisällä, esim. kerralla ei saanut kokonaista taulukkoa käyttämään samaa kirjaisinta, vaan sama tagi piti määrittää jokaiseen soluun erikseen. Vähemmästäkin voi päätellä, että tämä tarkoitti todella suurta työtaakkaa päivittää sivua sen jälkeen kun sen kerran sai valmiiksi.

HTML-standardia on nykyisellään muutettu niin, että ainoa asia minkä se määrittää, on elementti jota käytetään ja mitä se sisältää: ulkoasu on jätetty kokonaan CSS:n harteille.

CSS:ää voi liittää HTML-tiedostoon kolmella eri tavalla: HTML-tagin mukana käyttäen STYLE-määrittelyä, HTML-tiedoston mukana omana STYLE-tagina tiedoston HEAD-osassa sekä omassa tiedossaan, jolloin tyylitiedosto linkitetään HTML-tiedostoon erillisellä koodinpätkällä. Havainnollistetaan:

[code:1:0ec04931f9]
Tapa 1: HTML-tagissa

<div style="border-width : 2px; border-style : solid; border-color : blue;">
Tämä layer on reunustettu sinisellä tasaisella kahden pikselin levyisellä reunalla.
</div>
[/code:1:0ec04931f9]

[code:1:0ec04931f9]
Tapa 2: HTML-tiedoston alussa

<html>
<head>
<title>Esimerkkisivu</title>
<style type="text">
BODY {
font-family : verdana, arial, helvetica;
font-size : 10pt;
}
IMG {
border-width : 2px 1px 2px 1px; /* järjestyksessä top right bottom left */
border-style : dashed;
border-color : #ff0000;
}
</style>
</head>
<body>
Kaikki sivulla olevat kuvat on reunustettu ylä- ja alareunasta kahden pikselin ja sivuilta yhden pikselin levyisellä katkoviivalla. Lisäksi koko dokumentin fontti on määritelty käyttämään verdana-kirjasinta koolla kymmenen.
<p />
<img src="testikuva.jpg" alt="Testikuva" title="Testikuva" />
&nbsp;
<img src="testikuva2.jpg" alt="Testikuva" title="Toinen testikuva" />
</body>
</html>
[/code:1:0ec04931f9]

[code:1:0ec04931f9]
Tapa 3: erillinen tiedosto, joka linkitetään HTML-tiedostossa

CSS-tiedosto index.css:
BODY {
font-family : verdana, arial, helvetica;
font-size : 10pt;
}
A:link {
text-color : #0000ff;
text-decoration : none;
}
A:selected {
text-color : #0000ff;
text-decoration : none;
}
A:visited {
text-color : #0000ff;
text-decoration : none;
}
A:hover {
text-color : #0000ff;
text-decoration : underline;
}


HTML-tiedosto index.html:
<html>
<head>
<title>Erillisen CSS-tiedoston testisivu</title>
<link rel="stylesheet" href="index.css" type="text/css">
</head>
<body>
Tämä HTML-tiedosto sisältää erillisen CSS-tiedoston, jossa kirjaisimeksi on määritelty koon kymmenen verdana (jos verdanaa ei löydy, käytetään arialia; jos sitäkään ei löydy, niin helveticaa). Lisäksi kaikki sivulla olevat <a href="http://kontu.merri.net">linkit</a> on tyylitelty niin, että ne ovat aina sinisiä ilman alleviivausta, paitsi jos hiiri on linkin päällä.
</body>
</html>
[/code:1:0ec04931f9]


Tässä taisikin olla tarpeeksi ensimmäistä kertaa varten, teen tätä ilman mitään mallia ja esisuunnittelua omasta päästäni, joten on vähän vaikea keksiä mitä lisää voisi kertoa :)
 
Kiitos :)
Luulen saaneeni kysymykseni nyt muotoilluksi: Miten tehdään laatikko (jossa on tekstiä ja kuvia), joka sijaitsi tietyssä kohdassa (x jotain, y jotain) ja olisi n pikseliä leveä? Miten se merkitään tyylitiedostoon ja miten siihen tulevat elementit merkitään html-tiedostossa?
 
Laatikolla tarkoittanet laeyeria? Jokatapauksessa, tyylitiedostossa:

[code:1:f5aaa57b75]
/* tämä vaikuttaa vain DIV-tageihin joiden CLASS on laatikko */
DIV.laatikko {
position : absolute;
/* absolute = mikään toinen elementti ei vaikuta sijaintiin */
/* relative = elementti sijoitetaan edellisen elementin mukaan */
/* static = elementti sijoitetaan kuten yleensä HTML-sivulla */
width : 500px;
left : 50px;
top : 0px;
border-width : 2px;
border-style : groove; /* ihan vain esittelen näitä eri tyylejä */
border-color : #ff0000;
}
[/code:1:f5aaa57b75]

Kommentit voi surutta poistaa. Sitten HTML-tiedostossa:

[code:1:f5aaa57b75]
<body>
<div class="laatikko">
<img src="kuva.jpg" alt="Kuva" title="Olen kuva" align="right" />
<h1>Moi</h1>
Olen laatikko. Minussa on myös kuva. Huomaa että kuvaan ei ole määritetty mitään CSS:määrittelyä, jolloin sijainnin voi vapaasti määrittää HTML:ssä. Jos kuva on aina samassa paikassa, kannattaa käyttää CSS-määrittelyä. Jos aina käytetään jotakin tiettyä kuvaa, voidaan kuva lisätä layeriin ja tekstin sijoittuminen määrätä käyttäen reunamäärityksiä.
</div>
Tässä on paljon kaikkea satunnaista tekstiä, jotta näemme että layer todellakin sijoittuu täysin vapaasti sivulle.
</body>
[/code:1:f5aaa57b75]

Jänskää on myös se, että voit määrittää otsikolle yksittäisen kuvan. Hmm... tein tässä tällaisen sivun muutama päivä takaperin: http://ttd.maayas.net

Se käyttää kuvaa otsikoissa ja siinä on sijoitettu kuva layerin "taustaksi", vaikka se enemmän tuntuu omalta kuvaltaan - IMG-tagia et silti löydä, vain noiden neljän ruudunkaappauksen osalta. Sivun CSS on HTML-tiedoston lähdekoodissa mukana, joten voit helposti heittää kysymyksiä siitä, jos näet jotakin mielenkiintoista :)

Muoks Huomautuksena, että vaikka sivu toimii IE:llä, se ei näy siinä niin kuin sen pitäisi.
 
Kiitos, juuri tuota tarkoitin :) Ei meillä taidettu koulussa puhua kuin laatikoista, toisaalta en sillä kurssilla oikein keskittynyt.
 
Nyt sitten vähän lisää tietoa noista position : static / relative / absolute -kohdista (päivitin staticin siis tuonne edelliseen viestiini).

position : static; käyttää HTML-elementin normaalia sijoittamista. Toisin sanoen, edellisen elementin viereen vastaavasti sijoitettuna kuin edellinen elementti, paitsi jos tälle on määritelty eri align. Elementti sijoitetaan tilan mukaan, jos se on esimerkiksi solun sisällä, sijoittuu se solussa esim. normaalisti vasempaan laitaan.

position : relative; sijoitetaan suhteellisesti edelliseen elementtiin siten, että se on oletuksena edellisen elementin alapuolella. Toisin sanoen X-koordinaatti on sama kuin edellisella elementillä, mutta Y-koordinaattiin on lisätty edellisen elementin korkeus. Tämä mahdollistaa tarkat suhteelliset sijoittamiset elementtien välillä, mutta useamman elementin linkittäminen monimutkaisesti toisiinsa saattaa johtaa siihen, että yhden arvon muuttuminen vääräksi pilaa koko ulkoasun.

position : absolute; käyttää täsmällisesti annettua X- ja Y-koordinaattia. Nollapiste on aina sivun vasemmassa yläreunassa. Edes sivun marginaaleja ei oteta huomioon, vaan vasen yläreuna on vasen yläreuna ilman mitään häiriötekijöitä. Haittana tällä on se, että prosentuaalisia arvoja on vaikea antaa: jos leveydeksi määrittää 100%, se tarkoittaa sivun täyttä leveyttä ilman marginaaleja. Toisin sanoen elementistä ei tulekaan selaimen näkymän levyinen vaan siitä jätetään marginaalit pois. Tämän voi tietenkin kiertää sillä, että marginaalit ottaa pois. Tämä kuitenkin vie samalla absoluten hyötyä pois, sillä saman tuloksen saa aikaan relative:lla. Absoluuttisella sijoittelulla voikin lähinnä siirtää myöhemmin lisättyjä, aiemmista elementeistä riippumattomia elementtejä siirrellä haluamiinsa sijainteihin aavistuksen helpommin. Valitettavasti relatiivisten ja absoluuttisten sijoittamisten sekakäyttö aiheuttaa eri selaimilla erilaisia ongelmia, joten yleensä on pakko käyttää vain toista.


Sitten sivun marginaalien poisto:

[code:1:8c14cfaef7]
BODY {
margin : 0px 0px 0px 0px; /* Mozilla ja Internet Explorer */
padding : 0px 0px 0px 0px; /* Opera */
}
[/code:1:8c14cfaef7]

Tämän jälkeen saa ihan koko selainikkunan käyttöönsä ilman "surureunoja".


Muoks Hmm, valitan hiukan epäselkeää sepustusta, mutta väsymys painaa jo hiukan kun tulin nukkuneesti huonosti edellisyönä.
 
[code:1:17e1209c2c]
BODY {
margin : 0px 0px 0px 0px; /* Mozilla ja Internet Explorer */
padding : 0px 0px 0px 0px; /* Opera */
}
[/code:1:17e1209c2c]
Tuon voi tehdä toki myös näin:

[code:1:17e1209c2c]
BODY {
margin: 0; /* Tämä määrää kaikki marginaalit nollaan */
margin: 0 0; /* Tämä määrää ylä- ja vasemman marginaalin nollaan, sekä näiden vastakkaiset puolet.*/
margin: 1 2 3; /* Nyt ylä marginaali on 1, vasen ja oikea kaksi ja alamarginaali 3 */
}
[/code:1:17e1209c2c]
 
Mittayksikkö kannattaa aina määrittää, oli luku vaikka mikä. Sitten voi vielä tehdä näin:

[code:1:8605789ba4]
BODY {
margin-bottom : 0px;
margin-left : 0px;
margin-right : 0px;
margin-top : 0px;
}
[/code:1:8605789ba4]

Ja sama paddingin kanssa. Näitä ei ymmärrettävistä syistä tule kovin usein käytettyä, lähinnä hyötyä on silloin kun haluaa että jokin reuna käyttääkin selaimen oletusmarginaalia.

Sitten tästä :-merkin paikasta: olen huomannut joitakin outoja käyttäytymisiä kun olen käyttänyt :-merkkiä sanassa kiinni. En muista enää tarkemmin mitä tämä oli, mutta jostakin kumman syystä merkin sijainnin vaihtaminen sai toimimaan jonkin asian jollakin selaimella, joka ei aiemmin toiminut. Tai sitten se sai sen toimimaan oikein. Koodilukijat ovat välillä ihmeellisiä :D
 
Sitten vähän taustakuvien ihmeellisestä maailmasta:

[code:1:316c65e6b8]
BODY {
background : url(img/bg.png);
}
[/code:1:316c65e6b8]

Tämä lisää taustalle img-hakemistossa olevan bg.png-nimisen kuvan. Tätä url-systeemiä voi käyttää myös vähän toisella tavalla:

[code:1:316c65e6b8]
BODY {
background : url(img/bg.png) center left no-repeat;
}
[/code:1:316c65e6b8]

Tämä laittaa taustaksi saman kuvan, mutta keskittää sen pystysuunnassa ja vaakasuunnassa laittaa vasempaan laitaan, niin ettei sitä toisteta kuin yhden ainokaisen kerran.

[code:1:316c65e6b8]
BODY {
background : url(img/bg.png) center left;
}
[/code:1:316c65e6b8]

Tämän pitäisi tehdä sama temppu, mutta niin että kuva kopioituu loputtomiin vaakasuunnassa.

Huom! tämä toimii melkein kaikkiin HTML-elementteihin, ei vain BODY:yn! Eli voit määrittää vaikka kuvalle taustakuvan jos tahdot kikkailla. Voit vaikka tehdä tyylin IMG.pikkukuva, joka olettaa vaikka että kaikki siinä käytetyt kuvat ovat 150 x 150 pikselin kokoisia ja laittaa sitten näkymätöntä reunaa sopivasti: tämän tilalla näkyykin kuvalle määritelty taustakuva. Ainakin pitäisi, jotkut selaimet eivät välttämättä toimi niin kuin niiden pitäisi.
 
Hauskaa nähdä, että valistustyötä CSS:n suhteen tehdään täälläkin.

Merri tuossa aiemmin ihmetteli : -merkin käyttöä. Periaatteessa W3C:n ohjeistuksen mukaan sen paikalla ei ole muuta merkitystä kuin että se pitää olla :). Tässäkin on eri selainten kohdalla merkitystä jonkin verran. Jopa selaimet, kuten Opera ja Mozilla, jotka W3C:n mukaan tukevat CSS:ää parhaiten, näyttävät sivuja eri tavalla.
Jotta CSS:n oppii hallitsemaan edes jotenkin, suosittelen käyttämään yksityiskohtaisempia kuvauksia alussa, tyyliin:
[code:1:d59c27e35e]#kuva {
background-image: url(kuvat/logo.png);
background-repeat:no-repeat;
background-position:center;
width:220px;
height:50px;
float:left;
}
[/code:1:d59c27e35e]

Tuo on suoraan eräältä minun tekemältä sivulta.

Värit ja niiden ilmaisu on hyvä esimerkki CSS:n ominaisuuksista.
[code:1:d59c27e35e]
color: #FF0000;
[/code:1:d59c27e35e]
on yhtä oikein kuin
[code:1:d59c27e35e]
color:#F00;
[/code:1:d59c27e35e]
tai
[code:1:d59c27e35e]
color: RGB (0%, 100%, 100%);
[/code:1:d59c27e35e]
tai
[code:1:d59c27e35e]
color:RGB (255, 0, 0);
[/code:1:d59c27e35e]
tai
[code:1:d59c27e35e]
color: red;
[/code:1:d59c27e35e]

Ei muuta kuin kokeilemaan. ;)
 
Olen taas palannut laatikoiden ihmeelliseen maailmaan :)
Jos haluaisin tehdä ison laatikon, jonka sisällä olisi pieniä laatikoita ja haluaisin ison laatikon olevan keskellä sivua miten sen tekisin? Pienistä laatikoista luulen selviäväni. Ne vain ovat ison sisällä.
 
Tämän ratkaisu on siitä monimutkainen, että se täytyy kikkailla eri tavalla eri selaimille. Mutta minulla on siihenkin koodi olemassa *kaivelee tiedostojaan*

[code:1:8c6b451b47]
/* tämä toimii Mozilloissa */
DIV.keskitetty {
margin-left : auto;
margin-right : auto;
}

/* elementtiin, jonka sisällä tämä iso keskitettyävä laatikko on (esim. BODY) */
BODY {
text-align : center;
}
[/code:1:8c6b451b47]

Opera matkii sen verran IE:n käyttäytymistä, että siihen toimii sama kikka. Huomaa että jos kirjoitat margin : auto; niin laatikon pitäisi keskittyä myös pystysuunnassa (Mozillassa). Jos tahdot pystysuuntaisen keskityksen sivulle IE:ssä, joudut valitettavasti tekemään taulukon, joka on koko sivun kokoinen (width = 100% ja height = 100%).
 
Ei se keskittynyt mutta kiitos kuitenkin :)

Olen säälittävän ylpeä ensimmäisestä yritelmästäni: http://www.students.oamk.fi/~kaniinik/opiskelu/tyot/enostonewww/kirjaluonnos.html
Koko päivä siihen melkein meni.
 
[code:1:848444f389]
margin-left : 0 auto;
margin-right : 0 auto;
[/code:1:848444f389]

Nollat poiis :)

Tällä sivulla näet tämän keskityskoodin toimimassa käytännössä: http://ttd.maayas.net/ (CSS on samassa lähdekoodissa)
 
Kokeilin ilman nolliakin eikä se toiminut.
Tuo sivu muuten näyttää todella oudolta Netscapella, teksti menee kuvan päälle.
Tämä selain kyllä käyttäytyy vähän oudosti mutta kokeilin sivuani kahdella muullakin selaimella.
 
Vika johtunee siitä, että sivu on suunniteltu standardin rajojen mukaan... joustin lähinnä siinä, että sivu toimii IE:llä (vaikka se näyttää silläkin rumalta). Keskityksen pitäisi kuitenkin toimia?


Ah! Nyt löysin mahdollisen vian: keskitys ei toimi koska käytät XHTML 1.0:aa ja minun neuvomiseni toimivat vähän löysemmässä HTML 4.01 -määrittelyssä. Eli käytännössä muuttamalla DOCTYPEä saat keskityksen toimimaan.
 
Nyt se toimi! :)

Main-laatikon leveys oli 700 px eikä 700px. Aivan liian tarkkaa puuhaa minulle :D Se kaipaa vielä runsaasti hiomista mutta ainakin asettelu on sellainen kun haluan eikä yhtään taulukoita ole käytetty.
Ja CSS-validaattori ei löytänyt siitä virheitä (se sen 700 px -jutunkin keksi).

Kiitos vielä kerran :)
 
Nytpä ei häiritse muu kuin se, että tuon hahmon käsi katkeaa kahtia :D
 
Käden katkeaminen on Eredin vika, hän on kuvan piirtänyt :)

Ehkä tuon sivun tekeminen ei ole suuri saavutus mutta olen todella ylpeä itsestäni. Kun sain selville miten laitetaan laatikoita vierekkäin (eikä päällekkäin, ensimmäinen versioni oli hieman erikoinen) hypin ilosta ilmaan. Tuo on oikealle (tosin sukulaiselle) tuleva oikea projekti jonka aloittamista olen vältellyt maaliskuusta lähtien. Kun olen vielä saanut palkankin työstä jo aikoja sitten on siitä muodostunut päässäni hirviö. Mutta ehkä se ei nyt niin kauheaa olekaan. Pitää vain tehdä tuollaiset sivut paristakymmenestä kirjasta ja yrityksen muusta toiminnasta... Ja seuraavaksi pitää yrittää tehdä jotain tekstille.

Sain tehtyä version jossa on kahdenlaisia linkkejä :) http://www.students.oamk.fi/~kaniinik/opiskelu/tyot/enostonewww/kirjaluonnos.html

Siinä ei ole kyllä vielä paljon mitään mutta olisin todella kiitollinen kaikenlaisista kommenteista, vaikka yksityisviestillä (olen aivan tarpeeksi käyttänyt tilaa tästä keskustelusta itselleni).
 
Kertokaapas miten saa taustakuvion vain yhden kerran taulukon sisään (keskelle)? Noudattamalla teidän ohjeita taustakuvio oli sekä ”taustapaperilla” että taulukossa. Taulukossa kaiken lisäksi vielä toistettuna.
 
Tämä koodi toimi ainakin Firefoxilla mallikkaasti:

[code:1:3693f1a1ce]
<html><head><title>Jonkunlainen esimerkkisivu</title>
<style type="text/css">
.kuva {
background : url(bg.png) center center no-repeat;
}
</style>
</head><body>
<table class="kuva" align="center"><tr><td width="50%">
Katsotaanpa...
</td><td width="50%">
Toimiiko...
</td></tr></table>
</body></html>
[/code:1:3693f1a1ce]
 
Ylös