Tom
Tom

Reputation: 12659

android autofit mode causing issues with css width in web page

I am having problems with the auto resize feature of the android browser. The widths on my site are going a bit haywire when the device is in portrait mode.

What I would like to do is

I currently have the following in my head

<meta name="viewport" content="width=1100">

I found the following blog post which describes my problem.

This is definitely caused by the auto-fit layout ("kLayoutFitColumnToScreen" in the Android WebKit source code). Just try the test with auto-fit disabled and everything is rendered correctly (at least on my Android device).

The auto-fit mode on Android seems to shrink certain elements' width without affecting their positioning, or the positioning of other elements. So if you have a containing block with width: 1000px and text that spans 100% of that width, the container may remain 1000px wide but the text inside it will wrap at the screen width.

http://www.quirksmode.org/blog/archives/2009/09/css_width_unrel.html

Is there a way to stop this autofit mode from kicking in? I don't want to disable zooming.

Update:

I am still searching for a solution if anyone knows of one.

Have found someone with the same problem (although they are using tables)

Spanned columns collapsing on Android web-browser (when using auto-fit pages)

http://code.google.com/p/android/issues/detail?id=22447&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

Upvotes: 18

Views: 15821

Answers (13)

zapplebee
zapplebee

Reputation: 23

By adding a background image to your css, auto-fit will be disabled.

Other posters have suggested adding a single pixel transparent background, but you can actually just add an empty background image to the top of your css stylesheet and skip the additional http request and redraw.

 div, p { 
 background-image: url();
 }

I have tested it in my emulator and my Galaxy SII and it seems to work the same as adding an actual url.

Upvotes: 0

Brett DeWoody
Brett DeWoody

Reputation: 62753

One thing is for sure, the auto-fit 'feature' is causing a lot of gray hair for developers.

I solved the issue by inserting a transparent image, 1 pixel tall and 650 pixels wide (the width of my email) at the very top of my email.

Even with auto-fit enabled my email now renders as it's supposed to.

<table width="100%" border="0" cellpadding="0" cellspacing="0" align="center">
  <tr>
    <td width="100%" valign="top" bgcolor="#ffffff" style="padding-top:20px">

      <!-- HERE'S THE MAGIC -->    
      <table width="650" border="0" cellpadding="0" cellspacing="0">  
        <tr>
          <td height="1">
            <img src="spacer.png" width="650" height="1" style="width:650px; height:1px;" />
          </td>
        </tr>
      </table>
      <!-- END THE MAGIC -->

      <!-- Start Wrapper-->
      <table width="650" border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td >
            REST OF EMAIL HERE
          </td>
        </tr>
      </table>
      <!-- End Wrapper-->
    </td>
  </td>
</table>

Upvotes: 0

johnferrie
johnferrie

Reputation: 242

I set a min-width and a width on the td where my email content lives and is now working fine in Android's gmail app where versions use autofit mode.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Gmail Issue</title>
  </head>
  <body>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
      <tr>
        <td width="50%" valign="top"></td>
        <td width="1100" valign="top" style="min-width:1100px;"></td>
        <td width="50%" valign="top"></td>
      </tr>
    </table>
  </body>
</html>

Upvotes: 0

Matt Parkins
Matt Parkins

Reputation: 24688

Just furthering the answers above which worked for me with an important caveat: the redraw time in IE8 makes the 1x1 transparent pixel method unusable on that target on a decent size canvas.

Since CSS can't detect auto-fit, or android browsers (chrome on Android seems fine anyway), my workaround was to

  1. target smaller devices (since IE8 tends to be desktop), and
  2. only target the relevant 'p' tags (autofit only targets some 'p' tags), so if we apply this fix only where it is needed then we keep the redraw performance impact as low as possible.

My workaround (based on Demetic's answer above):

/* work around mobile device auto-fitting */
@media only screen and (max-device-width: 800px) {
   #content p {
       background-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); 
       background-repeat:repeat;
    }
}

On my website '#content' is where the 'p' tags reside that are being auto-fitted, naturally you'd need to change this. 'body' will work, yes, but the more specific the lower the impact on redraw time.

