1

I have created a calendar app in PHP with SVG where each month has a text row on top of the rectangle that represents the month. I developed it on a desktop PC, using the "monospace" font so that each day has the same pixel length. This looks good on my PC screen, but when I watched the calendar on an iPad and a cell phone, the SVG text was suddenly longer than the rectangle and did not fit anymore. I tried other font faces, but the effect was always the same. In some cases, the text becomes smaller than the graphics, and in others bigger. I thought that by using SVG, the text and the graphic elements were all vector graphics and would scale the same way. What can I do to make it work on all screens? I could add screenshots, but it looks like it's not possible to add images here. Here is the relevant part of the code

echo '<svg width="'.$svgW.'" height="'. $nM*($mHeight+$mOffset)+20 .'"  xmlns="http://www.w3.org/2000/svg">';   // total size

    echo '<rect x="0" y="'.$y0.'" width="'.$MonW -2 .'" height="'.$mHeight.'" style="fill:grey; stroke-width:2; stroke:rgb(0,0,0);" />';              // background for 1 month
    echo '<rect x="1" y="'.$y0.'" width="'.$MonW -3 .'" height="34" style="fill:WhiteSmoke; stroke-width:1; stroke:rgb(0,0,0)" />';       // background for dates & days of the month

    echo '<text x="14" y="' . $y0 +14 .'" font-size="15px" font-family="monospace" fill="black">'.sprintf('%02s',$mnr).' |</text>';       // month #
    echo '<text x="5" y="' . $y0 +30 .'" font-size="15px" font-family="monospace" fill="black">'.$year.'|</text>';                        // Year #
    echo '<text x="49" y="' . $y0 +14 .'" font-size="15px" font-family="monospace" fill="black">'.$allDates.'</text>';                    // all day #s
    echo '<text x="49" y="' . $y0 +30 .'" font-size="15px" font-family="monospace" fill="black">'.$dayNames.'</text>';                    // names of all days

    echo '<rect x="2" y= "' . $y0 +35 .'"  width="'.$aW.'" height="18 " style="fill:WhiteSmoke;" />';                             // 4 x gray fields for apartments
    echo '<rect x="2" y= "' . $y0 +54 .'"  width="'.$aW.'" height="18 " style="fill:WhiteSmoke;" />';
    echo '<rect x="2" y= "' . $y0 +73 .'"  width="'.$aW.'" height="18 " style="fill:WhiteSmoke;" />';
    echo '<rect x="2" y= "' . $y0 +92 .'"  width="'.$aW.'" height="18 " style="fill:WhiteSmoke;" />';

    echo '<text  x="18" y="' . $y0 +49 .'" font-size="15px" font-family="monospace" fill="black">A</text>';              // 4x names of the apartments
    echo '<text  x="18" y="' . $y0 +68 .'" font-size="15px" font-family="monospace" fill="black">B</text>';
    echo '<text  x="18" y="' . $y0 +87 .'" font-size="15px" font-family="monospace" fill="black">C</text>';
    echo '<text  x="18" y="' . $y0 +106 .'" font-size="15px" font-family="monospace" fill="black">D</text>';
    echo '<rect  x="'.$mStart.'" y= "' . $y0 +35 .'"  width="'.$ResW.'" height="18 " style="fill:rgb(0,255,0);" />';     // 4 green bars for reservations
    echo '<rect  x="'.$mStart.'" y= "' . $y0 +54 .'"  width="'.$ResW.'" height="18 " style="fill:rgb(0,255,0);" />';
    echo '<rect  x="'.$mStart.'" y= "' . $y0 +73 .'"  width="'.$ResW.'" height="18 " style="fill:rgb(0,255,0);" />';
    echo '<rect  x="'.$mStart.'" y= "' . $y0 +92 .'"  width="'.$ResW.'" height="18 " style="fill:rgb(0,255,0);" />';
echo '</svg>';

I have added the HTML code rendered in the browser (Chrome) to show the actual values

