2010-05-04 4 views
9

In ogni strumento di progettazione o principio d'arte di cui ho sentito parlare, le relazioni sono un tema centrale. Per relazioni intendo la cosa che puoi fare in Adobe Illustrator per specificare che l'altezza di una forma è uguale alla metà dell'altezza di un'altra. Non puoi esprimere queste informazioni in CSS. CSS hard-codes tutti i valori. Usando un linguaggio come LESS che consente alle variabili e all'aritmetica puoi avvicinarti alle relazioni ma è ancora una variante CSS.C'è un modo per mettere relazioni/contrapposizioni in CSS?

Questa incapacità nella mia mente è il problema più grande con i CSS. Il CSS dovrebbe essere un linguaggio che descrive la componente visiva di una pagina Web ma ignora relazioni e vincoli, idee che sono al centro dell'arte.

Quanto è possibile immaginare un nuovo linguaggio di progettazione Web in grado di esprimere relazioni e vincoli che possono essere implementati in JavaScript utilizzando le proprietà CSS correnti?

+0

Questo è un punto laterale, ma non penso che sia possibile farlo in Illustrator, o in effetti in qualsiasi altro strumento di progettazione che ho usato. Non è questo uso di variabili e aritmetiche per limitare dinamicamente gli elementi rilevanti solo per un mezzo come il web che consente all'utente finale di variare la dimensione della finestra e del testo? – e100

+0

Scusa, non penso di aver espresso abbastanza chiaramente quello che intendevo. Le variabili e l'aritmetica si applicano ai pre-processori CSS come LESS. In Adobe Illustrator non si specificano le relazioni utilizzando variabili o qualsiasi codice per quella materia. Puoi comunque associare una forma a un'altra in modo che se le ridimensioni come un gruppo, crescono/si restringono in modo tale che la relazione tra di esse non cambi. I CSS non hanno questa proprietà (quella di permettere di considerare forme più grandi costruite da forme più piccole che sono collegate da relazioni comprese). – hekevintran

risposta

1

Stai cercando qualcosa come CSS Scripting Layout Specification o Constraint Cascading Style Sheets for the Web? Entrambi sono ancora nella fase di ricerca/prototipo però.

La specifica di CSS Scripting Layout è stata implementata come un plug-in di Google Chrome, a quanto pare.

+0

Sì, queste sono descrizioni molto dettagliate di ciò che avevo in mente. Il lavoro su Constraint Cascading Style Sheets è brillante. È stato scritto nel 1999 e sfortunatamente non riesco a trovare un record di progressi da allora. È tecnicamente fattibile implementare un sistema simile in JavaScript nei browser attuali? O almeno il W3C sta prendendo in considerazione tali caratteristiche per una versione futura di CSS? – hekevintran

+0

Siamo spiacenti ma non posso rispondere a nessuna delle tue domande. Mi sono imbattuto nel documento del 1999 durante il mio lavoro, ma a quanto pare non ne è uscito molto. – Sebastian

+0

Uno degli autori di quel documento ha iniziato un progetto per implementare questo chiamato Fogli di stile della griglia: http://gss.github.io/ – hekevintran

0

C'era anche una specifica di fogli di stile JavaScript da Netscape nel 1996, http://en.wikipedia.org/wiki/JavaScript_Style_Sheets.

La specifica CSS Scripting Layout non è un plug-in di Chrome. Ciò che viene fornito è una dimostrazione del concetto. Molte persone non sono convinte che JavaScript possa funzionare abbastanza bene per il layout CSS a causa dell'implementazione CSS Expressions di Microsoft che ha avuto gravi problemi di prestazioni.

È limitato al layout in quanto questo sembra essere il più grande reclamo con CSS. Il suo scopo è dare agli utenti esperti la possibilità di fare quasi tutto ciò che vogliono, ma allo stesso tempo renderli tali che i layout possano essere incapsulati, referenziati e riutilizzati dagli utenti inesperti.

0

Direttamente, questo non è qualcosa che si può fare in puro CSS senza causare più problemi di aiuto a causa di quantità variabili di supporto da diversi browser.

Indirettamente, strutture come Meno o running your CSS through a server-side script prima di inviarlo al cliente sono la soluzione migliore ma, come hai detto tu, non sono l'ideale.

in JavaScript, utilizzando jQuery per impostare la propria height property elemento basato su un altro è outerHeight è probabilmente l'inizio di una soluzione decente, ma non riesco a trovare nessuna esempi di codice persone hanno scritto per risolvere il tuo problema specifico. Mi immagino che potrebbe essere qualcosa di simile, però:

var totalHeight = 1000; 
$("#div2").height(totalHeight - $("#div1").outerHeight()); 

che avrebbe stabilito l'altezza di una base all'altezza + confine + padding dell'altro. Per essere più robusti, c'è più che c'è bisogno di approfondire, ma è l'inizio di una soluzione.

+0

Mi piace questa idea. Sembra un buon inizio. La prima cosa che ritengo problematica è che usa un codice imperativo per esprimere un aspetto visivo. È come usare il codice imperativo per disegnare un'interfaccia utente in un'applicazione desktop. Un linguaggio dichiarativo che viene convertito in chiamate funzione jQuery come questo è probabilmente il passaggio 2. – hekevintran

+0

