handleiding_nieuw:sub_spacematrix
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| handleiding_nieuw:sub_spacematrix [2025/05/07 09:04] – support | handleiding_nieuw:sub_spacematrix [2026/01/31 10:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| < | < | ||
| - | < | + | <html lang=" |
| - | .inputrow | + | < |
| - | display: flex; | + | <script src=" |
| - | align-items: | + | <script src=" |
| - | | + | <script src=" |
| - | | + | <meta charset=" |
| - | | + | < |
| - | .inputrow label { | + | |
| - | | + | |
| - | | + | /* ========== Tabs ========== */ |
| - | .inputrow input { | + | |
| - | | + | .tabs{ |
| - | } | + | display: |
| - | | + | |
| - | | + | margin: 12px 0 0 0; |
| - | font-size: 0.9em; | + | padding: 0; |
| - | min-width: 200px; | + | flex-wrap: |
| - | text-align: right; | + | } |
| - | } | + | |
| - | | + | .tab{ |
| - | | + | padding:8px 12px; |
| - | | + | background:# |
| - | font-size: 0.9em; | + | cursor: |
| - | } | + | border:1px solid #cfcfcf; |
| - | | + | border-bottom: |
| - | padding: | + | border-radius: |
| - | border: 1px solid #ccc; | + | color:# |
| - | text-align: right; | + | font-weight: |
| - | } | + | user-select: |
| - | table.rekenblok th { | + | } |
| - | background-color: | + | |
| - | } | + | .tab:hover{ background:# |
| - | .scheiding td { | + | |
| - | background-color: | + | .tab.active{ |
| - | border-top: | + | background:# |
| - | } | + | position: |
| - | .kaartcontainer | + | top:1px; |
| - | | + | font-weight: |
| - | top: 0; | + | } |
| - | right: 0; | + | |
| - | width: | + | .tabcontent{ |
| - | } | + | display: |
| - | .kaartcontainer img { | + | border:1px solid #cfcfcf; |
| - | width: | + | padding: |
| - | display: | + | border-radius: |
| - | } | + | background:# |
| - | .stipje | + | } |
| - | position: absolute; | + | |
| - | width: | + | .tabcontent.active{ display: |
| - | | + | |
| - | background: | + | @media (max-width: 900px){ |
| - | border-radius: | + | .tabs{ gap:6px; } |
| - | transform: | + | } |
| - | border: | + | |
| - | } | + | |
| + | body { font-family: | ||
| + | |||
| + | .inputrow { display: flex; align-items: | ||
| + | .inputrow label { width: | ||
| + | .inputrow input { width: 80px; } | ||
| + | |||
| + | table { border-collapse: | ||
| + | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | ||
| + | th { background: #f0f0f0; } | ||
| + | td:first-child, th: | ||
| + | |||
| + | .kaartcontainer { position: relative; max-width: 350px; margin-top: 20px; } | ||
| + | | ||
| + | .stipje { position: absolute; width: 14px; height: 14px; background: red; border-radius: | ||
| + | |||
| + | .perc-warning{ color: # | ||
| + | |||
| + | /* ========== Header + Scenario bar ========== */ | ||
| + | | ||
| + | display: | ||
| + | align-items:flex-end; | ||
| + | | ||
| + | | ||
| + | margin-bottom: | ||
| + | | ||
| + | |||
| + | .pageheader h1{ | ||
| + | | ||
| + | line-height: | ||
| + | } | ||
| + | |||
| + | |||
| + | .scenario-bar{ | ||
| + | | ||
| + | align-items:flex-start; | ||
| + | | ||
| + | | ||
| + | flex-wrap:wrap; | ||
| + | } | ||
| + | |||
| + | .scenario-left{ | ||
| + | display: | ||
| + | flex-direction: | ||
| + | gap:4px; | ||
| + | min-width: | ||
| + | flex:1; | ||
| + | } | ||
| + | |||
| + | .scenario-left select{ | ||
| + | | ||
| + | | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | | ||
| + | } | ||
| + | |||
| + | .scenario-right{ | ||
| + | display: | ||
| + | | ||
| + | gap:8px; | ||
| + | flex-wrap: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn{ | ||
| + | height: | ||
| + | padding:0 10px; | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | background:# | ||
| + | color:# | ||
| + | font-weight: | ||
| + | cursor: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn:hover{ | ||
| + | background:#e9f1f1; | ||
| + | border-color:#9fbcbc; | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary{ | ||
| + | background:#3aa39a; | ||
| + | border-color:#2e8f86; | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger{ | ||
| + | background:# | ||
| + | border-color:# | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # | ||
| + | |||
| + | |||
| + | /* ====== Spacematrix legenda (onder invoervelden, | ||
| + | |||
| + | .sm-legend{ | ||
| + | margin-top: 14px; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | border-radius: | ||
| + | background: #fff; | ||
| + | padding: 6px 8px; | ||
| + | max-width: 250px; | ||
| + | min-height: 118px; | ||
| + | margin-bottom: | ||
| + | } | ||
| + | |||
| + | .sm-legend-title{ | ||
| + | | ||
| + | | ||
| + | | ||
| + | color: #113333; | ||
| + | } | ||
| + | |||
| + | .sm-legend-grid{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 5px; | ||
| + | } | ||
| + | |||
| + | .sm-legend-item{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 6px; | ||
| + | align-items: | ||
| + | font-size: 0.80rem; | ||
| + | | ||
| + | color: #1f3e3e; | ||
| + | } | ||
| + | |||
| + | .sm-zone-badge{ | ||
| + | | ||
| + | height: 18px; | ||
| + | border-radius: | ||
| + | font-size: 0.68rem; | ||
| + | font-weight: | ||
| + | background: #e9f1f1; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | color: #113333; | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .sm-legend-short{ | ||
| + | | ||
| + | align-items: | ||
| + | gap: 4px; | ||
| + | } | ||
| + | |||
| + | /* Info-icoon (klein en rustig) */ | ||
| + | .sm-legend-i{ | ||
| + | | ||
| + | height: 16px; | ||
| + | border-radius: | ||
| + | display: | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | font-size: 0.72rem; | ||
| + | font-weight: | ||
| + | border: 1px solid #c9d6d6; | ||
| + | background: #f4f7f7; | ||
| + | color: #2b4a4a; | ||
| + | cursor: help; | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | /* ====== Tooltip mechaniek ======*/ | ||
| + | |||
| + | .sm-tip{ | ||
| + | | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | } | ||
| + | |||
| + | /* Tooltip bubble */ | ||
| + | .sm-tip:: | ||
| + | content: attr(data-tip); | ||
| + | | ||
| + | left: 0; | ||
| + | top: calc(100% + 8px); | ||
| + | | ||
| + | | ||
| + | background: | ||
| + | color: #fff; | ||
| + | padding: 8px 10px; | ||
| + | border-radius: | ||
| + | font-size: 0.8rem; | ||
| + | line-height: | ||
| + | box-shadow: 0 8px 18px rgba(0, | ||
| + | opacity: 0; | ||
| + | transform: | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: | ||
| + | white-space: | ||
| + | } | ||
| + | |||
| + | /* Tooltip pijltje */ | ||
| + | .sm-tip:: | ||
| + | content: ""; | ||
| + | position: absolute; | ||
| + | left: 10px; | ||
| + | top: calc(100% + 2px); | ||
| + | border: | ||
| + | border-bottom-color: | ||
| + | opacity: 0; | ||
| + | transform: translateY(-4px); | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: 51; | ||
| + | } | ||
| + | |||
| + | /* Toon tooltip bij hover/focus */ | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | opacity: 1; | ||
| + | transform: translateY(0); | ||
| + | } | ||
| + | |||
| + | /* Toegankelijk: | ||
| + | .sm-legend-i: | ||
| + | outline: none; | ||
| + | box-shadow: 0 0 0 3px rgba(0, 116, 217, 0.18); | ||
| + | border-color: | ||
| + | } | ||
| + | |||
| + | /* Mobiel: iets breder tooltip */ | ||
| + | @media (max-width: 600px){ | ||
| + | .sm-tip:: | ||
| + | } | ||
| </ | </ | ||
| + | | ||
| + | | ||
| + | <script src=" | ||
| + | </ | ||
| + | < | ||
| - | <div style=" | ||
| - | <div class=" | ||
| - | <img src=" | ||
| - | <div class=" | ||
| - | </ | ||
| - | </ | ||
| - | <h2>Spacematrix Rekenblok</h2> | + | <div class=" |
| + | < | ||
| - | <div class=" | + | <div class=" |
| - | <label for="opp">Oppervlak projectgebied | + | <div class="scenario-left"> |
| - | <input id="opp" type="number" | + | <select id=" |
| - | <div class=" | + | <span id="sm_loaded_label"></ |
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | < | ||
| + | | ||
| </ | </ | ||
| - | <div class=" | ||
| - | <label for=" | ||
| - | <input id=" | ||
| - | <div class=" | ||
| </ | </ | ||
| - | <div class=" | + | |
| - | <label for=" | + | <!-- RESPONSIVE VOOR MOBIELE TELEFOONS --> |
| - | < | + | <div class=" |
| - | | + | |
| - | </div> | + | Deze pagina bevat interactieve grafieken en tabellen die zijn ontworpen |
| - | <div class=" | + | Voor een beter overzicht kun je je telefoon liggend houden of deze pagina openen op een tablet of laptop. |
| - | < | + | |
| - | < | + | |
| - | <div class=" | + | |
| </ | </ | ||
| - | < | + | |
| - | <table class=" | + | < |
| - | < | + | |
| - | < | + | |
| - | < | + | <div class="tab" |
| - | <th style="width: 60px;">%</th> | + | <div class=" |
| - | <th style="width: 70px;"> | + | <div class="tab" |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | <tbody id="woningtypes"></ | + | |
| - | <tfoot> | + | |
| - | < | + | |
| - | < | + | |
| - | <td id="totaal_perc">-</td> | + | |
| - | <td id="totaal_gewbvo"> | + | |
| - | <td id="totaal_won">-</td> | + | |
| - | <td id=" | + | |
| - | </ | + | |
| - | </ | + | |
| - | </table> | + | |
| </ | </ | ||
| - | <h3>Resultaat</h3> | + | <div id=" |
| - | <div id="output"></ | + | <div class=" |
| + | <div class=" | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | <input id=" | ||
| + | </div> | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | < | ||
| + | | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <span id=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | |||
| + | <!-- legenda Spacematrix --> | ||
| - | <script> | + | <div class="sm-legend"> |
| - | const types = [ | + | < |
| - | | + | |
| - | "mgw sociaal", "mgw goedkoop", | + | |
| - | ]; | + | |
| - | function formatGetal(n) { | + | <div class="sm-legend-grid"> |
| - | return n.toLocaleString("nl-NL"); | + | |
| - | } | + | |
| - | | + | |
| - | const stip = document.getElementById("stipje"); | + | < |
| - | const x = Math.min(100, | + | < |
| - | | + | |
| - | | + | |
| - | | + | <span class=" |
| - | | + | |
| + | </ | ||
| + | | ||
| - | | + | |
| - | const tbody = document.getElementById("woningtypes"); | + | <span class="sm-zone-badge">B</span> |
| - | types.forEach((type, | + | <div class="sm-legend-short"> |
| - | const row = document.createElement(" | + | Low-rise compact blocks |
| - | if (i === 5) row.className = " | + | <span class="sm-tip" |
| - | row.innerHTML = ` | + | <span class="sm-legend-i" |
| - | <td style="text-align: left;">${type}</td> | + | </span> |
| - | <td>< | + | |
| - | < | + | </div> |
| - | <td id=" | + | |
| - | < | + | |
| - | `; | + | |
| - | tbody.appendChild(row); | + | |
| - | }); | + | |
| - | } | + | |
| - | | + | |
| - | const opp = parseFloat(document.getElementById("opp").value); | + | < |
| - | const fsi = parseFloat(document.getElementById("fsi").value); | + | < |
| - | | + | |
| - | const voorzieningPerc | + | <span class="sm-tip" |
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </div> | ||
| - | const laadvermogen | + | <div class=" |
| - | | + | <span class=" |
| - | const bvoWonen | + | <div class=" |
| + | | ||
| + | <span class=" | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | document.getElementById("lv2").innerText = `Laadvermogen: | + | <div class="sm-legend-item"> |
| - | | + | < |
| - | | + | <div class=" |
| + | | ||
| + | <span class="sm-tip" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | updateStipje(fsi, | + | <div class=" |
| - | | + | <span class=" |
| - | | + | <div class=" |
| + | | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | | ||
| - | | + | |
| - | const laadvermogen | + | < |
| - | | + | <div class=" |
| + | | ||
| + | <span class="sm-tip" data-tip=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | let gewogenBVO | + | <div class=" |
| - | | + | <span class=" |
| - | | + | <div class=" |
| + | | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| - | for (let i = 0; i < types.length; | + | |
| - | const perc = parseFloat(document.getElementById(`perc_${i}`).value) || 0; | + | </div> |
| - | const bvo = parseFloat(document.getElementById(`bvo_${i}`).value) || 0; | + | |
| - | gewogenBVO += (perc / 100) * bvo; | + | |
| - | totalPerc += perc; | + | |
| - | details.push({ i, perc, bvo }); | + | |
| - | } | + | |
| - | if (gewogenBVO === 0) return; | + | <!-- Einde Legenda en Tooltip --> |
| + | |||
| + | </ | ||
| - | const totaalWoningenExact = woonBVO / gewogenBVO; | + | |
| - | let sumWon | + | <div class=" |
| - | let sumBVO | + | < |
| - | let wonPerType | + | < |
| + | </ | ||
| + | </ | ||
| - | let restant | + | <div class=" |
| - | | + | < |
| - | const { perc } = details[i]; | + | < |
| - | let aant = (perc / 100) * totaalWoningenExact; | + | <tr>< |
| - | let afgerond = Math.floor(aant); | + | </ |
| - | | + | < |
| - | restant | + | < |
| - | } | + | < |
| + | </ | ||
| + | </ | ||
| - | const decimaalSort | + | <div style=" |
| - | i, rest: ((d.perc | + | < |
| - | })).sort((a, b) => b.rest - a.rest); | + | Dit komt doordat het aantal woningen iteratief wordt bepaald op basis van de beschikbare ruimte, inclusief ruimte voor voorzieningen en parkeren. |
| + | Bij het toepassen van voorzieningen wordt eerst een schatting gemaakt op basis van een voorlopig aantal woningen. Daarna wordt het aantal woningen opnieuw berekend met de benodigde ruimte per woning. | ||
| + | Hierdoor ontstaat een klein verschil tussen het oorspronkelijk berekende totaal en de daadwerkelijk ingepaste voorzieningenruimte. | ||
| + | </ | ||
| - | for (let j = 0; j < restant; j++) { | + | <div id=" |
| - | | + | <div id=" |
| - | | + | < |
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | < | ||
| + | <td colspan=" | ||
| + | Kengetallen | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div style=" | ||
| + | <button onclick=" | ||
| + | 📄 Kickstart Dump downloaden | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| - | for (let i = 0; i < details.length; i++) { | + | <div id=" |
| - | const aant = wonPerType[i]; | + | |
| - | const bvoTot | + | < |
| - | | + | <input id=" |
| - | | + | </ |
| - | | + | < |
| - | | + | < |
| - | } | + | < |
| + | </ | ||
| + | <tbody id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | <button id=" | ||
| + | <div id=" | ||
| + | </ | ||
| + | < | ||
| + | <table id=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <tbody id=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | <div style=" | ||
| + | < | ||
| + | Nadat dit oppervlak per woning is berekend, wordt het aantal woningen in het rekenblok opnieuw doorgerekend. Hierdoor kan het werkelijke totaal afwijken. | ||
| + | Deze iteratieve aanpak is nodig omdat de benodigde ruimte per woning invloed heeft op hoeveel woningen uiteindelijk in het plan passen. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div id=" | ||
| + | < | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | <button id=" | ||
| + | <div id=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div id=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <select id=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | <p style=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | let waarschuwing = ''; | + | <script src="/wiki/ |
| - | if (Math.abs(totalPerc - 100) > 0.5) { | + | |
| - | waarschuwing = `<p style="color: | + | |
| - | } | + | |
| - | document.getElementById(" | ||
| - | ${waarschuwing} | ||
| - | < | ||
| - | < | ||
| - | `; | ||
| - | } | ||
| - | function init() { | ||
| - | renderWoningtypes(); | ||
| - | updateLaadvermogen(); | ||
| - | } | ||
| - | window.onload = init; | + | </body> |
| - | </script> | + | |
| </ | </ | ||
handleiding_nieuw/sub_spacematrix.1746608671.txt.gz · Last modified: 2025/05/07 09:04 by support