Roter og mask miniatyrbilder med CSS3

Har du noen gang sett et nettsted som viser noen miniatyrbilder som er litt roterte? Det er en enkel effekt som legger til et lag av visuell personlighet. Å si at hvis du ikke oppnår rotasjonseffekten med CSS, jobber du for hardt! Lær hvordan du gjør det riktig!

Publisert opplæring

Noen få uker besøker vi noen av leserens favorittinnlegg fra hele historien til nettstedet. Denne opplæringen ble først publisert i august 2011.


Introduksjon

Bildegallerier med roterte miniatyrer er noe sjeldne, men det er et enkelt triks å legge til stil på nettsiden din. Men hvis ikke gjort riktig, kan oppnå og opprettholde denne effekten noen ganger vise seg å være et stort problem!

For å oppnå denne effekten kan dine første tanker slå på å skape roterte miniatyrer i Photoshop. Dette kan imidlertid vise seg å være vanskelig på lang sikt. Ulemper for å skape roterte miniatyrer på denne måten inkluderer:

  • Angle Consistency: Hvis bildene ikke er rotert i samme vinkel, går den visuelle konsistensen av siden tapt. Dette betyr at du vedlikeholder en PSD for hver enkelt miniatyrbilde som er riktig rotert i en konsistent vinkel. Du kan for eksempel åpne din PSD og innse at du har glemt rotasjonsvinkelen på miniatyrbildene dine.
  • CMS Miniatyr Generasjon:Hvis du kjører et CMS (for eksempel Wordpress), blir miniatyrbildene dine sannsynligvis generert automatisk. Ved å bruke PSD-metoden beskrevet ovenfor må du manuelt opprette og laste opp hver enkelt miniatyrbilde i ditt CMS. Også, hvis du allerede har et eksisterende nettsted, men vil bruke rotasjonseffekten til miniatyrbildene dine, må du gjenskape alle miniatyrbildene i Photoshop og deretter laste dem opp på nytt.!
  • Langsiktig styrbarhet: Si at du har opprettet alle miniatyrbildene dine litt roterte, men nå vil du tilpasse eller omforme galleriet ditt. Dette betyr at du må regenerere alle miniatyrbildene dine. Hvis du har administrert miniatyrbildene dine i Photoshop, betyr dette at du må justere og lagre hver enkelt miniatyrbilde på nytt. ugh.

Ville det ikke vært fint om du kunne utføre denne lille rotasjonen med en linje med kode? Vel du kan! La oss lære hvordan.


Trinn 1: Forstå vårt mål

En kort oversikt over hva vi prøver å oppnå, avslører følgende trinn:

  1. Opprett et miniatyrbilde i Photoshop (ikke rotert)
  2. Sett inn miniatyrbildet med img stikkord
  3. Mask det riktig med CSS (tenk Photoshop masker)
  4. Roter miniatyrbildet i masken med CSS3

For å sikre at vårt galleri brytes grasiøst, vil trinn 1-3 oppnås ved hjelp av CSS. Trinn 4 (rotasjonseffekten) vil bli oppnådd ved bruk av CSS3.


Trinn 2: Forstå miniatyrstørrelsen og rotasjonsvinkelen øker

Før du lager våre miniatyrbilder, må vi avgjøre hvor stor hver miniatyrbilde vil vises på skjermen.

Hvis miniatyrbildene våre er for små og vi roterer dem for mye i en vinkel, vil noen av hjørnene gi oss et tomrom. Som dette:

Derfor, for å fylle maskeområdet riktig, kan vi konkludere med at jo mer vår miniatyrbilde blir rotert, desto større må det være. I matematiske termer, når rotasjonsvinkelen på miniatyrbildet øker, må også miniatyrens størrelse (og omvendt).


Husk denne nøkkelen: Bildeminnebildet vil alltid være større enn bildemasken (miniatyrstørrelse> maskestørrelse)

En advarsel til de som er erstattet av matematikk

Trinn 3-6 beskriver hvordan man beregner matematisk forholdsmessig dimensjonering for bildemasken og miniatyrbildet. Forstå det er ikke nødvendig å kunne rotere bilder med CSS forvandle eiendom. Snarere er dens formål å hjelpe deg å forstå hvordan du skal bestemme størrelsen på elementene dine for å tillate full 360 ° rotasjon. Dette sikrer at du ikke vil bli igjen med stygge tomme hjørner.


Trinn 3: Proportionelt lik

