Prøver og oppgaver

Her finner du en del øvingsoppgaver.

Sjakkbrett

Lag en ny nettside med innhold som vist under

<div id="brett">
  <div></div>
  ...
  ( 64 stykker)
  ...
</div>

I VSCode kan du lage 64 diver ved å skrive div*64 og trykke enter (emmet abr.).

Lag en css som vist under:

#brett {
    width: calc( 50px * 8);
    display: grid;
    grid-template-columns: repeat(8, 1fr);
    border: solid black 1px;
}

#brett div {
    width: 50px;
    height: 50px;
}

#brett div:nth-child(odd) {
    background: gray;
}

Nå har du starten på et sjakkbrett. Kan du lage css-regler slik at du får et fullstendig brett ?
( en løsning krever 2 regler for hver av de 7 neste radene, bruker nth-child(2n+A) hvor A er et tall slik at det gjelder for første rute i den raden regelen lages for. Metoden virker fordi siste css regel overstyrer de som kommer før).

Alternativt kan du legge inn class="gray" på alle ruter som skal være grå.

Slideshow

Bruk metoden med steps(xx) til å vise en bildeserie.

Legg bildene inne i en struktur som vist under:

<div id="box">
  <div id="frame">
    <div><img src="b1.jpg"></div>
    ..
    ..
  </div>
</div>

Lag en css som bruker steps til å flytte frame inne i box.
Skriv regler slik at #frame har posistion:absolute, #box har relative.
#frame bruker grid ( slik at alle bildene kommer på linje ).
#box bruker overflow:hidden (slik at vi bare ser ett av bildene fra frame)

Du kan velge bilder av forskjellig størrelse, bruk da calc( 200px * 8 ) som bredde på #frame
(her er 200px bredde på største bilde, 8 bilder i serien)

Analog Klokke

Lag ny nettside (ny mappe) og lag filene klokke.html klokke.css og klokke.js.
Innholdet i klokke.html lager du som vanlig med ! (VSCode + emmet).
Gi dokumentet tittel Klokke, lag link til css (skriv link og velg link:css) og link til js (skriv script og velg script:src).

Legg inn dette innholdet i klokke.html

 <div id="klokke">
      <div id="center"></div>
      <div id="minutter"></div>
      <div id="timer"></div>
      <div id="sekunder"></div>
  </div>
  <script>
    setup();  // js for å lage time-merker
  </script>

(Noen av dere har kanskje sett en løsning som bruker canvas - men den sparer vi til it2)

Lag følgende css regler

#klokke {
    position: relative;
    width: 200px;
    height: 200px;
    border-radius: 50%;
    border: solid black 3px;
}

#center {
    position: absolute;
    left: 100px;
    top: 100px;
    border-radius: 50%;
    width: 2px;
    height: 2px;
    background-color: red;

}

#sekunder {
    position: absolute;
    left: 100px;
    top: calc((200px - 5px) / 2);
    width: 98px;
    height: 5px;
    background-color: gray;
    animation: turn 60s steps(60) infinite;
    transform-origin: 1px 3px;  /* rotasjonspunktet */
    transform: rotate(0deg); 
}

@keyframes turn {
    100% { transform: rotate(360deg)}
}

Nå har du en klokke med en sekundviser - legg til regler slik at du får minutter og timer.

Her har jeg lagt til markører på timene:

Jeg brukte følgende js code for å tegne de blå firkantene:

function setup() {
  let divKlokke = document.getElementById("klokke");
  let tall = Array(12).fill(1);
  let rot = 0;
  for (let t of tall) {
    let div = document.createElement("div");
    div.className = "tall";
    div.style.transform = `rotate(${rot}deg)`;
    rot += 30;
    divKlokke.appendChild(div);
  }
}

Det du trenger i tillegg til koden (lagres i klokke.js) er en css regel for .tall
Du kan bruke nesten samme regel som for sekunder, men div-en skal ikke ha bakgrunn - bare border-right.
Den skal heller ikke ha noen animasjon. Du må justere transform-origin dersom du har en annen height enn sekunder.

Bildegalleri

(Inspirert av sindre)

Vi skal lage et galleri som viser bilder - bruker kan bla ved å klikke på en rad med radioknapper nederst (vist som sirkler).

Alle effekter er styrt av css - ingen javascript. Det er også mulig å legge til knappper som blar til neste forrige med bare css, men den blir litt innvikla - så jeg dropper den biten.

Jeg bruker emmet for å lage html

.bilde#b$*5  // lager 5 stykk: <div class="bilde" id="b1"></div>
input:radio[name="r"]#r$*5  // lager 5 stykk <input type="radio" name="r" id="r1>
// jeg legger til at den første radio-knappen er valgt

<input type="radio" name="r" id="r1" checked>
<input type="radio" name="r" id="r2">
<input type="radio" name="r" id="r3">
<input type="radio" name="r" id="r4">
<input type="radio" name="r" id="r5">

<div class="bilde" id="b1"></div>
<div class="bilde" id="b2"></div>
<div class="bilde" id="b3"></div>
<div class="bilde" id="b4"></div>
<div class="bilde" id="b5"></div>

Neste trinn er å lage css-regler.
Planen er å legge alle bildene inn som background på de 5 div.bilde - ene. Position abs slik at de ligger på samme plass.
Alle er i utgangspunkt satt med opacity:0 slik at de ikke syns.

Jeg lager så regler for hver radio-knapp som gjelder når den er valgt:

#r1:checked ~ #b1 { opacity:1; }   // når knapp r1 er checked - regel gjelder #b1
... // en slik for hver knapp #r2..#r5

Dermed blir bildet i b1 synlig dersom knapp r1 blir valgt.

Plassering av radioknappene styres med denne regelen:

#galleri input {
    position: relative;
    z-index: 9;
    margin-top: 80vh;
}

#r1 {
    margin-left: calc((90vw - 100px) / 2);
}

Den siste regelen (margin-left) plasserer radioknappene omtrent midt på, margin-top gjør at knappene ligger nederst på skjermen. z-index:9 og position:relative sørger for at knappene ligger over bildene (uten disse to ligger de under).

Reglene under setter størrelse på bildene og legger inn en liten transition for skifte av bilde.

#galleri {
    position: relative;
    width: 90vw;
    height: 90vh;
    border: solid green 1px;
}

.bilde {
    position: absolute;
    width: calc(90vw - 50px);
    height: calc(90vh - 50px);
    left: 25px;
    top: 25px;
    background-position: center;
    background-size: cover;
    opacity: 0;
    z-index: 1;
    transition: 1s;
}

results matching ""

    No results matching ""