Knapper (buttons) med CSS3




Hvad går det ud på?

CSS3 giver en masse muligheder for at lave animationer og andre grafiske virkemidler, så ved ikke at betragte en knap som noget man absolut skal lave med tag'en BUTTON, men blot et stykke grafik man klikker på, får man rige muligheder for at udfolde sin kreativitet.

Lad det være sagt med det samme: Denne type knapper er ikke for begyndere eller utålmodige personer. Nogle løsninger er bestemt lettere end andre, men i forhold til at bruge en tag og sætte et par attributter, som man kan med langt det meste HTML, er dette at betragte som et trin op i sværhedsgrad.

På siden her gennemgår jeg en række eksempler, som man kan bruge til inspiration. Fordi dette er en kreativ øvelse, mere end teknik, er det umuligt at gennemgå emnet til fulde. Rundt omkring på nettet kan man finde en masse andre eksempler, som man ligeledes kan bruge.


Rullende baggrundsfarve

En af de effekter man kan lave, er rullende baggrundsfarve. Effekten benytter sig af to dele: en keyframe-animation, her kalder vi den ChangeBG, hvor vi sætter farver og hvornår i tidsforløbet farveændringen skal ske. Denne skal være i style sheetet og ser således ud:

@keyframes ChangeBG {

    0%, 5%, 100%{
        background-color: red;
    }

    10%, 15%, 90%{
        background-color: orange;
    }

    20%, 25%, 80%{
        background-color: yellow;
    }

    30%, 35%, 70%{
        background-color: green;
    }

    40%, 45%, 60%{
        background-color: blue;
    }

    50%{
        background-color: magenta;
    }
}


Knappen vi skal bruge er blot en almindelig DIV, som skal styles. Her ser koden der skal på siden således ud:

<DIV CLASS="Button">Rullende baggrundsfarve</DIV>


Stylingen, som er klassen Button, ser således ud:

.Button {
    animation: ChangeBG 35s ease-out 1s alternate infinite both;
    color: #FFFFFF;
    margin: 10px;
    height: 50px;
    width: 200px;
    font-size:12.0pt;
    font-weight:bold;
    text-align: center;
    vertical-align:center;
    line-height: 50px;
}


Her specificerer man hvilken animation der skal køres, og variabler dertil, i linje 1, og resten er blot styling af en DIV som vi kender det med størrelse udseende. På skærmen kommer det til at se således ud:

Rullende baggrundsfarve



Synkende baggrund

En effekt man relativt let kan lave er illusionen af at knappen synker ned, når man holder musen over. Effekten består af tre dele. Det første vi skal bruge er selve knappen på siden. Her bruger vi blot en almindelig DIV, som skal styles. Her ser koden der skal på siden således ud:

<DIV CLASS="Button">Hold musen over</DIV>


Stylingen, som er klassen Button, ser således ud:

.Button {
    transition: background-color .2s ease-in, box-shadow .1s ease-out;
    height: 50px;
    width: 200px;
    margin: 10px;
    font-size:12.0pt;
    font-weight:bold;
    background: none;
    border: none;
    cursor: pointer;
    text-align: center;
    vertical-align:center;
    line-height: 50px;
    color: #000000;
    background-color: #D8D8D8;
}


Her specificerer man transition og variabler dertil, i linje 1, og resten er blot styling af en DIV som vi kender det med størrelse udseende. Transition er det der sker når musen holdes over, så vi skal have specificeret background-color og box-shadow ved :hover. Den kode ser således ud:

.Button:hover {
    background-color: #BDBDBD
    box-shadow: inset 1px 1px 3px 2px #6E6E6E;
}


På skærmen kommer det færdige resultat til at se således ud:

Hold musen over



Rotation af tekst

Ved at kombinere transform:rotateY() og transition kan man få emnet til at dreje om sin egen akse, i dette tilfælde y-aksen. Effekten består af tre dele. Det første vi skal bruge er selve knappen på siden. Her bruger vi blot en almindelig DIV, som skal styles. Her ser koden der skal på siden således ud:

<DIV CLASS="Button">Hold musen over</DIV>


Stylingen, som er klassen Button, ser således ud:

