2017-09-10 5 views
2

jsfiddle here.Comment inclure le remplissage sur un élément span ayant plusieurs lignes

J'ai un élément span qui est surligné en utilisant background-color: yellow et padding: 1px 10px.

normal here

Cependant, sur les petits appareils, cette ligne de texte devient deux lignes, trois lignes, etc. Cela provoque les première et deuxième lignes à « perdre » le rembourrage sur le côté droit , tels que les mots « le » et « à », et les deuxième et troisième lignes à « perdre » le rembourrage sur la gauche côté, comme les mots « fort » et « mieux » dans l'image ci-dessous:

the problem

Comment puis-je assurer ces mots (dans l'image ci-dessus, "le", "surligner", "à", "mieux") et tous les autres mots garder ce remplissage 10px sur le côté gauche et à droite?

Quelqu'un en réponse à une question similaire a suggéré d'utiliser display: block, mais cela rend la durée plus une durée, juste un rectangle et qui est pas comment je besoin de regarder. Cela permet également de faire ressortir toute la largeur de la page.

undesired result

+0

Enroulez le span dans un div avec rembourrage – bryan60

Répondre

1

Vous pouvez feindre l'arrière-plan lorsque la durée est brisée à l'aide box-shadow. Essayez quelque chose comme ça et voir si cela fonctionne pour vous:

span { 
    background-color: yellow; 
    padding: 1px 0; 
    box-shadow: 10px 0 0 0 yellow, -10px 0 0 0 yellow; 
} 
+0

J'aime ça! Cela fonctionne, merci – Cris

-1

simplement envelopper dans un conteneur div et mettre le rembourrage horizontal sur cet élément puisque c'est ce que vous voulez réellement:

<div class="span-container><span>my text</span></div> 

.span-container { padding: 0 10px; } 
.span-container span { background-color: yellow; padding: 1px 0; } 

est ici une violon démontrant que cette mesure permet exactement ce que vous voulez sans contournements de travail qui ne fonctionnent pas dans tous les navigateurs: https://jsfiddle.net/xg1bkgmn/

durée est un élément en ligne, il est logique de l'utiliser pour votre cas de mettre en évidence que le texte et l'élargissement des lignes . Cependant, pour garder le tout rembourré, il faut un conteneur d'éléments de bloc, c'est une pratique standard. Pourquoi choisir un CSS plus compliqué quand la solution est aussi simple?

+0

Le jsfiddle do Il ne semble pas faire quoi que ce soit .. – Cris

+0

Il fait exactement ce que vous voulez. il maintient même le rembourrage horizontal à travers les sauts de ligne tout en épaississant la partie en surbrillance et en soulignant seulement le texte. Ai-je manqué quelque chose? Je ne vois pas pourquoi un hack avec shadow box (qui n'est pas cross browser) est plus simple que d'ajouter un container pour le padding? – bryan60

4

Utilisez le CSS box-decoration-break.

span { 
    background-color:yellow; 
    padding:1px 10px; 
    box-decoration-break: clone; 
    -webkit-box-decoration-break:clone; 
} 

Cela applique les styles à chaque fragment de boîte de votre étendue.

+2

Battez-moi! Était juste de mettre en place un échantillon de codepen (https://codepen.io/kball/pen/Yxmgmj) mais vous y êtes arrivé en premier. :) Fun propriété pour en savoir plus - il ya un blogpost amusant que j'ai trouvé qui va dans plus de détails ici: http://callmenick.com/post/multi-line-padded-text-css-box-decoration-break – kball

+1

Le support du navigateur pour 'box-decoration-break' n'est pas génial – itodd

0

Pour inclure autant de navigateurs que possible, vous pouvez relayer sur la position: relative et utiliser 2 balises inline imbriquées pour imiter le résultat souhaité.

Notez que certaines marges ou padding doivent être pris en compte pour conserver l'élément translaté en position.

exemple pour montrer l'idée

p {/* make the text wrap*/ 
 
    width:15em; 
 
    margin:2em; 
 
} 
 
span { 
 
background:yellow; 
 
/* increase line height for better reading : optionnal*/ 
 
    line-height:1.35em; 
 
    padding: 0.25em 0; 
 
    
 
} 
 
span span { 
 
/* move child 1em to left to fake padding */ 
 
    position:relative; 
 
    left:1em;/* value of your left alike padding*/ 
 
} 
 

 
/* eventually on the last line ? */ 
 

 
span span:after { 
 
    content:''; 
 
    padding:0.25em; 
 
}
<p> 
 
    <span> 
 
<span>This sentence <del> has some padding</del> to make the highlight appear thicker. These are more words to better explain. 
 
</span> 
 
    </span> 
 
</p>

https://jsfiddle.net/ynh35sL5/3/

Ce n'est pas le meilleur, HTML supplémentaire pour le style ... envergures sont neutres :(

+0

J'ai eu une solution plus simple, mais merci :) – Cris

+0

@cns je n'ai pas propagé d'ombre horizontale qui voyait buggy en première ligne une fois enveloppé, mais il peut être utile en cas de chute verticalement lorsque vous souhaitez également dessiner une bordure en dehors du texte mis en surbrillance https://codepen.io/gc-nomade/pen/dWPGXv –