Comment utiliser le CSS et le JavaScript?) pour créer un flou, “givré” de fond?
Je suis en train de créer une version d'iOS 7 style aspect givré avec HTML5, CSS3 et JavaScript, qui peut fonctionner sur les navigateurs webkit.
Techniquement, vu le code HTML suivant:
<style>
#partial-overlay {
width: 100%;
height: 20px;
background: rgba(255, 255, 255, .2); /* TODO frost */
position: fixed;
top: 0;
left: 0;
}
</style>
<div id="main-view">
<div style="width: 50px; height: 50px; background: #f00"></div>
To my left is a red box<br>
Now there is just text<br>
Text that goes on for a few pixels <br>
or even more
</div>
<div id="partial-overlay">
Here is some content
</div>
Je veux faire quelque chose comme un -webkit-filter: blur(5px)
pour la première 20px horizontalement de #main-view
.
Si le CSS a été modifié pour être #partial-overlay { width: 20px; height: 100%; ...}
puis j'avais besoin d'appliquer la -webkit-filter: blur(5px)
pour la première 20px verticalement.
La solution la plus évidente consiste à utiliser javascript pour faire un clone de la #main-view
, ensemble overflow: hidden
et ensuite modifier la largeur/hauteur le cas échéant, mais qui me semble difficile de généraliser à des pages plus complexes/CSS structures.
Est-il une meilleure façon d'atteindre cet objectif avec un minimum de performances et maximale de la généralisabilité?
MODIFIER: Voici un exemple de ce que je suis en train de réaliser:
- CSS est un tout ou rien". Vous ne pouvez pas appliquer une propriété à un arbitraire de la partie. Le plus proche que vous pouvez obtenir à "seule la première 20px" est à l'aide de la
:first-line
pseudo-élément. - voir l'ouvrage "la solution la plus évidente"
- Pourriez-vous montrer un exemple d'image de ce que vous cherchez à faire? Si j'ai lu la question correctement, vous pouvez essayer d'utiliser les multiples origines de la capacité de css pour atteindre cet objectif. EDIT: aussi, voici un JSFIDDLE de son exemple pour quelqu'un qui est en répondant à cette et que vous souhaitez tester: jsfiddle.net/c6Lwf
- cela vous aide?
- juste essayé et
webkit-filter: blur
ne semble pas fonctionner avecfirst-line
, ressemble à seulement certains styles sont autorisés pour cette pseudo classe - Regardez ces sites: davidwalsh.name/demo/css-filters.php & css-tricks.com/fun-with-blurred-text
- J'étais à la recherche sur l'Apple page d'accueil et de contrôle sur la façon dont ils ont créé cette partielle effet de flou. Il s'avère qu'ils ont utilisé des images pour cette. Je suppose qu'il n'y a pas de moyen simple de faire cela et de votre suggestion dans la question, la seule voie viable pour parvenir à cet effet. Il est possible de généraliser en faisant des calculs à partir de la superposition de div, mais il y aura certainement un gain de performance.
- aaron, j'ai changé le mien, il semble maintenant beaucoup plus comme l'image a montré
- Ne pas
box-shadow
aider ?
Vous devez vous connecter pour publier un commentaire.
Merci pour l'inspiration... Il m'a conduit à cette toile plugin qui fait le tour
Nouveaux et Améliorés: -webkit - et Firefox de Travail Exemple, maintenant re-extensible/liquide.
JS
CSS
HTML
Je l'ai mis dans une fonction de clic, parce que j'ai pensé qu'il serait le plus susceptible de cas d'utilisation. Il fonctionnera tout aussi bien sur le document de prêt.
Bien que la toile de la représentation ne sera pas de pixel parfait, je ne le pense pas vraiment d'importance dans la plupart des cas en raison de son flou.
Mise à jour: Comme l'a demandé c'est maintenant re-extensible. J'ai aussi déplacé le couvercle div dans le JS et a ajouté une svg tomber en arrière pour Firefox. Le redimensionnement exige de la toile afin d'être redessiné à chaque re-taille, alors je l'ai mis en place pour masquer la toile, de superposition, etc alors que vous êtes de redimensionnement et de le remplacer lors de la re-taille s'arrête.
Fondamentalement, vous pourriez avoir une superposition de l'espace réservé où vous dupliquer le contenu principal et de synchroniser le défilement des deux divs, que d'appliquer le style css filtre de flou sur la superposition seulement.
Un simple javascript n':
Et pour le CSS:
J'ai mis en place un exemple de travail pour vous (webkit uniquement):
http://jsfiddle.net/kmxD3/1/
Amusez-vous! 🙂
La réponse à cette question est pas.
La raison en est que, pour faire ce que vous voulez, vous auriez besoin d'un accès direct à l'image utilisé pour la fenêtre du navigateur pour extraire ou de manipuler les pixels dans la zone que vous souhaitez flou (je le souhaite, "aero" dans un navigateur pourrait look très soigné..) ou un filtre qui fonctionne sur les éléments derrière celui de l'appliquer à un (ou peut avoir une limitation de la région définie à elle).
Comme il n'y a pas de support natif pour ce faire (en plus de la toile et l'extension de l'API, ou une bibliothèque qui génèrent des canevas de l'image de l'html -> relativement lent), cela devra être fait avec la ruse (images, de la scission de la vrd, etc.) dans les deux cas.
Si vous avez fait tout en votre page sur une toile, vous pourriez faire beaucoup de choses intéressantes, mais vous aussi, vous avez besoin pour effectuer la mise en page, mise à jour, filtrage, etc. vous-mêmes et à cet effet, vous seriez de retour pas non optimisé que le Javascript est plus lent que le natif (pour ne pas mentionner qu'il serait susceptible d'erreurs).
Jusqu'à ce que des navigateurs vous permettent de saisir une partie de la fenêtre comme une toile (jamais? en tant que nécessiterait tout sur la page pour en être de même origine ou ont contenu spéciaux accepter les en-têtes set) il n'y a pas moyen de contourner, mais pour faire des tours.
Mise à jour
Comme une démonstration que vous pouvez le faire en utilisant html2canvas etc, mais d'avoir à utiliser des compromis (-> ralentissement des performances) - la démo est rude, expérimentaux et les besoins des réglages fonctionne bien, mais pour des raisons de démonstration seulement:
http://jsfiddle.net/AbdiasSoftware/RCaLR/
Résultat:
Fonction généralisée à saisir une partie de l'arrière-plan:
Obtenir une partie de la fenêtre à l'aide de html2canvas:
Le contenu:
Récemment, une nouvelle
-webkit-backdrop-filter
. C'est actuellement pris en charge dans Safari 9.0, et Chrome derrière un drapeau.Démo:
CSS:
HTML:
Support droit à maintenant, Safari. Chrome et Opera ont cette vertu d'un drapeau.
Remarque: aujourd'Hui
-webkit-backdrop-filter
n'ai toujours pas un grand soutien pour l'instant, si vous voulez obtenir cet effet, le meilleur moyen est d'utiliser le format SVG estfeGaussianBlur
http://thiv.net/frost
De l'échantillon vivent de ce que j'ai fait ( et mis à jour pour ressembler à l'image ci-dessus )
Code:
Je l'ai fait regarder d'un peu plus jolie qu'elle ne doit l'être, mais Ça marche!!!
J'ai fait un peu de css-trick sans
backdrop-filter
parce que chrome ne supporte pas par défautMon code d'origine avec sass: https://codepen.io/mixal_bl4/pen/EwPMWo
JS:
CSS:
HTML:
Malheureusement, il n'ya pas de bonne façon de le faire, comme vous l'avez compris, vous aurez besoin d'une copie de la div principale:
Superposition de pousser l'enveloppe de largeur tout autour, principal-copie sera avec en arrière plan flou. Il n'y aura évidemment des problèmes de performance si le contenu en main-copie est complexe.
Il est encore très limitée suport (uniquement avec Firefox), mais une manière d'obtenir ce pouvait être:
Firefox uniquement démo
Le CSS est assez simple:
et la clé est à utiliser comme arrière-plan pour une partie de la superposition de la main-elément de vue.
Cette démo utilise uniquement l'opacité comme les filtres ne sont pas disponibles pour Firefox.
L'élément de propriété pour l'arrière-plan a été approuvé par le w3c, de sorte qu'il pourrait montrer à l'avenir dans webkit
Dans la démo partielle de superposition a été de décalage vers la droite pour rendre plus clair ce qui est ce que
html2canvas
.