Forse scrivere un modulo jQuery che utilizza l'attributo [rel] per ottenere i dati di stile per gli elementi? Non sarebbe esattamente bello e distruggerebbe l'idea di separare il contenuto dalla presentazione, ma funzionerebbe e sarebbe comunque dichiarativo ... – ehdv

+0

Sì, come ho detto, è l'inizio di una soluzione, ma difficilmente completa.Forse un plugin jQuery sarebbe una buona soluzione completa, dove può guardare l'attributo rel o class di un elemento per una sintassi simile al codice che esprime come si relaziona agli elementi attorno ad esso in altezza, larghezza, colore, ecc. In questo modo niente Javascript deve essere scritto dallo sviluppatore esecutivo. Forse è una soluzione troppo ingegnerizzata, ma potrebbe avere molti usi se pienamente sviluppata. – JoshMock

0

Si consiglia di dare un'occhiata a Clever CSS, un approccio pitonico alla scrittura CSS. Include variabili, aritmetica, puoi persino fare operazioni sui colori.

Sto anche osservando uno di questi approcci agli stili di scrittura, qualcosa che è un livello superiore rispetto ai CSS. Ma uno dei grandi problemi, credo, sarà il fatto che i fogli di stile CSS sono spesso scritti da designer e non da programmatori, utilizzando strumenti di progettazione che probabilmente consentono loro di lavorare a un livello più alto e di generare successivamente il CSS. Quello che per noi programmatori potrebbe essere un buon approccio flessibile potrebbe non funzionare perché è troppo geek per i designer.

+0

BTW per layout elastici Ho usato un approccio basato su jQuery come suggerisce JoshMock. Continuo a non pensare che sia una buona soluzione perché è difficile esprimere in modo esplicito e leggibile le relazioni/i vincoli tra gli elementi –

+0

Clever CSS è molto simile a LESS o Sass. Questi linguaggi rendono sicuramente CSS più semplice, ma non codificano veramente le relazioni nello stesso modo in cui lo fa Adobe Illustrator. Mi piace l'approccio basato su jQuery suggerito da JoshMock, ma sono d'accordo con te sul fatto che non è una soluzione ideale non solo perché non è design-friendly ma anche perché descrivere le cose visive in codice imperativo è difficile. Penso che un interessante progetto open source sarebbe quello di progettare un linguaggio dichiarativo in grado di codificare le informazioni sulle relazioni, ma può anche essere analizzato e applicato da JavaScript nei browser correnti. – hekevintran

+0

In altre parole, sto pensando di scrivere una libreria JavaScript che sostituirà i motori CSS dei browser. Quindi, invece di affidarsi al browser per applicare le proprietà CSS utilizzando la cascata tradizionale, utilizzare un linguaggio dichiarativo in grado di esprimere correttamente relazioni e vincoli e convertirlo in proprietà CSS utilizzando il codice JavaScript. Le prestazioni e la compatibilità cross-browser saranno probabilmente problemi difficilmente risolvibili. – hekevintran

1

Se si impostano gli attributi di dimensione utilizzando una percentuale e si posiziona l'elemento come figlio di quello che si sta dimensionando, sarà possibile ridimensionare un elemento relativamente a un altro. Quindi, usa il posizionamento per spostare fisicamente il bambino al di fuori del genitore.

0

L'utilizzo di percentuali per determinare l'altezza è di esprimere una relazione con un valore hardcoded.

"se si impostano gli attributi di dimensione utilizzando una percentuale e si posiziona l'elemento come figlio di quello che si sta ridimensionando, sarà possibile ridimensionare un elemento relativamente a un altro" MA SOLO SE sono espresse le quote di elementi genitore esplicitamente (e questo applica iterando fino all'elemento html).

In CSS Livello 2 "La percentuale viene calcolata rispetto all'altezza del blocco contenitore della casella generata. Se l'altezza del blocco contenitore non è specificata esplicitamente (cioè dipende dall'altezza del contenuto), il valore viene interpretato come 'auto' ". Ma dalla Revisione 1 "le altezze percentuali sugli elementi posizionati in modo assoluto non sono più considerate come 'auto' quando l'altezza del blocco contenitore non è esplicitamente specificata."

Con il posizionamento assoluto questa soluzione si interrompe perché "Per gli elementi posizionati in modo assoluto il cui blocco contenitore è basato su un elemento a livello di blocco, la percentuale viene calcolata rispetto all'altezza della casella di riempimento di quell'elemento. CSS1, in cui la percentuale è sempre stata calcolata rispetto alla casella del contenuto dell'elemento padre. "

Nel seguente codice, le altezze div al wrapper interne si comprimono utilizzando il posizionamento assoluto, perdendo la possibilità di utilizzarle per posizionare i margini.

<body> 

<style type="text/css"> 
html, body { 
    height: 100%; 
} 

div#wrapper { 
    height: 100%; 
} 

div#content-wrap { 
    height: auto; 
} 

div#wrapper-upper-half { 
    height: 50%;  
    background-color:aqua; 
} 

div#wrapper-lower-half { 
    height: 50%;  
    background-color:fuchsia; 
} 

</style> 

<div id="wrapper"> 
    <div id="wrapper-upper-half"> 
    </div> 

    <div id="content"> 
    </div> 

    <div id="wrapper-lower-half"> 
    </div> 
</div> 

</body> 
Problemi correlati