2017-10-03 1 views
1

J'ai une table simple qui se décline correctement dans Chrome. Mais dans IE11, la mise en page est rompue lorsqu'un élément ancêtre a display: flex.Mise à jour de la table IE11 lorsque l'ancêtre a affiché: flex

Les zones de saisie au bas de la page doivent être à 10 px du bas des en-têtes de tableau. Donc pour ce faire, j'ai mis margin-bottom sur le texte d'en-tête lui-même pour faire de la place pour les boîtes d'entrée (filtres), puis je les positionne absolument au bas des éléments th, qui ont position:relative pour les ancrer.

Voici le lien: https://codepen.io/nfknight/pen/KXyKdw

Toute aide est appréciée! Ou je suis curieux s'il y a d'autres idées sur la façon d'accomplir un en-tête-variable avec un élément de filtre fixe. L'élément d'en-tête et les éléments de filtre doivent tous deux être frères.

+0

Flexbox a seulement [** soutien partiel **] (http://caniuse.com/#search = flex) dans IE 11. –

Répondre

1

Ce n'est pas un problème avec un ancêtre flexible. Le supprimer ne semble pas faire de différence dans IE11 ou Chrome. Il semble que ce soit une différence de rendu pour le positionnement absolu.

Vous pouvez contourner le problème en faisant en sorte que les colonnes soient flexibles.

revised codepen

.flexAncestor { 
 
    display: flex; 
 
} 
 

 
tr { 
 
    display: flex;  /* gives full height to children */ 
 
    height: 250px;  /* for demo only */ 
 
} 
 

 
.col1 { 
 
    display: inline-flex; 
 
    flex-direction: column; 
 
    width: 100px; 
 
    background: pink; 
 
} 
 

 
.col2 { 
 
    display: inline-flex; 
 
    flex-direction: column; 
 
    width: 100px; 
 
    background: lightblue; 
 
} 
 

 
.ui-column-title { 
 
    margin: auto;  /* flex auto margin; see below */ 
 
} 
 

 
.ui-column-filter { 
 
    align-self: center; 
 
    margin-bottom: 10px; 
 
    width: calc(100% - 15px); 
 
}
<div class="flexAncestor"> 
 
    <div class="tableContainer"> 
 
    <table class="testDataTable"> 
 
     <thead> 
 
     <tr> 
 
      <th class="col1"> 
 
      <span class="ui-column-title">id</span> 
 
      <input class="ui-column-filter" type="text" /> 
 
      </th> 
 
      <th class="col2"> 
 
      <span class="ui-column-title">Wrapping column header inside flex ancestor throws layout off in IE11 </span> 
 
      <input class="ui-column-filter" type="text" /> 
 
      </th> 
 
     </tr> 
 
     </thead> 
 
    </table> 
 
    </div> 
 
</div>

En savoir plus sur flex marges ici auto:

+1

J'ai décidé de fermer en dupe, comme cette dupe le décrit bien. Pourtant, j'ai répondu avec une solution que j'ai trouvée, qui n'existait pas dans le dupe, et +1 pour le vôtre. – LGSon

+0

Si je commente hors affichage: flex sur l'ancêtre, le problème n'existe pas. Notez que le codepen ne semble pas toujours recharger automatiquement dans IE. –

1

A s mention, il n'est pas, il est flexbox liée basée sur le fait que l'effet de position: relative sur des éléments de table est définie, ce qui est bien décrite ici:


Dans ce Dans le cas où il se trouve que l'épinglage height: 100% sur le chemin de la pile guérit le problème de positionnement absolu, si vous ajoutez cette règle, cela fonctionnera également dans IE.

.tableContainer, table, thead, tr, th { height: 100% } 

Src: https://davidwalsh.name/table-cell-position-absolute

Stack snippet

.flexAncestor { 
 
    display: flex; 
 
} 
 

 
.tableContainer { 
 
    flex: 1 0 auto; /* not sure if needed. */ 
 
} 
 

 
.tableContainer, table, thead, tr, th {   /* added */ 
 
    height: 100% 
 
} 
 

 
.ui-column-title { 
 
    margin-bottom: 100px; 
 
    display: inline-block; 
 
    white-space: normal; 
 
} 
 

 
.ui-column-filter { 
 
    position: absolute; 
 
    bottom: 10px; 
 
    left: 5px; 
 
    width: calc(100% - 15px); 
 
} 
 

 
.testDataTable th { 
 
    position: relative; 
 
} 
 

 
.col1 { 
 
    width: 100px; 
 
    background: pink; 
 
} 
 

 
.col2 { 
 
    width: 100px; 
 
    background: lightblue; 
 
}
<div class="flexAncestor"> 
 
    <div class="tableContainer"> 
 
    <table class="testDataTable"> 
 
     <thead> 
 
     <tr> 
 
      <th class="col1"> 
 
      <span class="ui-column-title">id</span> 
 
      <input class="ui-column-filter" type="text" /> 
 
      </th> 
 
      <th class="col2"> 
 
      <span class="ui-column-title">Wrapping column header inside flex ancestor throws layout off in IE11 </span> 
 
      <input class="ui-column-filter" type="text" /> 
 
      </th> 
 
     </tr> 
 
     </thead> 
 
    </table> 
 
    </div> 
 
</div>

+0

Si je commente hors affichage: flex sur l'ancêtre, le problème n'existe pas. Notez que le codepen ne semble pas toujours recharger automatiquement dans IE.Ajouter de la hauteur: 100% de la chaîne semble fonctionner dans l'exemple de codepen, mais ne fonctionne pas dans mon application. Donc, je suis toujours en train de chercher où est le problème. –

+0

@NateK Puisque nous avons fourni 2 façons de le faire fonctionner, nous ne pouvons pas faire plus si le code que vous avez posté n'est pas un sous-ensemble du vrai. Aussi, si enlever le 'display: flex' sur le Codepen, ça ne marche toujours pas, ce qui prouve qu'il n'a rien à voir avec Flexbox, ce que j'ai aussi expliqué dans la première partie de ma réponse. – LGSon