This is kind of a FAQ for web design, offering solutions to issues that come up frequently.
img
element in a link?position: fixed
work in IE 6?img
elements have a gap below them (or above)line-height
valuesvertical-align
doesn't do what I expectz-index
doesn't do anythingAssuming a typical functional setup, no. PHP and ASP are server-side scripting languages, meaning the code is only read and processed on the server computer, which then sends separate output to the user. Unless you have a broken setup or deliberately add a means to, the user has no way of seeing the code beyond the outputted results that you see in the View Source window.
It depends on what that something is. To horizontally center text, use text-align: center;
. To horizontally center a block
element within its container, give the element margin: 0 auto;
. Note that if the width
of the block
element is 100%
or auto
(default), horizontally centering it within its container will have no visible effect.
Elements with position: absolute;
are positioned relative to the nearest ancestor with a position
other than static
(default), or the document boundaries if none exists. Therefore, if you want an element to have an absolute position relative to its container, simply give the container a position
. Usually, a simple position: relative;
on the container is what you want. Here is an example: (See result)
<div style="background: #00f; height: 300px; position: relative;
">
<div style="background: #0f0; height: 100px; width: 100px; position: absolute; top: 50px; left: 50px;
">Test</div>
</div>
Most major browsers have a default style similar to a:link img, a:visited img {border: 2px solid;}
. To remove this effect, simply add to your stylesheet a:link img, a:visited img {border: 0;}
.
Internet Explorer 6 and below don't support position: fixed
. But you can pull off the same effect by using absolute positioning and some overflow
magic. Here is this method:
body
and stick it into a single div
.margin
and padding
on the html
and body
elements. You can put padding
on the div
if you want.div
, body
, and html
elements height: 100%
.div
overflow: auto
and give the body
overflow: hidden
.body
, next to the div
. Position it how you want, but instead of using position: fixed
, use position: absolute
.That's it! Here is a working example.
First of all, it isn't stealing, it's at best copyright infringement. Second, you can't. HTML, CSS, and ECMAScript (JavaScript) all must be interpretted by software on the user's computer in order to function. Therefore, the user's computer necessarily has full access to your source. There are obfuscation techniques and other ways to attempt to make it difficult for the user to understand the source, but there are also relatively convenient ways for the user to cut through that deliberate clutter if he or she has some basic knowledge in the area. Tricks like code obfuscation and disabling the context menu don't work for the types of users they are most likely designed to stop, and you are probably just wasting your time.
Internet Explorer 7 and below don't correctly support PNG gamma correction, as can be seen in this test case. It is most likely that whatever you used to save the PNG image saved it with gamma correction information. Adobe Photoshop does this naturally.
The solution is to reopen the file in a program that allows you to remove the gamma correction information and save it with the information removed. GIMP is a free tool that can do this, among other things.
Assuming it is linked properly (<link href="uri" rel="stylesheet" type="text/css">
) and your HTML and CSS are valid, it could be that your server is sending the wrong content type. View the CSS file in Firefox, right-click on the page, and click on “View Page Info”. If the value for Type is text/plain
, text/html
, or anything other than text/css
, that is your problem: your website is sending the wrong Content-type
header. The type
attribute alone doesn't convince the browser that it's text/css
if the CSS file itself is sent as something different.
If you are using a server-side scripting language like PHP to generate your CSS, you must manually send the correct content type. In PHP, this is done by putting header('Content-type: text/css');
before any of the output.
Otherwise, if you're using the .css
extension, you have to set up your server to send .css
files as text/css
. If your web server is Apache, you may be able to do this using an .htaccess
file or, if you are the system administrator on the web server, by modifying the core configuration files (recommended). See the documentation of your server software for details.
Internet Explorer is known to sometimes ignore the Content-type
header if it thinks it can guess the correct type. It should be noted that this is not always ideal, since websites may want to deliberately send a file with an unusual Content-type
in certain cases.
img
elements are inline
by default, meaning they are part of the normal flow of text. Just like multiple lines of text will have a vertical gap between them, img
elements on separate lines will also have a vertical gap. An img
alone in a tight container will also show a gap between the img
and the edge of the container.
The solution is to make the img
element display like a block
. Add this to your CSS stylesheet:
img
{
display: block;
}
In certain doctype switching modes, the browser may make an img
element display as a block
by default depending on what it's inside. This has led some to additional confusion.
Please see the My site doesn't work in x browser article.
This issue is for if you have something like the following setup:
<div>
<img src="img1.png" alt="Image 1">
<img src="img2.png" alt="Image 2">
<img src="img3.png" alt="Image 3">
</div>
The three images will be on the same line (assuming your container is big enough), but you may notice there is a gap between them. This is because you have whitespace between your tags. It is the equivalent to the following:
<div> <img src="img1.png" alt="Image 1"> <img src="img2.png" alt="Image 2"> <img src="img3.png" alt="Image 3"> </div>
Even if you didn't use indentation, the line breaks also count as whitespace and appear as a normal space.
The solution is to remove the whitespace between tags. This could be done either by putting all of the elements on the same line of text with no space between, or moving the whitespace to inside the tags. For example, the following would eliminate the whitespace:
<div>
<img src="img1.png" alt="Image 1"
><img src="img2.png" alt="Image 2"
><img src="img3.png" alt="Image 3">
</div>
Note that any whitespace at the beginning or end of a block element's contents is usually ignored (except with certain values for the white-space
property). As a result, there is no gap before the first element or after the last element in the above example.
The line-height
property accepts numeric (unitless) values in CSS 2.x, but sometimes the W3C CSS validator returns a parse error on these values. This is actually a known bug in the validator that has gone unfixed for quite some time. It occurs when the value is a simple integer. For example, the validator gets confused on line-height: 1;
. The solution is to add a decimal to the value. The validator will correctly recognize line-height: 1.0;
as being valid.
The vertical-align
property only applies to inline
and table-cell
elements. For inline
elements, it determines how the text is vertically positioned just within the line of text. For table-cell
elements, it determines how the entire contents of the element are vertically positioned within the table cell.
Many people want to use the vertical-align
property on block
elements to achieve the same effect as on table-cell
elements, but it has no effect. To pull it off, you would theoretically give the element display: table-cell;
and then the vertical-align
property, but Internet Explorer 7 and below don't support it.
There are other alternatives, but they all have limitations.
Assuming that the container doesn't depend on the height of the contents, you can use absolute positioning to pull off some vertical alignment. Here is an example of a block
element being positioned to the bottom of its container: (See result)
<div style="background: #00f; height: 300px; position: relative;
">
<div style="background: #0f0; position: absolute; bottom: 0;
">Test</div>
</div>
To center the block vertically, it depends on an additional factor: the height of the contents must be known. The trick then is to position the top of the child element halfway down the container and then use a negative margin to shift it up half the height of itself. Unfortunately, a percentage doesn't work as may be expected for the negative margin, do it must be an absolute length unit based on the known height of the child element. Here is an example: (See result)
<div style="background: #00f; height: 300px; position: relative;
">
<div style="background: #0f0; height: 100px; position: absolute; top: 50%; margin-top: -50px;
">Test</div>
</div>
The above technique only vertically centers the element; the text content is still at the top of that element. Unfortunately, there is no sure-fire way to get arbitrary text vertically centered without browser support for display: table-cell;
. If you happen to know that your text will only be on one line (for example, if you have a single word or white-space: nowrap;
and no deliberate line breaks), you can do the following: (See result)
<div style="background:#00f; line-height: 100px;
"><span style="vertical-align: middle;
">Test</span></div>
That will give you a single line of text that is 100 pixels tall and then vertically center the text within that line.
Firefox supports it, but it's disabled by default for security and usability reasons. The option is available in the Options / Preferences dialog. Your website shouldn't rely on techniques to modify the user's browsing interface, since many people rely on things like the statusbar for their original purposes.
The z-index
property only works on positioned elements. If you give it a position
other than static
, it will work as expected.