/
HOT TIP: voit selata sivustoa vapaasti musiikin soidessa

Loading...
Tämä sivusto

Arvioitu lukuaika: 3min 18s
Luotu: 13.12.2022, 18:58 - Päivitetty: 16.11.2023, 14:44
13.12.2022, 18:22

Ihan ensimmäiseksi pitää sanoa että laita random musiikki soimaan viereisestä play napista. Siitä lähtee soimaan jokin setti musiikki kategorian postauksista.

Miksi

Olen jo pidemmän aikaa ajatellut että tarvitsen sivuston mihin kerään kaikkea mitä sitä on tullut vuosien varrella tehtyä. Asioita meinaa unohtua niin jonkunlainen tietokanta on hyvä olla. Aloitin näiden sivujen tekemisen jo vuosi sitten kun halusin kokeilla taustalla näkyvän taustakuvan tekemistä, mutta sitten näiden sivujen tekeminen jäi kun piti tehdä intensiivisesti muita projekteja.

Tastakuva

Taustakuva on rakennut div elementeistä ja jos tuolta alhaalta klikkaa jotain laatikkoa niin siitä lähtee satunnaiseen suuntaan piste noita viivoja pitkin. Tuo piste on vain div jolla on CSS gradienttivarjo jotta se näyttää hienolta. Webkit selaimella se vaan meinaa kaataa koko selaimen ja Firefoxilla se toimii mainiosti, ainakin minulla.

Tekniikoita

Taustakuvaa rakentaessa testailin että miten käytetään stimulus kontrollereita sekä turboa jotta sivustosta saa tehtyä yhden sivun applikaation. Taustalla tässä toimii symfony ja sisällön hallinnan rakentamiseen käytän sonataa. Tietokanta on mariadb. Näitä pyörittelen docker konteissa.

Koodia

Tässä vielä tuon ylemmän kulman taustakuvan sensuroimaton koodi. Huomautan vielä kerran että tein tämän vuonna 2021. Tietenkin tämän lisäksi olen käyttänyt paljon SCSS. Haluaakohan joku nähdä sen? laita mailia :)

import { Controller } from "@hotwired/stimulus";

export default class extends Controller {
  static targets = ["plane", "cells"];
  initialize() {
    this.BuildGrid();
    this.addAndRemoveSquare();
  }
  BuildGrid() {
    this.makeRows(25, this.planeTarget);
    this.makeColumns(25);
  }
  //Takes (rows, columns) input and makes a grid
  makeRows(rowNum, el) {
    //Creates rows
    for (var r = 0; r < rowNum; r++) {
      let row = document.createElement("div");
      el.appendChild(row).className = "BgridRow";
    }
  }
  //Creates columns
  makeColumns(cellNum) {
    let rows = document.getElementsByClassName("BgridRow");
    let count = 0;
    for (var j = 0; j < cellNum; j++) {
      for (var i = 0; i < rows.length; i++) {
        let newCell = document.createElement("div");
        newCell.setAttribute("data-bgrid-target", "cells");
        newCell.setAttribute("data-bgrid-id-param", count);
        newCell.setAttribute("data-action", "click->bgrid#cellClick");
        rows[j].appendChild(newCell).className = "cell";
        count++;
      }
    }
  }
  connect() {
    //console.log(this.cellsTargets)
  }
  createDivDot(id) {
    let cell = this.cellsTargets[id];
    let direction = Math.floor(Math.random() * 4);
    let allowRight = true;
    let allowLeft = true;
    let allowUp = true;
    let allowDown = true;
    let rowId = id % 100;
    if (rowId >= 50) {
      // scale row numbers
      rowId = rowId - 50;
    }
    if (rowId < 25) {
      // only allow right direction
      allowLeft = false;
      allowUp = false;
      allowDown = false;
    }
    //console.log(allowRight, allowLeft, allowUp, allowDown )
    if (direction === 0 && allowRight) {
      this.moveDot(cell, "Right");
    } else if (direction === 1 && allowUp) {
      this.moveDot(cell, "Up");
    } else if (direction === 2 && allowDown) {
      this.moveDot(cell, "Down");
    } else if (direction === 3 && allowLeft) {
      this.moveDot(cell, "Left");
    }
  }
  moveDot(cell, dir) {
    let mclass = "move" + dir;
    let dot = document.createElement("div");
    dot.className = "dot";
    cell.appendChild(dot);
    void dot.offsetHeight;
    dot.classList.add(mclass);
    setTimeout(() => {
      cell.removeChild(dot);
    }, 3100);
  }
  createSVGDot(id) {
    const svgns = "http://www.w3.org/2000/svg";
    let svg = document.createElementNS(svgns, "svg");
    svg.setAttribute("fill", "none");
    svg.setAttribute("viewBox", "0 0 10 10");
    svg.setAttribute("stroke", "none");
    let rect = document.createElementNS(svgns, "rect");
    rect.setAttribute("x", 0);
    rect.setAttribute("y", 0);
    rect.setAttribute("width", "10px");
    rect.setAttribute("height", "5px");
    rect.setAttribute("fill", "#ff00ff");
    svg.appendChild(rect);
    id.appendChild(svg);
  }
  addAndRemoveSquare() {
    if (!document.hidden) {
      let activate_cell_number = Math.floor(
        Math.random() * this.cellsTargets.length
      );
      let deactivate_cell_number = Math.floor(
        Math.random() * this.cellsTargets.length
      );
      this.cellsTargets[activate_cell_number].className = "cell active";
      this.cellsTargets[deactivate_cell_number].className = "cell";
      //this.createDivDot(deactivate_cell_number);
      var timer = setTimeout(() => {
        this.addAndRemoveSquare();
        //console.log('addSquare')
      }, 4000);
    } else {
      console.log("stop animations");
      clearInterval(timer);
    }
  }

  cellClick({ params: { id } }) {
    //this.createSVGDot(this.cellsTargets[id+3]);
    this.createDivDot(id);
    // console.log(id);
  }
}

Turbo MariaDB Stimulus Symfony Sonata Docker