recherche

Maison  >  Questions et réponses  >  le corps du texte

Placer les éléments DIV dans la fenêtre SVG

Comment positionner les éléments HTML DIV par rapport aux éléments SVG ?

J'ai utilisé D3 pour générer le graphique SVG :

Je souhaite ajouter une liste déroulante à côté de la légende dans le coin inférieur droit. J'ai l'élément correspondant (un élément HTML DIV classique), mais je ne sais pas comment le positionner correctement sur le graphique.

Je comprends le positionnement des éléments SVG, mais je ne sais pas comment appliquer quelque chose comme un élément DIV.

Des idées autres que de le placer en dehors de la fenêtre (comme ci-dessous) ?

P粉803444331P粉803444331445 Il y a quelques jours560

répondre à tous(1)je répondrai

  • P粉529581199

    P粉5295811992023-09-08 16:47:49

    Afficher Position CSS. Vous pouvez créer un DIV relativement positionné pour contenir votre SVG. Vous pouvez ensuite placer un DIV absolument positionné dessus pour s'adapter au style select 元素;您可以使用它的 lefttop et placer le deuxième DIV où vous le souhaitez.

    Tout est réuni :

    let w = 500;
    let h = 300;
    let pad = 10;
    let xmin = -2 * Math.PI;
    let xmax = 2 * Math.PI;
    let ymin = -1.1;
    let ymax = 1.1;
    
    let svg = d3.select("#graph")
        .append("svg")
        .attr("max-width", `${w}px`)
        .attr("viewBox", [0, 0, w, h]);
        
    let x_scale = d3
      .scaleLinear()
      .domain([xmin, xmax])
      .range([pad, w - pad]);
    let y_scale = d3
      .scaleLinear()
      .domain([ymin, ymax])
      .range([h - pad, pad]);
    let path = d3
      .line()
      .x((d) => x_scale(d[0]))
      .y((d) => y_scale(d[1]));
    
    svg
      .append("g")
      .attr("transform", `translate(0, ${y_scale(0)})`)
      .call(d3.axisBottom(x_scale).tickFormat(d3.format("d")).tickSizeOuter(0));
    svg
      .append("g")
      .attr("transform", `translate(${x_scale(0)})`)
      .call(d3.axisLeft(y_scale).ticks(5).tickSizeOuter(0));
      
    d3.select('#function')
      .on('change', function() {
        draw_graph(this.value)
      })
      
      
    draw_graph('sine')
      
    
    function draw_graph(f_string) {
      svg.select('path.graph').remove()
      let f
      if(f_string == "sine") {
        f = Math.sin;
      }
      else {
        f = Math.cos;
      }
      let pts = d3.range(xmin, xmax, 0.01)
        .map((x) => [x, f(x)]);
      svg
        .append("path")
        .attr('class', 'graph')
        .attr("d", path(pts))
        .attr("fill", "none")
        .attr("stroke", "black")
        .attr("stroke-width", 3);
    }
    <script src="https://d3js.org/d3.v7.min.js"></script>
    
    <div style="position: relative" id="viz">
      <svg id="graph" width=500 height=300 style="border: solid 2px black"></svg>
      <div style="border: solid 0.5px black; background-color: rgba(255,255,255,0.7); position: absolute; left: 20px; top: 30px">
        <label for="function">function:</label>
        <select name="function" id="function">
          <option value="sine">sine</option>
          <option value="cosine">cosine</option>
        </select>
       </div>
    </div>

    répondre
    0
  • Annulerrépondre