It may be worth adding in a portrait-only detection mode since auto-fit doesn't seem to be targeted at landscape - but I haven't tested it on enough devices to confirm that this is always true.

Upvotes: 9

supamc99
supamc99

Reputation: 1

This appears to be a programming issue with Android. But in your mobile browser under Settings=>Advanced uncheck Auto-fit pages and this can be resolved. But we may not want our users to abide. So for the time being a simple hack as to placing a transparent background image should not be ruled out as a temporary solution. Using Drupal as a framework and Omega as my responsive theme and knowing my layout regions and outer DIVs are set to {display:block width:100%} this drove me nuts for a few minutes. But the transparent image worked nicely.

Upvotes: 0

Rafael Herscovici
Rafael Herscovici

Reputation: 17094

*{background-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==)}

Upvotes: 2

Jim
Jim

Reputation: 61

I just wanted to confirm that Delbert's solution was the only thing that worked for me. It's not completely apparent as to why this works, but it works. I've done some fairly exhaustive searching on the issue, and the links from Tom's original post seems to include about all there is out there.

For what it's worth, I tried some fairly aggressive attempts at correcting the width of some <p> tags nested deeply within a chain of <div> tags using some of the proposed solutions here:

* { background-color: transparent; } did not work for me. However, * { background-image: url("/image/pixel.png"); DID work for me (where pixel.png is a 1x1 transparent PNG). I eventually relaxed this to apply only to my nested <p> tags, and found that my paragraphs were finally spanning the intended, correct width.

I also confirmed that the behavior is a result of the "Auto-fit web pages" setting. I do not own an Android, but experienced these issues using the emulator.

Thanks again to Delbert for the tip.

Upvotes: 6

exoboy
exoboy

Reputation: 2058

I simply add a transparent png image as a repeated background. This also works for H1, H2, H3... tags that seem to be plagued by the same narrow-column problem. By using a transparent png, it allows me to still assign a background color or show whatever is behind the element. This is not perfect, but it is the simplest solution I have found that does not rely on any browser-specific hack and seems to work well in all other mobile browsers I have seen.

Although, I have noticed the same behavior on SPAN tags as well, and the above does not seem to work for this element... weird!

Upvotes: 1

Delbert
Delbert

Reputation: 91

I have been experiencing this problem and found a solution that works for me.

I have one main <div> with some nested <div> elements inside. The HTML is very basic. I found that one <div> within my main <div> would wrap its text as if I had double-tapped the text to zoom in on it. This <div> only contained text. This behavior occurred only in portrait orientation, and it corrected after double-tapping or switching orientation.

Since this problem is an Android bug, no CSS or HTML can really fix it. However, the following CSS resolved the problem satisfactorily for me; and I didn't have to turn off "Auto-fit pages":

I added a CSS background-image to the <div>. I just used a transparent, one-pixel PNG as the background.

div { background-image: url(../img/blank.png); }

Upvotes: 9

tomvon
tomvon

Reputation: 5371

Same problem here. The content within my <p> tags is smushed to left side. No good solution found yet though I've found that if I add a background color to my <p> tag it "fixes" the issue. I'm still trying to find a real fix though since adding a background color is not ideal.

Upvotes: 4

adriendenat
adriendenat

Reputation: 3475

Yes it seems that Android 4.x is in cause. Really annoying because it is the default behaviour ! It completely destroy all my websites...

I didn't found any solution at the moment. The proper behaviour is to fit the text with the width of your screen when you double tap the area. It seems that this feature is active even when not zoomed.

Upvotes: 1

Aicke Schulz
Aicke Schulz

Reputation: 11

I have nearly the same problem with p tags and li's they are much smaller then the surrounding container, but only with Android 4.x. With Android 2.3.x and Android 3.x "auto-fit pages" has no negative side effect.

Seems they tried to improve something, but it worked better before, that's annoying.

Upvotes: 0

user1075586
user1075586

Reputation: 1

give Width in % instead of px, like width:100%;

Upvotes: 0

Related Questions