Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2017-07-13, 11:16
  #13
Medlem
Povels avatar
Citat:
Ursprungligen postat av VirtualMonkey
Ah, jäklar. Missade att det skulle vara för alla element, inte bara bilder.

Detta då?
Kod:
const logDimensions = ({target}) => console.log({height: target.offsetHeight, width: target.offsetWidth})
document.querySelectorAll('*').forEach(element => element.onclick = logDimensions)

Loggar visserligen flera gånger nu, antar att eventet propageras

Ja, där får man ut lite dimensioner minsann

Ang. multiloggningen: ja den lägger ju till på body, och på alla bodys barn till exempel. Det vore förmodligen tillräckligt att skicka "body, body *" till querySelectorAll mtp att <html>, <link>, <meta>, <head> och liknande inte är särskilt aktuella att visa dimensioner för.
Men ännu hellre använda `document.body.addEventListener("click", logDimensions, false);` istället för att peppra med listeners överallt.

Dessutom behöver man använda något annat än offsetHeight/Width om man behöver ta hänsyn till vilken box-sizing som används.

/p
Citera
2017-07-13, 11:49
  #14
Medlem
Citat:
Ursprungligen postat av Povel
Ja, där får man ut lite dimensioner minsann

Ang. multiloggningen: ja den lägger ju till på body, och på alla bodys barn till exempel. Det vore förmodligen tillräckligt att skicka "body, body *" till querySelectorAll mtp att <html>, <link>, <meta>, <head> och liknande inte är särskilt aktuella att visa dimensioner för.
Men ännu hellre använda `document.body.addEventListener("click", logDimensions, false);` istället för att peppra med listeners överallt.

Dessutom behöver man använda något annat än offsetHeight/Width om man behöver ta hänsyn till vilken box-sizing som används.

/p
Much better
Kod:
document.body.addEventListener('click', ({target}) => console.log({height: target.offsetHeight, width: target.offsetWidth}), false)

Men tror att offsetWidth borde duga? Då får man väl ut det värdet för hur mycket plats elementet tar upp, oberoende av box-sizing
Citera
2017-07-13, 11:58
  #15
Medlem
Povels avatar
Citat:
Ursprungligen postat av VirtualMonkey
...

Men tror att offsetWidth borde duga? Då får man väl ut det värdet för hur mycket plats elementet tar upp, oberoende av box-sizing

Ja, det beror ju på ens behov för tillfället.

Finemang

/p
Citera
2017-07-13, 15:54
  #16
Medlem
Povels avatar
Citat:
Ursprungligen postat av VirtualMonkey
Much better
Kod:
document.body.addEventListener('click', ({target}) => console.log({height: target.offsetHeight, width: target.offsetWidth}), false)

Men tror att offsetWidth borde duga? Då får man väl ut det värdet för hur mycket plats elementet tar upp, oberoende av box-sizing

Citat:
Ursprungligen postat av Povel
Ja, det beror ju på ens behov för tillfället.

Finemang

/p

Så här hade jag nog gjort, med `getComputedStyle`:

Kod:
(() => {

  const 
gcs window.getComputedStyle;

  
document.documentElement.addEventListener("click"=> {
    
e.preventDefault();
    
e.stopPropagation();
    const 
elem e.target;
    
console.log(`${ JSON.stringify(getDimensions(elem)) }`, elem);
  });

  const 
getDimensions elem => {
    const { 
displaywidthheight } = gcs(elem);
    return 
"inline" != display ?
      { 
"width"parseFloat(width10), "height"parseFloat(height10) } :
      
getInlineDimensions(elemdisplay);
  };

  const 
getInlineDimensions = (elemoriginalDisplay) => {
    
elem.style.display "inline-block";
    const 
dimensions getDimensions(elem);
    
elem.style.display originalDisplay;
    return 
dimensions;
  };

})(); 

/p
Citera
2017-07-14, 15:55
  #17
Medlem
Decentralizeds avatar
Någon som kan ge mig en lite simplare utgift än de som har postats? Är en noob som också vill vara med och leka!
Citera
2017-07-14, 16:04
  #18
