Eu gostaria de usar consultas de mídia para redimensionar elementos com base no tamanho de um div
elemento em que estão. Não posso usar o tamanho da tela, pois ele div
é usado apenas como um widget na página da Web, e seu tamanho pode variar.
Atualizar
Parece que há trabalho sendo feito sobre isso agora: https://github.com/ResponsiveImagesCG/cq-demos
css
media-queries
Yazz.com
fonte
fonte
Respostas:
Não, as consultas de mídia não foram projetadas para funcionar com base nos elementos de uma página. Eles são projetados para funcionar com base em dispositivos ou tipos de mídia (por isso são chamados de consultas de mídia ).
width
,,height
e outros recursos de mídia baseados em dimensões referem-se às dimensões da janela de exibição ou da tela do dispositivo na mídia baseada em tela. Eles não podem ser usados para se referir a um determinado elemento em uma página.Se você precisar aplicar estilos, dependendo do tamanho de um determinado
div
elemento da sua página, precisará usar JavaScript para observar alterações no tamanho dessediv
elemento, em vez de consultas de mídia.fonte
@element
consultas. O W3C possui uma boa documentação sobre a rima / motivo das@media
consultas: w3.org/TR/css3-mediaqueries/#width (este link leva você à seção discutindo larguras --- larguras do tipo de mídia, e não os elementos contidos nela)Acabei de criar um calço javascript para atingir esse objetivo. Dê uma olhada, se quiser, é uma prova de conceito, mas tome cuidado: é uma versão inicial e ainda precisa de algum trabalho.
https://github.com/marcj/css-element-queries
fonte
min-width
renovados; preciso escrever manualmente a lista de classes css, elementos marcados, ativados paramin-width
renovação?Uma Consulta de Mídia dentro de um iframe pode funcionar como uma consulta de elemento. Eu implementei isso com sucesso. A ideia surgiu de um post recente sobre o Responsive Ads by Zurb. Sem Javascript!
fonte
No momento, isso não é possível apenas com CSS, como o @BoltClock escreveu na resposta aceita, mas você pode contornar isso usando JavaScript.
Criei um prolyfill de consulta de contêiner (também conhecido como consulta de elemento) para resolver esse tipo de problema. Funciona um pouco diferente de outros scripts, portanto você não precisa editar o código HTML dos seus elementos. Tudo o que você precisa fazer é incluir o script e usá-lo no seu CSS da seguinte maneira:
https://github.com/ausi/cq-prolyfill
fonte
Encontrei o mesmo problema há alguns anos e financiei o desenvolvimento de um plugin para me ajudar no meu trabalho. Lancei o plug-in como código-fonte aberto para que outros possam se beneficiar dele, e você pode acessá-lo no Github: https://github.com/eqcss/eqcss
Existem algumas maneiras pelas quais podemos aplicar diferentes estilos responsivos com base no que podemos saber sobre um elemento na página. Aqui estão algumas consultas de elementos que o plug-in EQCSS permitirá que você escreva em CSS:
Então, quais condições são suportadas para estilos responsivos com o EQCSS?
Consultas de peso
px
%
px
%
Consultas de altura
px
%
px
%
Contar consultas
Seletores Especiais
Nas consultas do elemento EQCSS, você também pode usar três seletores especiais que permitem aplicar seus estilos mais especificamente:
$this
(o (s) elemento (s) correspondente (s) à consulta)$parent
(o (s) elemento (s) pai (s) do (s) elemento (s) correspondente (s) à consulta)$root
(o elemento raiz do documento<html>
)As consultas de elemento permitem que você componha seu layout a partir de módulos de design responsivos individualmente, cada um com um pouco de 'autoconsciência' de como eles estão sendo exibidos na página.
Com o EQCSS, você pode criar um widget para ter uma boa aparência, de 150px a 1000px, e então soltar esse widget em qualquer barra lateral de qualquer página, usando qualquer modelo (em qualquer site) e
fonte
Do ponto de vista do layout, é possível usar técnicas modernas.
É composta (acredito) por Heydon Pickering. Ele detalha o processo aqui: http://www.heydonworks.com/article/the-flexbox-holy-albatross
Chris Coyier pega e trabalha através de uma demonstração aqui: https://css-tricks.com/putting-the-flexbox-albatross-to-real-use/
Para reafirmar a questão, abaixo, vemos 3 do mesmo componente, cada uma composta de três divs laranja rotulados
a
,b
ec
.Os blocos dos dois segundos são exibidos verticalmente, porque são limitados na sala horizontal, enquanto os três componentes principais são dispostos horizontalmente.
Ele usa a
flex-basis
propriedade CSS e variáveis CSS para criar esse efeito.Demo
O artigo de Heydon tem 1000 palavras, explicando-o em detalhes, e eu recomendo a leitura.
fonte
A questão é muito vaga. Como o BoltClock diz, as consultas de mídia conhecem apenas as dimensões do dispositivo. No entanto, você pode usar consultas de mídia em combinação com seletores de descendente para realizar ajustes.
A única outra solução requer JS.
fonte
A única maneira de pensar que você pode realizar o que deseja puramente com css é usar um contêiner de fluido para seu widget. Se a largura do contêiner for uma porcentagem da tela, você poderá usar consultas de mídia para estilizar, dependendo da largura do contêiner, pois agora você saberá para as dimensões de cada tela quais são as dimensões do contêiner. Por exemplo, digamos que você decida aumentar em 50% a largura da tela do seu contêiner. Para uma largura de tela de 1200 pixels, você sabe que seu contêiner tem 600 pixels
fonte
Eu também estava pensando em consultas de mídia, mas descobri o seguinte:
Basta criar um wrapper
<div>
com um valor percentual parapadding-bottom
, assim:Isso resultará em uma
<div>
altura igual a 75% da largura do seu contêiner (uma proporção de 4: 3).Essa técnica também pode ser combinada com consultas de mídia e um pouco de conhecimento ad hoc sobre o layout da página para um controle ainda mais refinado.
É o suficiente para minhas necessidades. O que também pode ser suficiente para suas necessidades.
fonte
Você pode usar a API ResizeObserver . Ainda está nos primeiros dias, portanto ainda não é suportado por todos os navegadores (mas existem vários polyfills que podem ajudá-lo).
Basicamente, essa API permite anexar um ouvinte de evento ao redimensionamento de um elemento DOM.
Demo 1 - Demo 2
fonte
Para o meu, eu fiz isso definindo a largura máxima da div, portanto, o widget pequeno não será afetado e o widget grande é redimensionado devido ao estilo de largura máxima.
fonte
.widget
é apenas uma amostra como a classe para a div do widget.