Mach die Leinwand so breit und so hoch wie die Eltern

79

Ich möchte eine rechteckige Leinwand erstellen, um einen Fortschrittsbalken zu simulieren, aber wenn ich die Breite und Höhe einer Leinwand auf 100% setze, ist sie anscheinend nicht so hoch und breit wie die übergeordnete

siehe Beispiel unten
http://jsfiddle.net/PQS3A/

Ist es überhaupt möglich, nicht quadratische Leinwand herzustellen? Ich möchte die Höhe und Breite der Leinwand nicht fest codieren, da sie sich dynamisch ändern sollte, wenn sie auf einem größeren oder kleineren Bildschirm angezeigt wird, einschließlich mobiler Geräte

user1118019
quelle

Antworten:

135

Hier ist ein Arbeitsbeispiel zur Behebung der Probleme:

http://jsfiddle.net/PQS3A/7/

Sie hatten mehrere Probleme mit Ihrem Beispiel:

  1. A <div>hat keine heightoder widthAttribute. Sie müssen diese über CSS festlegen.
  2. Selbst wenn die Größe des Div korrekt war, wurde die Standardeinstellung verwendet position:static, was bedeutet, dass es NICHT das positionierende Elternteil eines Kindes ist. Wenn die Zeichenfläche dieselbe Größe wie das div haben soll, müssen Sie das div auf position:relative(oder absoluteoder fixed) setzen.
  3. Die Attribute widthund heightauf einem Canvas geben die Anzahl der zu zeichnenden Datenpixel an (wie die tatsächlichen Pixel in einem Bild) und sind von der Anzeigegröße des Canvas getrennt. Diese Attribute müssen auf Ganzzahlen gesetzt werden.

In dem oben verlinkten Beispiel wird CSS verwendet, um die Div-Größe festzulegen und sie zu einem positionierten übergeordneten Element zu machen. Es erstellt eine JS-Funktion (siehe unten), mit der eine Zeichenfläche auf die gleiche Anzeigegröße wie das positionierte übergeordnete Element festgelegt wird. Anschließend werden die internen widthund heightEigenschaften so angepasst, dass sie die gleiche Anzahl von Pixeln aufweisen, wie sie angezeigt werden.

var canvas = document.querySelector('canvas');
fitToContainer(canvas);

function fitToContainer(canvas){
  // Make it visually fill the positioned parent
  canvas.style.width ='100%';
  canvas.style.height='100%';
  // ...then set the internal size to match
  canvas.width  = canvas.offsetWidth;
  canvas.height = canvas.offsetHeight;
}
Phrogz
quelle
1
oh wow, ich habe die Position nicht auf relativ oder absolut geändert, weil ich denke, dass das div-Tag standardmäßig das untergeordnete Element enthält, das es enthält, also ist es nicht der Fall? es lässt das Kind nur über seine Grenzen hinaus wachsen, wenn es sich in einer statischen Position befindet? Ich dachte, Position hat mit buchstäblich nur Position zu tun, und was ich archivieren wollte, ist, es so breit und hoch wie Eltern zu machen. Ich denke also, die Position bestimmt auch, auf welches untergeordnete Element (innerhalb des div-Tags) für Breite und Höhe verwiesen wird.
user1118019
@ user1118019 Ich habe nicht ganz verstanden, was Sie gerade geschrieben haben, aber hier sind einige wichtige Details. Elemente, für display:blockdie kein CSS widthangegeben ist, werden so breit wie ihr Container. Containerelemente ohne heightangegebenes CSS sind nur so hoch wie ihr Inhalt. Inhalte mit einer prozentualen Höhe entsprechen denen, height:0wenn der Elternteil herausfindet, wie groß er sein muss. Wenn Sie absolute Positionierungs- oder Prozentabmessungen verwenden, werden diese relativ zum "übergeordneten Versatz" berechnet. Standardmäßig ist der Body der einzige übergeordnete Offset.
Phrogz
@ user1118019 Elemente, die position:static(der Standardwert und das Verhalten aller Elemente) sind, starten kein neues Positionierungssystem, sondern position:relative(ohne die Anzeige des Elements anderweitig zu ändern). Sehen Sie sich zum Beispiel diese Demo an . Beachten Sie, wie #a1die Position relativ zum Körper positioniert und bemessen ist, und ignorieren Sie dessen Inhalt <div>. Beachten Sie, wie #b1stattdessen relativ zu seinem Container positioniert und dimensioniert wird, mit dem einzigen Unterschied zwischen den beiden #b { position:relative}.
Phrogz
danke Phrogz ... ich habe es jetzt bekommen, danke, dass du dir Zeit genommen und mir Dinge erklärt hast, ich weiß es wirklich zu schätzen
user1118019
1
"Selbst wenn die Größe des Div korrekt war, wurde die Standardposition verwendet: statisch, was bedeutet, dass es NICHT das positionierende Elternteil eines Kindes ist" smh ... warum tho, CSS? Ich war nur gut zu dir.
CCJ
15

Verwenden Sie die Attribute widthund heightder Zeichenfläche, wenn Sie möchten, dass sie tatsächlich so groß wie das übergeordnete Element ist. Sie können sie mit JQuery festlegen .

$(document).ready(function() {
  var canvas = document.getElementById("theCanvas");
  canvas.width = $("#parent").width();
  canvas.height = $("#parent").height();
});

Wenn Sie JQuery nicht kennen , verwenden Sie das folgende Javascript:

var canvas = document.getElementById("theCanvas");
var parent = document.getElementById("parent");
canvas.width = parent.offsetWidth;
canvas.height = parent.offsetHeight;

Wenn Sie die cssAttribute height und width verwenden, style="width:100%; height:100%;"strecken Sie nur die Leinwand. Dadurch wirkt alles, was Sie auf die Leinwand zeichnen, gestreckt.

JSFiddle für JQuery-Lösung.

JSFiddle für Javascript-Lösung.

Brant Olsen
quelle
2
Ich stelle fest, dass der Fragesteller sich nicht auf jquery bezog und daher vielleicht nichts davon weiß. Sie benötigen möglicherweise eine reine Javascript-Methode.
Jing3142
@ jing3142 Guter Anruf. Ich habe sowohl mit der JQuery-Lösung als auch mit der Nicht-JQuery-Lösung aktualisiert.
Brant Olsen
1
Beachten Sie, dass die Nicht-jQuery-Lösung fehlschlägt, wenn Sie style=""dem übergeordneten Element kein explizites Attribut zuweisen oder JS zum Festlegen des Stils verwenden. Sie sollten getComputedStyle()oder, wie ich in meiner Antwort getan habe, offsetWidth/ verwenden offsetHeight.
Phrogz
danke brant für die antwort, ich würde sowohl deine antwort als auch die erste akzeptieren, wenn ich könnte. aber trotzdem Daumen hoch deine Antwort auch. Nochmals vielen Dank für die Erklärung.
user1118019
-1

Verwenden Sie CSS-Eigenschaften anstelle von Attributen für die Tags:

<div style="background-color:blue;width:140px;height:20px">
    <canvas style="background-color: red;width:100%;height:100%">
    </canvas>
</div>​

Das scheint zu funktionieren

Kristoffer Sall-Storgaard
quelle
22
Dadurch wird die Leinwand gedehnt, anstatt die Größe zu ändern, wodurch alle Zeichnungen auf der Leinwand merkwürdig aussehen.
Brant Olsen