Medlem
Citat:
Ursprungligen postat av Decentralized
Någon som kan ge mig en lite simplare utgift än de som har postats? Är en noob som också vill vara med och leka!
Ett skript som byter bakgrundsfärg för varje post på Flashback på den sidan man tittar på.

Om du gör så att varje användare får en egen färg (t.ex. alla mina inlägg blir röda, alla dina blir blåa, o.s.v.) så är du extra cool
Citera
2017-07-17, 17:49
  #19
Medlem
NiwRams avatar
Citat:
Ursprungligen postat av VirtualMonkey
Ett skript som byter bakgrundsfärg för varje post på Flashback på den sidan man tittar på.

Om du gör så att varje användare får en egen färg (t.ex. alla mina inlägg blir röda, alla dina blir blåa, o.s.v.) så är du extra cool

Här kommer min lösning på denna!
Kod:
(() => {
    
let userColors = {};
    const 
randomColor = () => `#${Math.random().toString(16).slice(-6)}`;

    Array.
from(document.querySelectorAll('.post')).forEach(el => {
        const 
username el.querySelector('.post-user-username').innerText;
        const 
allChildren = Array.from(el.querySelectorAll('*'));

        if (!
userColors.hasOwnProperty(username)) {
            
userColors[username] = randomColor();
        }

        
allChildren.forEach(child => child.style.backgroundColor userColors[username]);
    });
})(); 

Tar gärna emot tips på eventuella förbättringar om ni har några.
Citera
2017-09-08, 14:49
  #20
Medlem
Decentralizeds avatar
Okej här har vi en ganska enkel utmaning, frågar mest för att jag vill veta hur man gör detta själv.

Utmaning: Gör en enkel hemsida som liknar en webbshop, där ni "säljer" produkter där priserna anges inklusive moms. Gör sedan en knapp där priserna anges exklusive moms istället, förslagsvis under en flik som kallas "För företag" eller något sånt. Jag är en noob men jag gissar att man kan använda sig av typ
Kod:
document.getElementByClass.innerHTML
. Är jag helt ute och cyklar eller stämmer detta?

Nu får vi se om ni klarar av det!
Citera
2017-09-08, 22:09
  #21
Medlem
Povels avatar
Citat:
Ursprungligen postat av Decentralized
Okej här har vi en ganska enkel utmaning, frågar mest för att jag vill veta hur man gör detta själv.

Utmaning: Gör en enkel hemsida som liknar en webbshop, där ni "säljer" produkter där priserna anges inklusive moms. Gör sedan en knapp där priserna anges exklusive moms istället, förslagsvis under en flik som kallas "För företag" eller något sånt. Jag är en noob men jag gissar att man kan använda sig av typ
Kod:
document.getElementByClass.innerHTML
. Är jag helt ute och cyklar eller stämmer detta?

Nu får vi se om ni klarar av det!

`document.getElementByClass.innerHTML`=> TypeError, getElementByClass finns inte

getElementByClassName finns dock, och är något man anropar. Resultatet av anropet är ett slags lista. På vart och ett av dessa skulle man kunna kolla på/manipulera innerHTML om man vill, men det verkar bökigt.

Så det är ingen bra väg framåt. I ett realistiskt fall använder man förmodligen någonting som t.ex. React där man sätter ett state (moms/ej moms) i sin komponent, vilket renderar om listan med rätt priser.

MEN, mm man bara vill göra det på enklast möjliga sätt skulle jag tro att en checkbox som togglar en klass på listcontainern skulle göra jobbet. Då kan man visa det ena eller andra av två priser (vart och ett inneslutna i ett element med en egen klass, så att de kan visas bara när de borde).

/p
Citera
2017-09-08, 22:36
  #22
Medlem
Povels avatar
Exempel på vad jag menade:

webshoppr.html:
HTML-kod:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>WebShoppr</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>