<svg width="865" height="548" xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width="863.439" height="112" style="fill:grey; stroke-width:2; stroke:rgb(0,0,0);">
  </rect>
  <rect x="1" y="0" width="862.439" height="34" style="fill:WhiteSmoke; stroke-width:1; stroke:rgb(0,0,0)">
  </rect>
  <text x="14" y="14" font-size="15px" font-family="monospace" fill="black">10 |
  </text>
  <text x="5" y="30" font-size="15px" font-family="monospace" fill="black">2022|
  </text>
  <text x="49" y="14" font-size="15px" font-family="monospace" fill="black">
    01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
  </text>
  <text x="49" y="30" font-size="15px" font-family="monospace" fill="black">

    Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|
  </text>
  <rect x="2" y="35" width="42" height="18 " style="fill:WhiteSmoke;">
  </rect>
  <rect x="2" y="54" width="42" height="18 " style="fill:WhiteSmoke;">
  </rect>
  <rect x="2" y="73" width="42" height="18 " style="fill:WhiteSmoke;">
  </rect>
  <rect x="2" y="92" width="42" height="18 " style="fill:WhiteSmoke;">
  </rect>
  <text x="18" y="49" font-size="15px" font-family="monospace" fill="black">A</text>
  <text x="18" y="68" font-size="15px" font-family="monospace" fill="black">B</text>
  <text x="18" y="87" font-size="15px" font-family="monospace" fill="black">C</text>
  <text x="18" y="106" font-size="15px" font-family="monospace" fill="black">D</text>
  <rect x="46" y="35" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="54" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="73" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="92" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="0" y="132" width="837.07" height="112" style="fill:grey; stroke-width:2; stroke:rgb(0,0,0);"></rect>
  <rect x="1" y="132" width="836.07" height="34" style="fill:WhiteSmoke; stroke-width:1; stroke:rgb(0,0,0)"></rect>
  <text x="14" y="146" font-size="15px" font-family="monospace" fill="black">11 |
  </text>
  <text x="5" y="162" font-size="15px" font-family="monospace" fill="black">2022|</text>
  <text x="49" y="146" font-size="15px" font-family="monospace" fill="black">01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|</text>
  <text x="49" y="162" font-size="15px" font-family="monospace" fill="black">Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|</text>
  <rect x="2" y="167" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="186" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="205" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="224" width="42" height="18 " style="fill:WhiteSmoke;"></rect><text x="18" y="181" font-size="15px" font-family="monospace" fill="black">A</text><text x="18" y="200" font-size="15px" font-family="monospace" fill="black">B</text><text x="18" y="219" font-size="15px" font-family="monospace" fill="black">C</text><text x="18" y="238" font-size="15px" font-family="monospace" fill="black">D</text>
  <rect x="46" y="167" width="791.07" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="186" width="791.07" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="205" width="791.07" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="224" width="791.07" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="0" y="264" width="863.439" height="112" style="fill:grey; stroke-width:2; stroke:rgb(0,0,0);"></rect>
  <rect x="1" y="264" width="862.439" height="34" style="fill:WhiteSmoke; stroke-width:1; stroke:rgb(0,0,0)"></rect><text x="14" y="278" font-size="15px" font-family="monospace" fill="black">12 |</text><text x="5" y="294" font-size="15px" font-family="monospace" fill="black">2022|</text><text x="49" y="278" font-size="15px" font-family="monospace" fill="black">01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|</text><text x="49" y="294" font-size="15px" font-family="monospace" fill="black">Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|</text>
  <rect x="2" y="299" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="318" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="337" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="356" width="42" height="18 " style="fill:WhiteSmoke;"></rect><text x="18" y="313" font-size="15px" font-family="monospace" fill="black">A</text><text x="18" y="332" font-size="15px" font-family="monospace" fill="black">B</text><text x="18" y="351" font-size="15px" font-family="monospace" fill="black">C</text><text x="18" y="370" font-size="15px" font-family="monospace" fill="black">D</text>
  <rect x="46" y="299" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="318" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="337" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="356" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="0" y="396" width="863.439" height="112" style="fill:grey; stroke-width:2; stroke:rgb(0,0,0);"></rect>
  <rect x="1" y="396" width="862.439" height="34" style="fill:WhiteSmoke; stroke-width:1; stroke:rgb(0,0,0)"></rect><text x="14" y="410" font-size="15px" font-family="monospace" fill="black">01 |</text><text x="5" y="426" font-size="15px" font-family="monospace" fill="black">2023|</text><text x="49" y="410" font-size="15px" font-family="monospace" fill="black">01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|</text><text x="49" y="426" font-size="15px" font-family="monospace" fill="black">Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|We|Th|Fr|Sa|Su|Mo|Tu|</text>
  <rect x="2" y="431" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="450" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="469" width="42" height="18 " style="fill:WhiteSmoke;"></rect>
  <rect x="2" y="488" width="42" height="18 " style="fill:WhiteSmoke;"></rect><text x="18" y="445" font-size="15px" font-family="monospace" fill="black">A</text><text x="18" y="464" font-size="15px" font-family="monospace" fill="black">B</text><text x="18" y="483" font-size="15px" font-family="monospace" fill="black">C</text><text x="18" y="502" font-size="15px" font-family="monospace" fill="black">D</text>
  <rect x="46" y="431" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="450" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="469" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="488" width="817.439" height="18 " style="fill:rgb(0,255,0);"></rect>
  <rect x="46" y="54" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="186" width="458" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="35" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="167" width="791" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="299" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="431" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="301" y="92" width="562" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="224" width="62" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="512" y="73" width="308" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="828" y="73" width="35" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="205" width="88" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="116" y="224" width="71" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="380" y="205" width="457" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="337" width="352" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="380" y="224" width="457" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="356" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="488" width="352" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="512" y="186" width="18" height="18" style="fill:yellow; stroke-width:1; stroke:grey"></rect>
  <rect x="564" y="186" width="273" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="318" width="817" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="46" y="450" width="36" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="406" y="337" width="124" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="301" y="450" width="71" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="327" y="469" width="536" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="380" y="450" width="361" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="406" y="488" width="457" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
  <rect x="749" y="450" width="114" height="18" style="fill:orange; stroke-width:1; stroke:grey"></rect>
</svg>
enxaneta
  • 31,608
  • 5
  • 29
  • 42
Volker Piasta
  • 87
  • 1
  • 11
  • monospace is not a specific font. Try picking an actual font that all devices have. – Robert Longson Oct 17 '22 at 07:28
  • 1
    @Robert Longson It may not seem so, but it is a specific font. See https://en.wikipedia.org/wiki/Monospace_(typeface). Anyway, I found a workaround that avoids this problem. Should I just delete the question (which is a real problem anyway and may have a real solution)? The workaround is to not use a long string with a chain of all the day numbers and names, but a series of short texts for each day, so the distortion remains small enough to be virtually invisible. This makes the HTML code longer as there are more lines with "" but there is nearly no difference on the PHP level. Tnx – Volker Piasta Oct 17 '22 at 22:04
  • Nope, See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family) where monospace is listed as: "generic family name only" the article goes on to tell you what that means in practice. – Robert Longson Oct 17 '22 at 22:32

0 Answers0