.Button {
    transform: rotateY(0deg);
    -moz-transform: rotateY(0deg);
    -webkit-transform: rotateY(0deg);
    -o-transform: rotateY(0deg);
    transition: transform 0.8s ease-in-out;
    -moz-transition: transform 0.8s ease-in-out;
    -webkit-transition: transform 0.8s ease-in-out;
    -o-transition: transform 0.8s ease-in-out;
    width:150px;
    margin: 10px;
    text-align:center;
    font-size:12.0pt;
    font-weight:bold;
    cursor: pointer;
    color: #000000;
}


Her specificerer man først transform, dvs. defaulværdien for rotationsvinklen, og derefter transition, dvs. hvor hurtigt rotationen i begge retninger skal være. Bemærk, at man tidligere ikke behøvede præfix til transform og transition, så hvis rotationen har fungeret, men er holdt op med at fungere, kan dette være årsagen. Resten er blot styling af en DIV som vi kender det med størrelse udseende. Transition er det der sker når musen holdes over, så vi skal have specificeret rotationen ved :hover. Den kode ser således ud:

.Button:hover {
    transform: rotateY(360deg);
    -moz-transform: rotateY(360deg);
    -webkit-transform: rotateY(360deg);
    -o-transform: rotateY(360deg);
}


Her er rotationen sat til en hel omgang, det kan man selvsagt rette til efter ønske. Ved at have en defaultværdi for rotationen, vil emnet rotere tilbage til udgangspositionen, dvs. ved mouse over drejer teksten en omgang, og når man fjerner pointeren, drejer teksten tilbage på plads. På skærmen kommer det færdige resultat til at se således ud:

Hold musen over


Hvis man vil, kan man i sin transform også rotere om x-aksen med rotateX, så ser det således ud:

Hold musen over


Ligeledes kan man rotere om z-aksen med rotateZ, så ser det således ud:

Hold musen over



Ekspanderende understregning

En af de mere elegante måder at understrege på, er ved at lave en understregning der ruller ud i fuld størrelse. Løsningen består af fem dele. Det første man skal bruge er knappen. Hvor de foregående eksempler blot krævede en DIV, så kræver denne løsning, at man både har selve knappen og en separat DIV til effekten. Klassen for knappen kalder vi Button og den DIV vi skal brige til effekten kalder vi ButtonFace. Den del ser således ud:

<DIV CLASS="Button">
    <DIV CLASS="ButtonFace">Hold musen over</DIV>
</DIV>


Stylingen, som er klassen Button, ser således ud:

.Button {
    width:150px;
    margin: 10px;
    text-align:left;
    font-size:12.0pt;
    font-weight:bold;
    cursor: pointer;
    color: #000000;
}


Stylingen, som er klassen ButtonFace, ser således ud:

.ButtonFace {
    position: relative;
    display:inline-block;
}


Det næste der er brug for, er hvad der sker når musen er over. Lige til dette eksempel sker der ikke noget, men det er her man har farveskift osv. med mouse over. Derfor kommer det til at se således ud:

.ButtonFace:hover {
}


Det næste der kommer, er det der får det hele til at fungere. På samme måde som man har selektoren :hover, har man selektoren :before, som gør at man kan indsætte noget før en tag, klasse eller ID. Det er her man definerer linjen og skjuler den. Den kode ser således ud:

.ButtonFace:before {
    content: "";
    position: absolute;
    width: 100%;
    height: 2px;
    bottom: 0px;
    left: 0px;
    background-color: #000000;
    visibility: hidden;
    -webkit-transition: all 0.3s ease-in-out 0s;
    -moz-transition: all 0.3s ease-in-out 0s;
    -o-transition: all 0.3s ease-in-out 0s;
    transition: all 0.3s ease-in-out 0s;

    -webkit-transform: scaleX(0);
    -moz-transform: scaleX(0);
    -o-transform: scaleX(0);
    transform: scaleX(0);
}


Vil man have andre farver, størrelser eller placeringer på understregningen eller hastigheden hvormed linjen ruller ud, er det her der skal justeres.

Derudover skal vi bruge en kombination af hover og before, så linjen bliver synliggjort ved mouse over:

.ButtonFace:hover:before {
    visibility: visible;
    -webkit-transform: scaleX(1);
    -moz-transform: scaleX(1);
    -o-transform: scaleX(1);
    transform: scaleX(1);
}


Koden er nu klar. På skærmen kommer det færdige resultat til at se således ud:

Hold musen over


At linjen starter fra midten og bevæger sig ud til begge sider er default. Vil man have linjen til at starte f.eks. i venstre side, skal man til .ButtonFace:before tilføje linjen transform-origin: bottom left. Så ser det således ud:

Hold musen over