marinettiCSS
An act of artistic “forgery”
Art is a lie that makes us realize the truth.
—Pablo Picasso
One of the surest tests is the way in which a poet borrows. Immature poets imitate; mature poets steal; bad poets deface what they take, and good poets make it into something better, or at least something different. The good poet welds his theft into a whole of feeling which is unique, utterly different than that from which it is torn; the bad poet throws it into something which has no cohesion. A good poet will usually borrow from authors remote in time, or alien in language, or diverse in interest.
—T. S. Eliot
Deceit or double take? Larceny or license? The art world is rife with what at first glance appears to be little more than thievery, plagiarism, lies, and stunts. What separates an artist appropriating an image from a student caught in the act of plagiarism? In a word: intent. The plagiarizing student wishes to pass others’ work off as their own. The appropriating artist wishes to reveal a new way of seeing things that have become so familiar that we have come to take them for granted.
Several people have employed acts of forgery as an artistic expression. Notable within this genre are the museum hoaxes of Banksy, discussed in this NY Times article, and with images in this NYT slideshow which borrows from an original post in a now-broken blog post at Wooster Collective. Notice how his work follows the conventions of museum painting and framing, which is why some of his museum hoaxes lasted for days without being noticed even by museum workers! So: what is authentically art?
Bansky “installation” at the Met, 2005
J. S. G. Boggs, $1 FUNback, 1998
The artist J. S. G. Boggs forged a pretty common one: money. He doesn’t sell his work — he spends it, informing the recipient of his Boggs bill of its nature before consummating a transaction. He therefore is not a counterfeiter, as his bills do not replicate so much as resemble money, and he doesn’t try to pass it off as real. And the lucky recipient of Boggs’ money resells it on the art market for vastly more than the face value. So: what is authentically money?
This exercise is informed by such a strategy. Using a famous work of typographic innovation below, we’ll attempt a CSS “forgery” of the same. Is it possible for code to replicate typesetting?
Marinetti in Typeset
Filippo Tommaso Marinetti was equal parts politician and artist. He was one of the founders of Italian Futurism, an artistic movement that celebrated the dynamism of the machine age. Alas, the Futurists allied themselves with Italian Fascism. Sharing a vision of a new Italy, Marinetti and dictator Benito Mussolini became collaborators. Marinetti hoped Futurism would become the official art of the Fascist state — a status Mussolini was not interested in bestowing. Nevertheless, unlike the Nazi regime, Fascism did not reject modernist movements like Futurism.
While there is no excuse for Marinetti’s opportunistic alliance with a morally bankrupt and nihilistic political party, from a strictly formal standpoint art historians recognize his typography as an innovation that changed the course of fine art and graphic design around the world, far beyond the ideological confines of Fascism.
Take a look at this “stanza” from the poem Dunes by Marinetti. He revered machines and motion, and the physical act of typesetting and the dynamic action of the printing press inspired the formatting of his poetry. Variously in French and Italian, Marinetti called his typographic experiments les mots en liberté or parole in libertá (words-in-freedom). Despite his nationalist politics, he worked for a French newspaper as a war correspondent and wrote a version of this poem in French:
The Italian version of Dune was published on 15 February 1914 in Lacerba, an Italian literary journal. The poem begins on the third page. We find the Italian version of the “stanza” at the top of page 5:
And if we wonder how such a poem might sound, Marinetti demonstrates the auditory impact of his words-in-freedom aesthetic in a recording that is equal parts reading aloud and performance art.
Marinetti in CSS
We took the French version of the Marinetti poem above and, using CSS, set the text of the poem in a manner that reflects the content.
After “typesetting” it in CSS, we styled colors of faded ink and aged paper that drew inspiration from the Lacerba publication.
Transforms in CSS
A particularly fun MDN Web Docs section covers a special case of code known as a transform. Transforms can scale, rotate, skew, or translate elements, and are supported in modern browsers. Transforms are even animatable!
The sandbox at the link above allows you to play with transforms and copy the code. Another sandbox is found at w3schools.com, and another that allows you to animate is at westciv.com.
In our CSS setting of the Marinetti poem, we’ll be focusing on transform: scale and transform: rotate to help us achieve our “forgery.”
Setting Marinetti
Your task will be to use line spacing, word spacing, font family, font-size, margin, transform rotation and scaling, color, and other attributes to make your CSS version look like the original, to generate a CSS setting of the text as similar to the typesetting as you can create. In short, you are attempting to create a forgery.
Step 0: Analyze and prepare the poem image
Finding main sections
In a sketch, we broke down the visual elements and hierarchy, finding attributes and formats common and/or unique to each element. We thought about visualizing different “zones” of content that might translate into divs or spans, as in this sketch:
We came up with four main zones that would host primary and secondary divs:
- mouv, named after the first part of the “mouvement …” text.
- upper bordered area, which contains vent, named after the “vent” text, and nega, after the “negateur …” block.
- Inside nega, we find two elements: a big curly brace and the text.
- lower bordered area, which contains sang, after “sang” of course, and affi, after the “affirmateur …” block.
- Inside affi, two elements: a stack of a brace with rules, and the text.
- kara, named after the first part of the rotated “karazouc …” text.
There will of course be other divs, but this gives us the basis to generate a structure.
Sizing the image
We will “trace” the poem image to create, size, and place those divs, so we want the image to be a logical size. In our build, we will use pixels as a unit of measure — px. So we’ve cropped and obtained a pixel dimension for the image in Photoshop, thusly:
- Width: 330 px
- Height: 510 px
YOUR TURN: Try your hand at developing a scheme and cropping the image, or feel free to use ours.
Step 1: Creating the basic HTML structure
Our first move is to develop the basic structure in HTML, attaching an external CSS file and placing a background image to “trace” the poem. See our results here:
-
Embed
-
HTML
-
CSS
<!doctype html> <!-- STEP 1 OF MARINETTI.HTML: BASIC STRUCTURE, ATTACH CSS, SET CENTERED TRACING IMAGE AS BACKGROUND --> <html> <head><!-- INDENT AND SPACE LINES FOR HUMAN LEGIBILITY --> <meta charset="UTF-8"> <title>Excerpt from Dunes by F.T. Marinetti</title><!-- PROVIDE A TITLE --> <link href="css/marinetti.css" rel="stylesheet" type="text/css" /><!--GENERATE CSS LINK WITH PAGE PROPERTIES: HTML: CLASS: ATTACH STYLE SHEET... --> <!-- GENERATE STYLE WITH PAGE PROPERTIES: APPEARANCE (CSS) AND SELECT BACKGROUND IMAGE WITH NO-REPEAT--> <style type="text/css"> /* TO SHOW AND HIDE BACKGROUND FOR TRACING, USE A CSS COMMENT START BEFORE background-image - KEEP END COMMENT TO EASE SWITCH */ body { background-image: url(images/Marinetti-Dunes_1914.jpg); background-position: center; background-attachment: fixed; background-repeat: no-repeat; */ }/* ADD background-position AND background-attachment BY HAND FOR CENTERING */ </style> </head> <body> </body> </html>
@charset "UTF-8"; /* STEP 1 OF MARINETTI.CSS: NOTHING TO SEE HERE YET! */ /* CSS Document */
Notice the code is liberally commented to help you understand the process. In the steps that follow, we suggest visiting the steps at each link and inspecting the code directly in a browser window (in Chrome, we use right-click to access View Page Source in the contextual dropdown menu, and other browsers have similar functionality). For the sake of brevity in the remaining steps, we won’t show the code in its entirety as we did above, but we will unpack examples and case studies.
Attaching CSS
We set up a directory with two files, marinetti.html and marinetti.css. The CSS file was placed in a sub-directory named css. Note in the comments the suggestion to generate the link to the external CSS file in Dreamweaver by using the Page Properties in the HTML tab, and finding the Class button to access Attach Style Sheet… in a dropdown menu. We’ll follow this kind of commenting convention in the source code throughout future steps.
We also provide a <title>
for the page: Excerpt from Dunes by F.T. Marinetti.
Tracing a background image
We use a background image to “trace” the poem. Defining the background image occurs as a style applied to the body
tag. The quickest way to generate this is through the Page Properties palette, under the Appearance (CSS) tab. Select the Background image there, checking on No-repeat. This generates the code:
<style type="text/css">
body {
background-image: url(images/Marinetti-Dunes_1914.jpg);
background-repeat: no-repeat;
</style>
We want our background to stay centered, no matter the size of the browser window or device. To achieve that, we add the following:
background-position: center;
background-attachment: fixed;
We place it in the code as follows:
<style type="text/css">
body {
background-image: url(images/Marinetti-Dunes_1914.jpg);
background-position: center;
background-attachment: fixed;
background-repeat: no-repeat;
</style>
Note also a comment instruction to show and hide the background image for tracing by using the start of a CSS comment — /*
— just before the background-image: url...
property. We keep the end comment — */
—after the background-repeat: no-repeat;
property. This makes it very quick to hide and reveal the background image for tracing (don’t, by the way, bother with the Tracing function you might see in the Page Properties dialog box — it ain’t so great). Practice commenting on this block of code, turning it off and on, as you’ll be doing this a lot in the building of this work!
YOUR TURN: Build a basic structure as described above. You may copy and paste from our code, but do this step by step so you can see the progress of the work evolve. The comments in the source code will help you do this.
Step 2: Create, position, and size primary divs with ruled borders
To prepare for real content, we’re going to define the ruled borders that divide our mouv, upper, lower, and kara sections. Take a look at the site:
We used this process to build the source code you see on the site:
- First, we used semantic HTML to provide a poem structure:
<body>
<container>
<main>
</main>
</container>
</body>
- The
<main>
tag is positioned using internal CSS. Note it is sized to be the same pixel dimensions as the background image. - Also note the presence of a
relative
value for theposition
, allowing<main>
to move along with the background. - There’s also background color applied here. More about that later!
main {
position: relative;
height: 510px;
width: 330px;
background: #33333320;
}
- Next, inside
<main>
, we’ll add a bunch of<div>
tags correlating to each section we analyzed. - Notice the comments (abbreviated here: commenting is more robust in the actual source code!). These help us understand there are four main sections: MOUV, UPPER, LOWER, and KARA.
- UPPER contains the nested
<div>
tags for the sub-sections VENT and NEGA. - LOWER contains the nested
<div>
tags for the sub-sections SANG and AFFI. - Note the tabbing that helps us understand the nesting relationships!
- Finally here, note the presence of placeholder text — *NAME — to help us identify the divs visually, as well as where actual content will be placed. UPPER and LOWER will not receive content: their sub-sections will.
<main>
<!-- MOUV -->
<div>
*MOUV
</div>
<!-- UPPER -->
<div>
<div>
*VENT
</div>
<div>
*NEGA
</div>
</div>
<!-- LOWER -->
<div>
<div>
*SANG
</div>
<div>
*AFFI
</div>
</div>
<!-- KARA -->
<div>
*KARA
</div>
</main>
IDs versus classes
If you’re building a file along with this, you may notice in Dreamweaver that the <div>
tags just stack on one another inside <main>
. How do we size and position them, and how do we provide ruled borders where we see them in the poem?
This is where the distinction between IDs and classes becomes very useful. Recall that an ID is a unique identifier: that is, you can only use it one time in a file. A class, on the other hand, is reusable within a page, and among many pages if needed. So what kind of styling is best to invoke with which? As a general rule, with some minor exceptions, we do the following here:
UNIQUE:
IDs, internal CSS
- Positioning of a div
- Size of a div
- Margin or padding
- Line or letter spacing
GENERAL:
Classes, external CSS
- Page and text-centering
- Border styling
- Font assignments
- Transforms
Sizing and placing divs with IDs
In this step, we’re concerned with sizes and locations. Each <div>
is uniquely sized and positioned using an #id
found in the internal CSS for the page. We’ll use the code for LOWER as an example here.
- Unlike
main
above, allposition
values areabsolute
for everyid
. This means they won’t shift about withinmain
. - If needed, a
top
and aleft
will create a fixed coordinate withinmain
for eachid
. Not everyid
will need this! Note which do and which don’t in the source code. - In all cases, each
id
will have a uniquewidth
andheight
value based on tracing the background image.
#lower {
position: absolute;
top: 305px;
left: 86px;
width: 200px;
height: 204px;
}
.......
<div id="lower"> ...
</div>
Styling ruled borders with classes
Several divs can be styled to define the ruled borders we see holding the middle sections of the poem. MOUV, UPPER, LOWER, and KARA each contain such a border. These borders may be useful in another context: for example, if we were setting a bunch of Marinetti poems that contained such borders, they could be reused. So we used classes and made them available externally. Again, using LOWER as our example:
- Since its properties may be generally useful, we don’t want a class name that suggests its association with LOWER. Instead, we used a descriptor that’s clear enough to be understood but not so long as to make it difficult to write or bloat the code. Here, we used
noBorderBottom
. - Note we defined the right, top, and left as containing a 1-pixel solid border. Note the pattern for each border defined in the source code at the site.
- We applied the class to LOWER back in the HTML file:
.noBorderBottom {
border-right-width: 1px;
border-top-width: 1px;
border-left-width: 1px;
border-right-style: solid;
border-top-style: solid;
border-left-style: solid;
}
.......
<div id="lower" class="noBorderBottom"> ...
</div>
Temporary background colors
In many instances in the source code, you’ll see a transparent gray color applied to each <div>
that will receive content. We did this as a temporary measure, to allow us to see the sizes of the divs as they align with the background image. Later, when we were satisfied that the divs were defined correctly, we deleted the background color. LOWER had no color because it has a border and otherwise no content. So we’ll use one of its children, SANG, as our case study:
- The background is defined as a hexadecimal color with transparency. This convention simply adds 2 digits to the end of a regular #RRGGBB value set.
- In our build, we use #333333 as a light gray and add 20 to indicate 20% opacity:
#sang {
position: absolute;
width: 58px;
height: 204px;
background: #33333320;
}
We’ll see other instances of background colors used as a visual aid in future steps.
YOUR TURN: Build a basic semantic HTML structure as described above, and fill it with appropriate divs. For each div, create IDs and classes as described. You may copy and paste from our code, but do this ONE BY ONE with each div so you can see the progress. It’s a good idea to play with the numerical values for various properties to see how this affects size and placement but restore these experiments with the values from our code that work. Comments in the source code will assist you.
Step 3: Adding unformatted content with secondary divs
This step is a fairly straightforward insertion of the poem text.
The text, seen below, is written out completely unformatted for you to copy and paste into the HTML document:
mouvement de 2 pistons
vent { négateur paresse inertie geler tout par des ètoiles littéraires deracinées de la chair (nuit livresque) enterrer tout avec odeur d’aisselles matelas de parfums seins cuits dans le plaisir + 7000 raisonnement sceptiques
sang |{| affirmateur optimisme force repousser le vent-pessimiste-chaud-ou-froid aller sans but pour faire vivre courir etre
karazouc-zouc-zouc
nadi-nadi-aaaaaaaaaaaaaaaaaa
See how the content changes when stripped of form? By the way, if you’re curious about the meaning and can’t read French, copy and paste it into Google Translate.
- The secret sauce here was not just to paste the content into the existing labeled divs, but to place it in a nesting div in every case.
- Using SANG as a case study again, a typical switch-out is shown in red:
<div id="sang">
*SANG
</div>
… turns into this:
<div id="sang">
<div>
sang
</div>
</div>
At the site, once the text is inserted, you can see the content beginning to organize itself. It’s somewhat orderly, even if it’s not yet too expressive. You might be troubled about what’s happening in KARA, but it will iron itself out soon enough!
YOUR TURN: Copy and paste the poem text into the appropriate areas, making sure each is wrapped in its own nested div as illustrated. You may copy and paste from the source code, but as always, do so ONE BY ONE to watch it grow!
Step 4: Justifying content
Our first bit of real text styling involves a good bit of justification. See the file and source code here:
- Each
<div>
with text inside got a unique id for size and position. With text, the names follow a convention like#nameText
, with the name usually being the name of the parent div. An example using SANG again:
- Note regarding the
margin-top property
here:90px
provided an approximate vertical position that we refined later with font and font size assignments. CSS can be rather tweaky!
#sangText {
position: absolute;
width: 58px;
margin-top: 90px;
background: #33333320;
}
.......
<div id="sang">
<div id="sangText">
sang
</div>
</div>
- In the case of MOUV, VENT, SANG, and all the brace divs, we’ve applied a class we called
.centertext
as a reusable snippet in external CSS. - SANG again provides the sample:
.centerText {
display: flex;
align-items: center;
text-align: center;
justify-content: center;
}
.......
<div id="sangText" class="centerText">
sang
</div>
- In the case of NEGA, AFFI, and KARA, each one stayed at a default left-justified for the time being, even though we can see that NEGA and AFFI are (mostly) forced justified (stretching from margin to margin), and KARA is eventually right justified. Each did, however, receive a class:
basicStyle
, which consisted only of thefont-size
property for the time being. - In NEGA and AFFI, the text was broken into separate lines with a line break
<br />
to enforce justification. - Hyphens ( – ) are introduced wherever the poem performs a word-wrap. Note carefully some of the text already comes with hyphens!
- AFFI provides the case study:
.basicStyle {
font-size: 14px;
}
.......
<div id="affiText" class="basicStyle">
affirmateur<br />
optimisme force<br />
repousser le vent-<br />
pessimiste-chaud-<br />
ou-froid<br />
aller sans but<br />
pour faire vi-<br />
vre courir<br />
etre
</div>
Note the use of some new background colors among the braces and in KARA. These consist of even more deeply nested divs, and to keep things straight, gray just won’t cut it anymore! So we have a red, green, and blue scheme to help us map these divs.
YOUR TURN: Develop IDs and classes as described above and attach them to appropriate divs. Copy and paste, if desired, and do so ONE BY ONE if you wish to see it evolve.
Step 5: Adding and sizing typefaces
We got deep in the weeds trying to find the right fonts to match some of these turn-of-the-last-century French Art Nouveau-inspired fonts. This can take some time!
To make sure the client browser displays our work correctly, we relied on hosting fonts right in our directory. We created a fonts folder and placed each font family in its own folder, to allow Dreamweaver to attach the font in external CSS.
You can see it took an astounding eight fonts to properly (or at least closely) represent the typography of the original!
Searching for fonts
Where did these fonts come from? There are millions to choose from, some with very restrictive licensing and a hefty price. For our build, we limited our selections to those for which we could find a license to host at no cost. This does limit the field considerably, but there are still thousands!
Google Fonts
One of the best places to find free-license fonts is Google Fonts. With Google Fonts, you have the option of downloading and self-hosting (which we did), or calling the font externally from Google’s servers. That can save you some space, but it can also affect performance a bit, so there are tradeoffs. We selected these Google Fonts to download and host:
- EB Garamond Variable | A variable-width font allows you to host one file that can be styled using variable weights (expressed as 100 – 900 from thin to bold). Used as a default.
- EB Garamond Extra Bold | This is a static (fixed-width) font from the same download, one that is bolder than the 900 above. Used as a default bold.
- Roboto | Used as the sans-serif for NADI.
Searching with IdentiFont
Font finding is a needle-in-a-haystack proposition. Fortunately, there are helper sites that can assist. Many are using AI to assist with images of text styled with an unknown font, which you can upload. One of the best is IdentiFont.com with a wide array of tools.
We found the following using Identi-Font, then sought out free license hosting sites. In several instances, the free licenses limited use to commercial-free. This site is part of the gift economy, so we are free to use such licenses. A couple came with Creative Commons share-alike requirements, which we complied with (see the section on Licensing below).
Only seven? One font is missing from this list! We searched at the very end of the project for a special serif “T” as we see in VENT, so that gets added near the end.
Two from FontsGeek.com:
- Hadrianbold | Used as the tall sans-serif for MOUV.
- Century Condensed SSi | Used as tall all-caps for NEGA and AFFI.
One from XFonts.pro:
- Akkordeon Four | Used as the tall all-caps for VENT and SANG.
One from 1001Fonts.com:
- Wremena Light | Used for the curly braces at NEGA and AFFI.
- Fonts are “called” using a convention like the one seen here.
- The
url (".../fonts/etc.")
convention knows how to find fonts in the folder we named fonts in our directory. - We placed this in external CSS to avoid having to create font references in the HTML.
@font-face {
font-family: EB Garamond;
src: url( "../fonts/eb_garamond/EBGaramond-VariableFont_wght.ttf ");
}
CSS “typesetting” properties
If you’re coming at CSS from the standpoint of traditional typesetting, or even from digital typesetting in a program like Illustrator or InDesign, you’ll feel a bit lost getting used to the terminology in CSS. There is a font-kerning
property that uses the kerning data stored inside a font, but we didn’t use this in our build. We used letter-spacing
as the CSS equivalent of tracking. For leading, the space between baselines in traditional typographic terminology, CSS uses a property called line-height
.
For letter casing, CSS uses the text-transform
property. Its values include some that are easy to understand, like uppercase
and lowercase
and capitalize
. But if you’re looking for title case in CSS don’t bother. And, confusingly, if you want to create small caps, that’s a different property altogether: font-variant
with a value of small-caps
.
How all of these are applied in our build was context-dependent and involved a good bit of heuristic exploration. In some cases, the fonts we chose simply didn’t have the extreme proportions found in Marinetti’s type. Here’s one case study:
- For MOUV, we deduced the following code, which we wrote into external CSS as a class named mouvStyle, a naming convention we followed often for this step.
- Take a close look at each of the text styles you see in the external CSS file, making note of where you find variations on
letter-spacing
,line-height
,font-size
,text-transform
, and other properties.
.mouvStyle {
font-family: Hadrianbold Regular;
font-size: 31px;
line-height: 45.4px;
text-transform: uppercase;
}
Choose the height first!
In a few very conspicuous places — MOUV and the curly braces at NEGA and AFFI — it was impossible to get the height-width ratio correct. The chosen fonts, while narrow, were not narrow enough to emulate Marinetti’s typography. We found a way to correct that in the next step. The best idea for the time being was to set the heights correctly first, and let the widths fall where they may, even though they are a bit unsightly!
Another typesetting refinement applied here is a forced justify, which we mentioned earlier. It’s applied as a class called justifyText to the negaText and affiText divs. To help it, we add white-space: nowrap;
to the basicStyle
class.
YOUR TURN: Create font attachments and develop font style classes as seen in the sample file. Short-cut the length of your font search by using our recommendations above. Apply the classes as appropriate, copy-pasting them ONE BY ONE to observe the changes.
Step 6: Styling transform scale and rotate
Things start to take shape with the use of transform
in this step.
Non-uniform scaling: a forgivable type-crime?
We used a non-uniform scale to shrink the widths of MOUV text and braces at NEGA and AFFI. Now, some will rightly argue that non-uniform scaling is a type-crime. But in this context, we felt it was a forgivable sin. We’ll use the curly brace under NEGA as a sample:
- This curly brace is the largest on the page, and massively too wide. We set
font-size
to match the image height and tweakedmargin
settings. - Then we super-squeezed the horizontal
transform: scale
by a factor of 0.12-to-1. - We finished by naming the class
negaBracketStyle
and applying it to the nested div holding the curly brace:
.negaBracketStyle {
font-family: Wremena Light;
font-size: 330px;
margin-bottom: 5px;
margin-right: 3px;
transform: scale(0.12,1);
}
.......
<div id="negaBracket" class="centerText">
<div class="negaBracketStyle">
{
</div>
</div>
Rotating type
We needed to transform: rotate
the contents of KARA to orient it to the right-side div content in a final act of transformation.
- We wrote a class named
rotateStyle
with atransform
property set at -90 degreerotate
value. - Then we added it next to the
basicStyle
class assigned to the nested content div in KARA:
.rotateStyle {
transform: rotate(-90deg);
}
.......
<div id="kara" class="borderLeft">
<div class="basicStyle rotateStyle">
<div id="karaText" class="smallBoldStyle">
karazouc–zouc–zouc
</div>
<div id="nadiText" class="nadiStyle">
nadi–nadi–aaaaaaaaaaaaaaaaaa
</div>
</div>
</div>
YOUR TURN: Create transforms as per the sample site. Apply the classes as appropriate, copy-pasting them ONE BY ONE to observe the changes.
Step 7: Spans, inline styles, and colors
Almost done! One special div supported the addition of the distinctive serif “T” in VENT. One-off stylings that don’t justify the creation of a class were supported by spans, and we wrapped up the styling by creating ink and paper colors.
Most of our work here is tweaky but important refinement, starting with that outlier “T.” By now you might be pretty proficient at interpreting code: can you find the ID, class, new div, and font-face assigned to solve this? We will reveal at least this much: the eighth and final font for this is Imprimeur Classique EF found at OnlineWebFonts.com.
When is it OK to use inline styles?
Many of the changes here occur on the line-by-line tweaking in the text blocks in NEGA, AFFI, and KARA. Take some time to analyze what’s going on with the use of <spans>
and inline styles applied to them.
Why solve these using inline CSS? Don’t we try our best not to use it? As a general rule, one should avoid inline styling. However, for one-off instances of a line-height change here or there, it takes more code to write it up as a new class or ID, and then apply that to a tag. So, the rule of thumb we use is if the style…
- is shorter to write inline
- never repeats anywhere else
- doesn’t impede the legibility of content or code around it
… then it’s OK to indulge in a small amount of inline styling in your code.
Color: the finishing touch
Note the use of color to create an allusion to faded ink and aged paper as our final treatment!
- In the
body
CSS, we added the following. Thecolor
property applies to the text, while thebackground-color
property applies to the “paper”:
color: #1B191A;
background-color: #C5BCB0;
- The amazing secret recipe for the acidic paper border is a class
vignette
applied to thecontainer
tag:
.vignette {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-shadow: 0 0 100px rgba(153, 119, 85, 1.0) inset;
}
.......
<container class="vignette">
YOUR TURN: Create a “T” div and style it to match the serif in the poem image, then create spans and inline styles to bring all text into close alignment with the poem image. It’s a wrap with the development of the aged paper and ink effect!
Final step: licensing and publishing
Well, almost a wrap! In the final step, we define a Creative Commons license and upload the finished work to the server using SFTP.
Take a look at the source code for the licensing statement commented near the top of the page. It acknowledges the origin of the poem and recognizes it now resides in the public domain. It also applies a Creative Commons license, which some of our free fonts require us to do.
Once you’ve taken care of the legal bits, you can SFTP upload it to your server and enjoy the fruits of your labor live online!
If you’re interested in learning more about the work of Marinetti and the history of his poem Dunes, visit the PDF excerpt of Marinetti: Materiality and Sensation: Mechanical Synaesthesia.