For å unngå å vise tomt rom i masken må vi bestemme EN av de følgende:

  • Størrelsen på den faktiske miniatyrbilden
  • Størrelsen på bildemasken (synlig del av miniatyrbildet)

Fordi miniatyrbildet og bildemasken er forholdsmessig like i størrelse, hvis vi setter størrelsen på en, kan vi beregne størrelsen på den andre.


Trinn 4: Bestemme dimensjoner

I dette eksemplet skal vi først sette inn størrelsen på bildemasken. Ved å angi størrelsen på vår bildemaske kan vi bruke litt matematikk til å beregne miniatyrstørrelsen:

  • Bestem størrelsen på bildemasken: 180x240 piksler
  • Finn lengden på diagonalsiden
    • Bruk Pythagorasetningen (a2 + b2 = c2 )
      • Vår første side (a) er 180px
      • Vår andre side (b) er 240px
      • Så, 1802 + 2402 = c2 (diagonal lengde)
      • 90.000 = c2
      • 300 = c (ta kvadratroten på hver side)
    • Vår diagonal lengde (c) er lik 300

Diagonallengden er et viktig nummer. For å tillate at vår miniatyrbilde er full 360 ° rotasjon, må den korteste siden være lik bildemaskens lengste side. (Selv om du kanskje ikke trenger det, vil tildeling for 360 graders rotasjon tillate fremtidige endringer i rotasjonsvinkelen uten å endre størrelsen på miniatyrbildene dine).


Trinn 5: Beregning av miniatyrmålinger

Som du kan se, må miniatyrets korteste side være lik maskens lengste side. Hvis det ikke er det, blir vi igjen med tomt rom. Husk at miniatyrbildets størrelse er forholdsmessig større enn størrelsen på bildemasken.

Beregning av miniatyrets størrelse slik at den passer riktig, er lett når vi kjenner dimensjonene til bildemasken. Vi tar bare maskens største side (diagonalen) og la den være den minste siden av miniatyrbildet.

  • Masks største side (300) er lik miniatyrets korteste side (x)
  • Bruk forholdsmessige forhold for å finne miniatyrlengden
    • 180: 300 (maskehøyde: miniatyrens høyde)
    • 240: y (maske lengde: miniatyrlengde)
  • Kryss multipliser for å løse
    • 180y = 72.000
  • y = 400 (miniatyrlengde)

Vi har nå bestemt oss for maske- og miniatyrstørrelser. Vi vet om bildemasken vår er 180x240px, enn bildet miniatyrbildet inne i masken må være 300x400px for å tillate 360 ​​° rotasjon.

En glad merknad: Fordi bildemasken og miniatyrstørrelsen er forholdsmessig like, vil denne matte også fungere hvis vi først angir miniatyrstørrelsen vår! Vi ville bruke samme pythagorasetning og proporsjonale relasjoner for å bestemme de riktige størrelsene.


Trinn 6: Til slutt Noen HTML

Nå som vi kjenner alle våre størrelser, la oss bygge våre roterte miniatyrbilder ved å starte med noen grunnleggende HTML.

    Roterte miniatyrer med CSS3    

Roterte miniatyrer med CSS3

Bare tallverdier

Denne grunnleggende HTML-oppsettet legger inn følgende:

  • - Dette vil tillate brukeren å endre rotasjonsvinkelen. Også, vi satt vår verdi attributt til lik samme beløp som vi først vil sette inn i vårt CSS (15 i dette tilfellet).
  • - Denne feilmeldingen vil bli skjult for visning. Ved å bruke jQuery, vil vi vise det om brukeren kommer inn i noe annet enn et nummer i innboksboksen.
  • - Dette er våre miniatyrer som kan knyttes til hva du vil.
  • klar: begge - Rydder våre flytede miniatyrbilder
  • class = "maske" - Klassen for vår bildemaske

Trinn 7: CSS Basic Page Styling

La oss bruke noen grunnleggende styling til vår side for å gi den struktur og enkelhet.

 kropp margin: 0; padding: 0; bakgrunn: #eee; font-familie: Genève, Lucida Sans, Lucida Grande, Lucida Sans Unicode, Verdana, sans-serif;  #wrapper width: 840px; margin: 0 auto; bakgrunn: #fff; grense: 1px solid #ccc; padding: 25px; border-top: none;  #error_message farge: rød; display: none; font-size: .8em; 

Legg merke til at vi skjulte vår feilmelding som standard som vi vil bytte det er synlighet senere i jQuery.

Legg til noen CSS3-effekter