<div class="webshoppr">
  <h1 class="heading">WebShoppr</h1>
  <div class="settings">
    <label>Inkl. moms <input type="checkbox" class="settings__toggle-vat" checked="checked"></label>
  </div>
  <ul class="products"></ul>
</div>

<script src="webshoppr.js"></script>
</body>
</html>

style.css:
Kod:
htmlhtml * {
  
box-sizingborder-box;
  
background-color#f2f2f2;
}
.
webshoppr {
  
width30em;
  
margin5em auto;
  
box-shadow0 0 10px #ddd;
  
padding1em;
  
font-familyVerdanaArialSans-serif;
}
.
heading text-aligncenter; }
.
settings text-alignright; }
.
products {
  list-
style-typenone;
  
padding0;
  
displayflex;
  
flex-wrapwrap;
}
.
products__item {
  
padding.5em;
  
border1px solid #ccc;
  
border-radius3px;
  
flex-basis48%;
  
margin1%;
  
displayflex;
  
flex-directioncolumn;
}
.
products__name {
  
font-size1.2em;
  
color#239;
}
.
products__descr {
  
margin.5em .5em 1em;
}
.
products__price,
.
products__price--no-vat {
  
margin-topauto;
  
text-alignright;
}

/* Först HÄR kommer någon CSS som har med själva uppgiften att göra */
.products__price {
  
displaynone;
}
.
vat .products__price {
  
displayblock;
}
.
vat .products__price--no-vat {
  
displaynone;


webshoppr.js:
Kod:
(() => {
const 
VAT 12.5 100 // eller vad nu momsen är
  
doc documentproducts doc.querySelector(".products");

  
// dummy-data och hjälpare för att skapa en lista av produkter på sidan....
  
descriptions = [
    
"Lorem ipsum dolor sit amet, consectetur adipisicing elit.",
    
"Mollitia veniam aliquid ex, veritatis, earum id tempore ipsam nulla, vero excepturi soluta atque temporibus incidunt maxime!",
    
"Ut sequi dolores molestias, nemo?"
  
],
  
formatPrice amount => `${ amount.toFixed(2) } kr.`,
  
= (tagattrs = {}, text "") => {
    const 
elem doc.createElement(tag);
    
Object.keys(attrs).forEach(attr => {
      
elem.setAttribute(attrattrs[attr]);
    });
    
text && (elem.textContent text);
    return 
elem;
  },
  
Product = (nameprice) => ({
    
name,
    
price,
    
priceNoVatprice VAT price,
    
descrdescriptionsMath.floor(Math.random() * descriptions.length) ]
  });


// skapa list items och lägg till produktlistan
[
  
Product("Ätbara träskor"120),
  
Product("Badboll av pasta"69),
  
Product("Magnetisk risgrynsgröt"49),
  
Product("Genomskinlig tvål"25),
  
Product("Tvådimensionell mat"199),
  
Product("En flaska blomkål"99)
].forEach(
product => {
  const 
item E("li", { "class""products__item"});
  
item.appendChild(E("div", { "class""products__name"}, product.name));
  
item.appendChild(E("div", { "class""products__descr"}, product.descr));
  
item.appendChild(E("div", { "class""products__price"}, formatPrice(product.price)));
  
item.appendChild(E("div", { "class""products__price--no-vat"}, formatPrice(product.priceNoVat)));
  
products.appendChild(item);
});

// Först HÄR är det som addresserar det som uppgiften handlade om :/
// (lyssna på checkbox-klick och toggla en klass på wrappern webshoppr)
const webshoppr doc.querySelector(".webshoppr"),
  
checkbox webshoppr.querySelector(".settings__toggle-vat"),
  
applySettings = () => webshoppr.classList.toggle("vat"checkbox.checked);
checkbox.addEventListener("click"applySettingsfalse);

// kör settingsgrejen en gång direkt onload för att lyda
applySettings();

})(); 

Jag lägger upp på nån fiddle/codepen/etc också, sec.
EDIT: https://codepen.io/anon/pen/mMNdKz

/p
__________________
Senast redigerad av Povel 2017-09-08 kl. 22:38.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback