Rolf B: Inline-SVG → auf Style(CSS) per JS zugreifen?

Beitrag lesen

Hallo nochmal,

guck Dir mal dieses SVG an. Alle magischen Zahlen sind in custom properties untergebracht. Die Pupillen sind in ein g Element gekapselt, das per transform:translate verschoben werden kann. Die Verschiebung ist größenunabhängig, es wird einfach ein Wert zwischen -1 und 1 erwartet - die Skalierung erfolgt passend innerhalb des SVG mit CSS calc().

Du musst "nur" noch das Layer1 Element finden und in dessen style-Attribut die Custom Properties --dy, --d-left und --d-right passend setzen. Hypothese ist hier, dass die y-Auslenkung in beiden Augen immer gleich ist, und externen Anforderung ist, dass die Auslenkung in den Ecken nicht zu groß wird. Vermutlich sollte dx²+dy²<=1 gelten, ist es zu groß, musst Du herunterskalieren.

Ob eine Maus da ist, erkennst Du daran, ob Du mousemove-Events bekommst, denke ich…

	<svg id="Eyes" viewBox="0 0 300 140">
    <style>
      :root {
        --hcenter: 150px;
        --vcenter: 70px;
        --eye-width: 35px;
        --eye-height: 40px;
        --ring-stroke: 15px;
        --pupil-size: 20px;
      }
      .eye:nth-of-type(1) {
        --eye-center: calc(var(--hcenter) - var(--ring-stroke)*0.7 - var(--eye-width));
      }
      .eye:nth-of-type(2) {
        --eye-center: calc(var(--hcenter) + var(--ring-stroke)*0.7 + var(--eye-width));
      }
 		  .eye:nth-of-type(1) { --ring-color: yellow; }
		  .eye:nth-of-type(2) { --ring-color: red; }   
      

      .eye .ring {
        cx: var(--eye-center);
        cy: var(--vcenter);
        rx: var(--eye-width);
        ry: var(--eye-height);
  			fill: none;
			  stroke-width: var(--ring-stroke);
        stroke: var(--ring-color);
      }
      .eye:nth-of-type(1) .pupil {
        transform: translate(calc(var(--d-left)*10px), calc(var(--dy)*15px));
      }
      .eye:nth-of-type(2) .pupil {
        transform: translate(calc(var(--d-right)*10px), calc(var(--dy)*15px));
      }
      .eye .pupil ellipse:nth-child(1) {
        cx: var(--eye-center);
        cy: var(--vcenter);
  			rx: var(--pupil-size);
        ry: var(--pupil-size);
	    	fill: black; stroke: none; stroke-width: 0;
      }
      .eye .pupil ellipse:nth-child(2) {
        cx: calc(var(--pupil-size)/4 + var(--eye-center));
        cy: calc(var(--vcenter) - var(--pupil-size)/4);
  			rx: calc(var(--pupil-size)/4);
        ry: calc(var(--pupil-size)/4);
  			fill: white; stroke: gray; stroke-width: calc(var(--pupil-size)/6);
      }
	  </style>
	  <g id="Layer1"  style="--dy: -0.5; --d-left: 0.8; --d-right: -0.8;">
      <g class="eye">
	  	  <ellipse class="ring" />
        <g class="pupil">
		      <ellipse />
		      <ellipse />
        </g>
      </g>
      <g class="eye">
		    <ellipse class="ring" />
        <g class="pupil">
  		    <ellipse /> 		  
	  	    <ellipse />  
        </g>
      </g>
	  </g>
	</svg>

Rolf

--
sumpsi - posui - obstruxi