La oss legge til noen flere detaljer for å forbedre vår grunnleggende styling

 #wrapper border-radius: 0 0 5px 5px; -moz-grense-radius: 0 0 5px 5px; -webkit-grense-radius: 0 0 5px 5px; bokseskygge: 0 0 5px #ccc; -moz-box-shadow: 0 0 5px #ccc; -webkit-boks-skygge: 0 0 5px #ccc; 

Nå har vi innholdet vårt sentrert med god avstand og noen CSS3-effekter for forbedret sidestyling.


Trinn 8: CSS Styling Image Mask

La oss bruke bildemasken til våre miniatyrbilder. I vår HTML pakket vi hver miniatyrbilde i en ankermerke og ga den en klasse av maske som vi vil bruke i vårt CSS.

 .maske posisjon: relativ; høyde: 180 piksler; bredde: 240 piksler; float: venstre; flow: hidden; margin: 15px; grense: 5px solid # f6f6f6; bokseskygge: 0 0 1px # 000; -moz-boks-skygge: 0 0 1px # 000; -webkit-boks-skygge: 0 0 1px # 000; 

Her er en beskrivelse av CSS-egenskapene vi brukte (og hvorfor vi brukte dem):

  • stilling: relativ - Våre img Merkene vil bli plassert helt inne i vår bildemaske
  • høyde, bredde - Tidligere har vi bestemt oss for bildemaskens dimensjoner. Det er her vi plasserer disse størrelsene.
  • float: left - Flyter bildene våre slik at de vises i et galleriform.
  • flow: hidden - Som beregnet tidligere vil våre miniatyrer være 300x400px. Vi vil imidlertid bare vise en del (180x240px) av dem. Denne egenskapen fungerer som maske, gjemmer den delen av miniatyrbildene som strekker seg utenfor dimensjonene 180x240.
  • margin - Plasser ut våre bilder
  • grense, box-shadow - Dette gir oss en dobbel ramme (i støttende nettlesere). De grense Egenskapen gir oss en tykk, gråhvit kant rundt bildet mens box-shadow gir oss en tynn, svart ramme rundt vår tykke, gråhvit grense.

Trinn 9: CSS-størrelsesorden Miniatyrer

Sett våre miniatyrstørrelser i henhold til dimensjonene vi har beregnet i trinn 5.

 .maske img høyde: 300px; bredde: 400 piksler; 

Trinn 10: CSS-sentering Miniatyrer

For øyeblikket er våre miniatyrer plassert relativt (fra øverste venstre hjørne).

Vi vil at vår miniatyrbilde skal være sentrert horisontalt og vertikalt i masken.

For å oppnå dette bruker vi følgende CSS-regler:

 .maske img posisjon: absolutt; margin-top: -150px; / * halv høyde * / margin-venstre: -200px; / * halv bredde * / topp: 50%; venstre: 50%; 

Her er en beskrivelse av hva vi gjorde:

  • position: absolute - Dette plasserer miniatyrbildet helt innenfor bildemasken
  • margin - Vi angir negative marginer som er nøyaktig halvparten av bildet i høyden og bredden (300x400), og deretter angir vi posisjoneringsegenskapene topp og venstre som trekker elementene tilbake i perfekt senter.

Trinn 11: CSS Thumbnail Rotation

Vi bruker CSS3 eiendommen forvandle å rotere elementene våre. Så vil vår CSS inkludere alle nettleserprefiksene

 .maske img -webkit-transform: roter (15deg); -moz-transform: rotere (15deg); -o-transform: roter (15deg); -MS-transform: rotere (15deg); transform: rotere (15deg); 

CSS her er ganske enkelt. Vi plasserer bare vinkelen vår i parentes etterfulgt av "deg".

I dette eksemplet brukte vi 15 som rotasjonsverdien, men du kunne sette en annen verdi der. Fordi vi har beregnet størrelsen på masken og miniatyrbildet på riktig måte, har vi plass til full 360 ° rotasjon! Et positivt heltall roterer bildet til høyre, et negativt heltall roterer bildet til venstre.


Trinn 12: CSS Image Hover Effect

Som en ekstra effekt, skal vi legge til en enkel linje med CSS som endrer grensefarge når brukeren svinger over og bilde.

 .maske: hover border-color: #ddd;

Trinn 13: jQuery Endrer rotasjonsverdien dynamisk

Som en liten bonus, skal vi tillate brukeren å skrive inn en verdi i vår innboks boks som endrer CSS rotasjonsvinkelen. Så først, la oss legge til jQuery på slutten av siden vår like før avslutningen kropp ta med en lenke til vårt tilpassede skript:

  

