Dado um modelo em que o HTML não pode ser modificado devido a outros requisitos, como é possível exibir (reorganizar) um div
acima do outro div
quando eles não estão nessa ordem no HTML? Ambos div
s contêm dados que variam em altura e largura.
<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
Espero que seja óbvio que o resultado desejado seja:
Content to be above in this situation
Content to be below in this situation
Other elements
Quando as dimensões são fixas, é fácil posicioná-las onde necessário, mas preciso de algumas idéias para quando o conteúdo é variável. Para esse cenário, considere apenas a largura de 100% em ambos.
Estou procurando especificamente uma solução somente CSS (e provavelmente terá que ser encontrada com outras soluções, se isso não der certo).
Existem outros elementos após isso. Uma boa sugestão foi mencionada, devido ao cenário limitado que demonstrei - já que essa pode ser a melhor resposta, mas pretendo garantir também que os elementos a seguir não sejam afetados.
img { max-width: 100% }
não funcionará dentro dos elementos reordenados.Uma solução somente CSS (funciona para o IE10 + ) - use a
order
propriedade do Flexbox :Demo: http://jsfiddle.net/hqya7q6o/596/
Mais informações: https://developer.mozilla.org/en-US/docs/Web/CSS/order
fonte
#flex { display: flex; flex-direction: column; }
exibirá linhas com largura de 100%. jsfiddle.net/2fcj8s9etransform
com um suppport navegador mais amploComo já foi dito, isso não é algo que você gostaria de fazer em CSS. Você pode falsificá-lo com posicionamento absoluto e margens estranhas, mas simplesmente não é uma solução robusta. A melhor opção no seu caso seria recorrer ao javascript. No jQuery, esta é uma tarefa muito simples:
ou mais genericamente:
fonte
Isso pode ser feito usando o Flexbox.
Crie um contêiner que aplique as duas telas: flex e flex-flow: reverse-column .
Fontes:
fonte
Não há absolutamente nenhuma maneira de alcançar o que você deseja apenas através do CSS, oferecendo suporte a agentes de usuário pré-flexbox ( principalmente IE antigo ) - a menos que :
Se o exposto acima for verdadeiro, você poderá fazer o que deseja posicionando absolutamente os elementos -
Novamente, se você não sabe a altura desejada pelo menos #firstDiv, não há como fazer o que deseja apenas via CSS. Se algum deste conteúdo for dinâmico, você precisará usar o javascript.
fonte
Aqui está uma solução:
Mas suspeito que você tenha algum conteúdo que segue a div do wrapper ...
fonte
Com o módulo de layout CSS3 flexbox, você pode solicitar divs.
fonte
Se você souber ou puder impor o tamanho do elemento superior, você poderá usar
Em seu css e dê aos divs a posição deles.
caso contrário, o javascript parece o único caminho a percorrer:
ou algo semelhante.
edit: Acabei de encontrar este que pode ser útil: w3 document css3 move-to
fonte
As margens superiores negativas podem atingir esse efeito, mas precisariam ser personalizadas para cada página. Por exemplo, essa marcação ...
... e esse CSS ...
... permitiria que você puxasse o segundo parágrafo acima do primeiro.
Obviamente, você precisará ajustar manualmente seu CSS para diferentes comprimentos de descrição, para que o parágrafo de introdução salte na quantidade apropriada, mas se você tiver controle limitado sobre as outras partes e controle total sobre a marcação e o CSS, isso pode ser uma opção .
fonte
Bem, com um pouco de posicionamento absoluto e algumas configurações de margem desonestas, posso me aproximar, mas não é perfeito ou bonito:
O "margin-top: 4em" é o bit particularmente desagradável: essa margem precisa ser ajustada de acordo com a quantidade de conteúdo no firstDiv. Dependendo dos requisitos exatos, isso pode ser possível, mas espero que alguém possa aproveitar isso para obter uma solução sólida.
O comentário de Eric sobre JavaScript provavelmente deve ser seguido.
fonte
Isso pode ser feito apenas com CSS!
Por favor, verifique minha resposta a esta pergunta semelhante:
https://stackoverflow.com/a/25462829/1077230
Eu não quero postar minha resposta duas vezes, mas o resumo é que o pai precisa se tornar um elemento do flexbox. Por exemplo:
(apenas usando o prefixo do fornecedor do kit da web aqui.)
Em seguida, troque divs indicando a ordem com:
fonte
No seu CSS, flutue a primeira div pela esquerda ou pela direita. Flutue a segunda div à esquerda ou à direita, igual à primeira. Aplique
clear: left
ouright
o mesmo que os dois divs acima para o segundo div.Por exemplo:
fonte
Se você apenas usa css, pode usar o flex.
fonte
Eu estava procurando uma maneira de alterar as ordens dos divs apenas para a versão móvel, para que eu possa estilizá-lo com estilo. Graças à resposta do nickf, consegui criar esse código que funcionou bem para o que eu queria, então pensei em compartilhá-lo com vocês:
fonte
Uma solução com um suporte de navegador maior que o flexbox (funciona no IE≥9):
Ao contrário da
display: table;
solução, essa solução funciona quando.wrapper
há filhos.fonte
Basta usar flex para a div pai especificando
display: flex
eflex-direction : column
. Em seguida, use order para determinar qual div filho vem primeirofonte
CSS realmente não deve ser usado para reestruturar o back-end HTML. No entanto, é possível se você conhece a altura de ambos os elementos envolvidos e se sente insensato. Além disso, a seleção de texto será alterada entre as divs, mas isso ocorre porque a ordem HTML e CSS são opostas.
Onde XXX e AA são as alturas do firstDiv e secondDiv, respectivamente. Isso funcionará com elementos finais, ao contrário da resposta principal.
fonte
Eu tenho um código muito melhor, feito por mim, é tão grande, apenas para mostrar as duas coisas ... criar uma tabela 4x4 e alinhar verticalmente mais do que apenas uma célula.
Ele não usa nenhum hack do IE, nenhum alinhamento vertical: meio; em absoluto...
Não é usado para centralizar verticalmente display-table, display: table-rom; display: célula de tabela;
Ele usa o truque de um contêiner que possui duas divs, uma oculta (a posição não está correta, mas faz com que o pai tenha o tamanho de variável correto), uma visível logo após a oculta, mas com o topo: -50%; por isso, é o motor para corrigir a posição.
Veja as classes div que fazem o truque: BloqueTipoContenedor BloqueTipoContenedor_VerticalmenteCentrado BloqueTipoContenido_VerticalmenteCentrado_Oculto BloqueTipoContenido_VerticalmenteCentrado_Visible
Desculpe por usar o espanhol nos nomes das classes (é porque eu falo espanhol e isso é tão complicado que, se eu uso o inglês, me perco).
O código completo:
fonte
Um pouco tarde para a festa, mas você também pode fazer isso:
fonte
Ou defina uma posição absoluta para o elemento e trabalhe fora das margens, declarando-as na borda da página e não na borda do objeto. Use% como mais adequado para outros tamanhos de tela ect. Isto é como eu superei a questão ... Obrigado, espero que seja o que você está procurando ...
fonte
Para a solução somente CSS 1. A altura do wrapper deve ser fixa ou a altura da segunda div deve ser fixa.
fonte
fonte
É fácil com css, basta usar
display:block
ez-index
propriedadeAqui está um exemplo:
HTML:
CSS:
Edit: É bom definir alguns
background-color
para odiv-s
para ver as coisas corretamente.fonte
Eu tenho uma maneira simples de fazer isso.
fonte