skip to Main Content

I just want to skew the parent and skew it back on the child.

Example : HTML

<div class="parent"> <!-- skew(-10deg) -->
    <div class="child">Hello</div> <!-- skew(10deg) (skew back) -->
</div>

Example : CSS

.parent {
    transform: skew(-10deg);
}
.child {
    transform: skew(10deg);
}

Text inside seems ok with Firefox, Safari. But not Chrome and Opera its a bit blurry

I have to use -webkit-backface-visibility: hidden; for reduce box pixelated in Chrome

Firefox :

Firefox

Chrome :

Chrome

Firefox vs Chrome :

FirefoxVSChrome

or zoomed by Photoshop

FirefoxVSChromeZoomed

Live example : http://jsfiddle.net/1tpj1kka/

Any idea ?


NOTE !!! : web-tiki’s answer is an another way solution to prevent the problem. But if any answered a real solution to resolved this skew back problem (real fix), I will accept the answer.

3

Answers


  1. The “blurry text” after 2d or 3d transforms with webkit browsers has been discused many times. But in your case, you can apply the transform only on a pseudo element so that your text isn’t affected by the skew property.

    It will also alow you to use only one tag in your markup :

    @import url(https://fonts.googleapis.com/css?family=Oswald);
    body{color:#fff;font-weight: bold;font-size:50px;font-family:'Oswald',sans-serif;}
    
    .parent {
        width: 300px;
        overflow: hidden;
        padding-left: 5%;
        position:relative;
    }
    
    .parent::before {
        content :'';
        position:absolute;
        top:0;left:0;
        width:100%; height:100%;
        background: rgba(90,190,230,0.9);
        transform-origin:0 0;
        transform:skew(-10deg);
        z-index:-1;
    }
    <div class="parent">
        Hello
    </div>
    Login or Signup to reply.
  2. Adding the ‘translateZ(0)’ before transformations like below forces the gpu to re-render the text and removes blurry-ness on Chrome.

    This:

    transform:  translateZ(0) skew(-10deg);
    

    Not This:

    transform: skew(-10deg);
    
    Login or Signup to reply.
  3. You can try the text-rendering: geometricPrecision CSS property. This will force your text to not be anti-aliased, thus making the blurriness less important.

    inp.onchange = function(){
       document.querySelector('.child').classList.toggle('geo');
      }
    @import url(https://fonts.googleapis.com/css?family=Oswald);body{color:#fff;font-weight:bold;font-size:50px;font-family:'Oswald',sans-serif;}
    
    .geo{
        text-rendering: geometricPrecision;
      }
    .parent {
    
      transform: skew(-10deg);
      -webkit-backface-visibility: hidden;  
      width:300px;padding-left:15%;margin-left:-15%;overflow:hidden;
    }
    
    .child {
      transform: skew(10deg);  
      width:300px;background: rgba(90, 190, 230, 0.9);padding-left: 5%;padding-right: 15%;
    }
    <div class="parent"> <!-- skew(-10deg) -->
        <div class="child geo">Hello</div> <!-- skew(10deg) (skew back) -->
    </div>
    <input type="checkbox" id="inp" checked="true"/> geometricPrecision
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search