2 votes

Comment mettre à l'échelle un shape-outside css basé sur une image

J'expérimente avec les CSS shape-outside en utilisant une image, mais au moins dans Safari, la forme résultante est toujours basée sur la taille de l'image originale et je ne vois aucun moyen de mettre à l'échelle l'image en fonction de la taille de la boîte, ce qui serait nécessaire pour un design vraiment réactif (sans parler de faciliter la vie pour les tests initiaux).

Par exemple, dans cet extrait de CSS :

#shapetest {
    float: left;
    width: 100px;
    height: 300px;
    background: url('some-image.png');
    shape-outside: url('some-image.png');
    background-size: contain;
}

tandis que l'arrière-plan est mis à l'échelle pour couvrir la div, la forme reste à la taille d'origine de some-image.png ce qui n'est pas inattendu. Cependant, j'aimerais vraiment pouvoir redimensionner la forme pour qu'elle tienne dans la boîte, sans avoir à générer plusieurs rendus de la forme.

Est-ce qu'il me manque une sorte de fonction de mise à l'échelle pour les shape-outside ? Les ressources que j'ai pu trouver à ce sujet indiquent que le facteur d'échelle pour un shape-outside n'est pas encore spécifiée, ce qui la rend un peu moins utile pour les conceptions où l'objet peut être mis à l'échelle en fonction de la taille relative du point de vue, par exemple.

EDIT : En particulier, je souhaite pouvoir spécifier le hauteur de l'image (et que la largeur réagisse en conséquence). La réponse initiale à cette question fonctionnait bien avec une largeur spécifiée, mais la tentative suivante de reproduction ne fonctionne pas, car la hauteur spécifiée de l'image div fait couler le texte vers le bas, et en plaçant le div a float:left fait en sorte que sa propre boîte remplace la forme dans le flux :

div.inset {
    height: 1.5in;
}

div.inset img {
    float: left;
    width: auto;
    height: 100%;
    shape-outside: url('https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png');
}

<div class="inset"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png"></div>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In rutrum ornare fermentum. Praesent at leo volutpat, tempus eros vel, tempus diam. Morbi in viverra tortor. Etiam lobortis cursus elementum. Mauris eget lectus eget dolor posuere varius vitae a mi. Praesent nec commodo tellus. Nam facilisis tincidunt risus ac consequat. Nam arcu tellus, aliquam sodales metus vel, mollis porta purus. Suspendisse sagittis hendrerit dolor, sit amet accumsan libero cursus sit amet. Duis non fringilla ante. Vestibulum vestibulum scelerisque leo, sit amet elementum mauris. Donec eget dui mollis, venenatis dui non, viverra urna. Nam molestie, felis ut mollis ultricies, erat turpis ullamcorper sem, nec eleifend quam ex ac eros. Praesent sodales ligula quis dui maximus fermentum. Suspendisse tempor luctus elit.

En revanche, l'utilisation d'une largeur spécifiée et d'une hauteur calculée fonctionne parfaitement :

div.inset {
    width: 1.5in;
}

div.inset img {
    float: left;
    width: 100%;
    height: auto;
    shape-outside: url('https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png');
}

<div class="inset"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png"></div>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In rutrum ornare fermentum. Praesent at leo volutpat, tempus eros vel, tempus diam. Morbi in viverra tortor. Etiam lobortis cursus elementum. Mauris eget lectus eget dolor posuere varius vitae a mi. Praesent nec commodo tellus. Nam facilisis tincidunt risus ac consequat. Nam arcu tellus, aliquam sodales metus vel, mollis porta purus. Suspendisse sagittis hendrerit dolor, sit amet accumsan libero cursus sit amet. Duis non fringilla ante. Vestibulum vestibulum scelerisque leo, sit amet elementum mauris. Donec eget dui mollis, venenatis dui non, viverra urna. Nam molestie, felis ut mollis ultricies, erat turpis ullamcorper sem, nec eleifend quam ex ac eros. Praesent sodales ligula quis dui maximus fermentum. Suspendisse tempor luctus elit.

2voto

andreas Points 11569

Les caractéristiques dire ce qui suit :

La forme est calculée comme étant le ou les chemins qui entourent la ou les zones où l'opacité de l'image spécifiée est supérieure à la valeur du seuil de l'image de forme. [...]

L'image est dimensionnée et positionnée comme s'il s'agissait d'un élément remplacé dont la largeur et la hauteur spécifiées sont identiques à la taille du cadre de contenu utilisé par l'élément.

Ainsi, en utilisant le background-size ne modifie en rien la taille du contenu de l'élément. L'utilisation de l'élément image à la place devrait permettre à la forme calculée de répondre à la taille actuelle du cadre de contenu de l'image. Vous pouvez maintenant simplement définir une unité relative comme % pour les width de l'élément image pour obtenir une réactivité.

Voici un exemple concret. Vous pouvez modifier la largeur du conteneur et la largeur de l'image ainsi que sa forme doivent s'adapter au changement de largeur du conteneur :

.shape {
  float: left;
  width: 100%;
  shape-outside: url(https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png);
}

.container {
  width: 40%;
}

<div class="container">
  <img class="shape" src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png" />
</div>

Cette approche repose toutefois sur le fait qu'une div de largeur seulement n'a pas de hauteur propre. Mais cette solution fonctionne également :

img.inset {
    float: left;
    width: auto;
    height: 1.5in;
    shape-outside: url('https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png');
}

<img class="inset"  src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Svg_example3.svg/243px-Svg_example3.svg.png">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In rutrum ornare fermentum. Praesent at leo volutpat, tempus eros vel, tempus diam. Morbi in viverra tortor. Etiam lobortis cursus elementum. Mauris eget lectus eget dolor posuere varius vitae a mi. Praesent nec commodo tellus. Nam facilisis tincidunt risus ac consequat. Nam arcu tellus, aliquam sodales metus vel, mollis porta purus. Suspendisse sagittis hendrerit dolor, sit amet accumsan libero cursus sit amet. Duis non fringilla ante. Vestibulum vestibulum scelerisque leo, sit amet elementum mauris. Donec eget dui mollis, venenatis dui non, viverra urna. Nam molestie, felis ut mollis ultricies, erat turpis ullamcorper sem, nec eleifend quam ex ac eros. Praesent sodales ligula quis dui maximus fermentum. Suspendisse tempor luctus elit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X