Trinn 14: jQuery Dokument Klar

La oss nå sette opp jQuery for når dokumentet er klart:

 jQuery (dokument) .ready (funksjon ($) // kode her);

Trinn 15: jQuery Initial Funksjon

Vi lager en funksjon når som helst vår "oppdatering" -knapp blir klikket.

 $ ('button'). klikk (funksjon () // kode her);

Trinn 16: jQuery Lagrer gjeldende rotasjonsverdi

Vi ønsker å lagre CSS-tallverdien for den nåværende rotasjonsvinkelen i en variabel.

 var rotation_angle_value = $ ('# rotation_amount') .val ();

Denne koden finner rotation_amount id (som vi tilordnet til inngang) og får sin nåværende verdi. Hvis du husker, setter vi inn førstegangen verdi Tilordne til lik 15 (det samme som i vår CSS kode for rotasjonsvinkelen).


Trinn 17: jQuery Bruke isNaN () Funksjon

Vi ønsker å gjøre brukerens inntaksverdi vår nye rotasjonsvinkel. Vi vil imidlertid sørge for at brukeren ikke tilfeldigvis oppgir en ikke-numerisk verdi. Det er der isNaN () javascript-funksjonen kommer inn. isNaN () står for "er ikke et tall". Denne funksjonen gjør akkurat hva navnene innebærer: det kontrollerer for å se om verdien du overfører til den "er ikke et nummer".

Så, vi vil bruke isNaN () fungere og send det til vår rotasjonsvinkelverdi (som oppgitt av brukeren). Hvis det ikke er et nummer, vil vi vise vår feilmelding.

 // sjekk for å se om brukerens inngangsverdi er et tall eller ikke hvis (isNaN (rotation_angle_value)) // ikke et nummer $ ('# error_message'). show (); // resten av koden her

Trinn 18: jQuery Oppdaterer ny rotasjonsvinkel

Hvis brukerens nylig innmeldte verdi ikke er et nummer, har vi vist en feilmelding. Nå skal vi bruke en ellers uttalelse for når de ha angitt en numerisk verdi. Først skjuler vi feilmeldingen.

 ellers $ ('# error_message'). skjul (); 

Fordi rotasjonsvinkelen er lagret flere ganger i vårt CSS (på grunn av de forskjellige nettleserversifikasjonene), må vi oppdatere alle disse verdiene med jQuery. Så, hva vi skal gjøre er å lagre syntaksen til CSS-verdien i en variabel (med den nye vinkeldelen). I hovedsak skriver vi Roterings (15deg) og erstatte verdien av '15' med verdien brukerinngangen.

 var rotation_angle = 'roter (' + rotation_angle_value + 'deg)';

Da oppretter vi et CSS-objekt med relasjonsverdier. Vi definerer hver av våre CSS egenskaper (nettleser prefiks for transformasjon), og sett inn verdien som variabelen vi nettopp har definert.

 var updated_css = '-webkit-transform': rotation_angle, '-moz-transform': rotation_angle, '-o-transform': rotation_angle, '-ms-transform': rotation_angle, 'transform': rotation_angle,

Nå sender vi bare den variabelen som lagrer våre CSS-egenskaper og verdier til jQuery for å oppdatere CSS!

 $ ('. mask img'). css (updated_css);

Trinn 19: jQuery Endelig jQuery-kode

Slik ser alle våre jQuery ut:

 jQuery (dokument) .ready (funksjon ($) $ ('knapp'). klikk (funksjon () // få rotasjonsvinkelverdien var rotation_angle_value = $ ('# rotation_amount') .val (); hvis (isNaN (rotation_angle_value)) // er ikke et tall $ ('# error_message'). show (); else // er et tall $ ('# error_message'). skjul (); // lagre CSS-verdi syntaks med Den nye rotasjonsvinkelverdien var rotation_angle = 'rotate (' + rotation_angle_value + 'deg)'; // lagre CSS egenskaper og verdier var updated_css = '-webkit-transform': rotation_angle, '-moz-transform': rotation_angle, ' -O-transform ': rotation_angle,' -ms-transform ': rotation_angle,' transform ': rotation_angle, // oppdater CSS $ ('. mask img '). css (updated_css);););

Konklusjon

Jeg håper du har lært noe, fremfor alt som forplikter deg til ikke-fleksible design i Photoshop, er det ofte unødvendig å bruke CSS3-teknikker direkte i nettleseren. Takk for at du følger med!