2017-09-27 7 views
1

J'ai un élément de bloc avec deux enfants, et je les aime chacun occuper la moitié de l'espace, moins un écart de taille fixe entre eux. Cela devrait être facile avec calc():Pixels supplémentaires lors de la division d'espace entre deux éléments

var left = document.getElementById("left"); 
 
var right = document.getElementById("right"); 
 
var info = document.getElementById("info"); 
 

 
var offset = 5; 
 
function toggleStyle() { 
 
    if (offset === 5) { 
 
    offset = 7; 
 
    } else { 
 
    offset = 5; 
 
    } 
 
    info.innerHTML = right.style = left.style = "width: calc(50% - " + offset + "px);"; 
 
} 
 

 
toggleStyle();
#container { 
 
    width: 300px; 
 
    height: 160px; 
 
    background-color: green; 
 
} 
 

 
#left, #right { 
 
    display: inline-block; 
 
    background-color: blue; 
 
    height: 150px; 
 
    margin-top: 5px; 
 
    margin-bottom: 5px; 
 
} 
 

 
#left { 
 
    margin-right: 5px; 
 
} 
 

 
#right { 
 
    margin-left: 5px; 
 
}
<div id="info"></div> 
 
<button onclick="toggleStyle()">Toggle</button> 
 
<div id="container"> 
 
    <div id="left"></div> 
 
    <div id="right"></div> 
 
</div>

Dans l'extrait ci-dessus, j'ai un parent 300px avec des enfants qui devrait être 50% - 5px = 145px de large, plus une marge de 5px chacun. Cela signifie que les deux enfants, plus leurs marges, devraient occuper exactement 300px. Quand je l'ai mis en place de cette façon, ils enveloppent. Si je soustrais 2 pixels de plus par enfant, ils semblent remplir exactement l'espace, même s'ils ne mesurent que 148 pixels chacun (marge comprise). D'où viennent les pixels supplémentaires?

Répondre

2

C'est l'espace blanc entre les divs gauche et droite.

Il fonctionnera si vous supprimez l'espace blanc entre eux, à savoir:

<div id="container"> 
    <div id="left"></div><div id="right"></div> 
</div> 

travail Snippet:

var left = document.getElementById("left"); 
 
var right = document.getElementById("right"); 
 
var info = document.getElementById("info"); 
 

 
var offset = 5; 
 
function toggleStyle() { 
 
    if (offset === 5) { 
 
    offset = 7; 
 
    } else { 
 
    offset = 5; 
 
    } 
 
    info.innerHTML = right.style = left.style = "width: calc(50% - " + offset + "px);"; 
 
} 
 

 
toggleStyle();
#container { 
 
    width: 300px; 
 
    height: 160px; 
 
    background-color: green; 
 
} 
 

 
#left, #right { 
 
    display: inline-block; 
 
    background-color: blue; 
 
    height: 150px; 
 
    margin-top: 5px; 
 
    margin-bottom: 5px; 
 
} 
 

 
#left { 
 
    margin-right: 5px; 
 
} 
 

 
#right { 
 
    margin-left: 5px; 
 
}
<div id="info"></div> 
 
<button onclick="toggleStyle()">Toggle</button> 
 
<div id="container"> 
 
    <div id="left"></div><div id="right"></div> 
 
</div>

+0

:: soupirer :: L'homme, quelques jours, je déteste vraiment HTML. – Coderer

+0

@Coderer C'est souvent la plus simple des choses qui causent les pires problèmes! :) Pour référence future, cela se produit avec l'affichage "inline-block", mais vous pouvez supprimer l'espace blanc manuellement ou les commentaires HTML fonctionnent aussi. par exemple. '

' – FluffyKitten

1

Flexbox peut faire

#container { 
 
    width: 300px; 
 
    margin: 1em auto; 
 
    height: 160px; 
 
    background-color: green; 
 
    display: flex; 
 
} 
 

 
#left, 
 
#right { 
 
    background-color: lightblue; 
 
    height: 150px; 
 
    margin-top: 5px; 
 
    margin-bottom: 5px; 
 
    flex: 1; 
 
} 
 

 
#left { 
 
    margin-right: 5px; 
 
}
<div id="container"> 
 
    <div id="left"></div> 
 
    <div id="right"></div> 
 
</div>

CSS Grille peut aussi le faire.

#container { 
 
    width: 300px; 
 
    margin: 1em auto; 
 
    height: 160px; 
 
    background-color: green; 
 
    display: grid; 
 
    grid-template-columns: 1fr 1fr; 
 
    grid-gap: 5px; 
 
} 
 

 
#left, 
 
#right { 
 
    background-color: lightblue; 
 
    height: 150px; 
 
    margin-top: 5px; 
 
    margin-bottom: 5px; 
 
}
<div id="container"> 
 
    <div id="left"></div> 
 
    <div id="right"></div> 
 
</div>