Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

::first-letter selector - IE11 has a different layout compared to Firefox

I'm trying to style a title with ::first-letter CSS selector but I have strange layout resulting in Internet Explorer 11.

The code is quite simple: JSFiddle.

h2.titoloPagina::first-letter {
  color: #1d5987;
  display: block;
  float: left;
  font-family: Bell MT !important;
  font-size: 70px;
  /* margin-top: -15px;*/
  padding-right: 3px;
}
h2.titoloPagina span {
  border-bottom: 7px solid #1d5987;
  color: #538cc3;
  font-family: Bell MT !important;
  font-size: 30px !important;
  letter-spacing: 0;
  margin-left: 4px;
  padding-bottom: 5px;
}

/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */

/**
 * 1. Set default font family to sans-serif (opinionated).
 * 2. Prevent iOS and IE text size adjust after device orientation change,
 *    without disabling user zoom.
 */

html {
  font-family: sans-serif; /* 1 */
  -ms-text-size-adjust: 100%; /* 2 */
  -webkit-text-size-adjust: 100%; /* 2 */
}

/**
 * Remove default margin (opinionated).
 */

body {
  margin: 0;
}

/* HTML5 display definitions
   ========================================================================== */

/**
 * Correct `block` display not defined for any HTML5 element in IE 8/9.
 * Correct `block` display not defined for `details` or `summary` in IE 10/11
 * and Firefox.
 * Correct `block` display not defined for `main` in IE 11.
 */

article,
aside,
details,
figcaption,
figure,
footer,
header,
main,
menu,
nav,
section,
summary {
  display: block;
}

/**
 * 1. Correct `inline-block` display not defined in IE 8/9.
 * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
 */

audio,
canvas,
progress,
video {
  display: inline-block; /* 1 */
  vertical-align: baseline; /* 2 */
}

/**
 * Prevent displaying `audio` without controls in Mobile Safari 4/5/6/7.
 */

audio:not([controls]) {
  display: none;
  height: 0;
}

/**
 * Address `[hidden]` styling not present in IE 8/9/10.
 * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
 */

[hidden],
template {
  display: none;
}

/* Links
   ========================================================================== */

/**
 * Remove the gray background color from active links in IE 10.
 */

a {
  background-color: transparent;
}

/**
 * Improve readability of focused elements when they are also in an
 * active/hover state (opinionated).
 */

a:active,
a:hover {
  outline-width: 0;
}

/* Text-level semantics
   ========================================================================== */

/**
 * Address inconsistent styling of `abbr[title]`.
 * 1. Correct styling in Firefox 39 and Opera 12.
 * 2. Correct missing styling in Chrome, Edge, IE, Opera, and Safari.
 */

abbr[title] {
  border-bottom: none; /* 1 */
  text-decoration: underline; /* 2 */
  text-decoration: underline dotted; /* 2 */
}

/**
 * Address inconsistent styling of b and strong.
 * 1. Correct duplicate application of `bolder` in Safari 6.0.2.
 * 2. Correct style set to `bold` in Edge 12+, Safari 6.2+, and Chrome 18+.
 */

b,
strong {
  font-weight: inherit; /* 1 */
}

b,
strong {
  font-weight: bolder; /* 2 */
}

/**
 * Address styling not present in Safari and Chrome.
 */

dfn {
  font-style: italic;
}

/**
 * Address variable `h1` font-size and margin within `section` and `article`
 * contexts in Firefox 4+, Safari, and Chrome.
 */

h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

/**
 * Address styling not present in IE 8/9.
 */

mark {
  background-color: #ff0;
  color: #000;
}

/**
 * Address inconsistent and variable font size in all browsers.
 */

small {
  font-size: 80%;
}

/**
 * Prevent `sub` and `sup` affecting `line-height` in all browsers.
 */

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sup {
  top: -0.5em;
}

sub {
  bottom: -0.25em;
}

/* Embedded content
   ========================================================================== */

/**
 * Remove border when inside `a` element in IE 8/9/10.
 */

img {
  border: 0;
}

/**
 * Correct overflow not hidden in IE 9/10/11.
 */

svg:not(:root) {
  overflow: hidden;
}

/* Grouping content
   ========================================================================== */

/**
 * Address margin not present in IE 8/9 and Safari.
 */

figure {
  margin: 1em 40px;
}

/**
 * Address inconsistent styling of `hr`.
 * 1. Correct `box-sizing` set to `border-box` in Firefox.
 * 2. Correct `overflow` set to `hidden` in IE 8/9/10/11 and Edge 12.
 */

hr {
  box-sizing: content-box; /* 1 */
  height: 0; /* 1 */
  overflow: visible; /* 2 */
}

/**
 * Contain overflow in all browsers.
 */

pre {
  overflow: auto;
}

/**
 * 1. Correct inheritance and scaling of font-size for preformatted text.
 * 2. Address odd `em`-unit font size rendering in all browsers.
 */

code,
kbd,
pre,
samp {
  font-family: monospace, monospace; /* 1 */
  font-size: 1em; /* 2 */
}

/* Forms
   ========================================================================== */

/**
 * Known limitation: by default, Chrome and Safari on OS X allow very limited
 * styling of `select`, unless a `border` property is set.
 */

/**
 * 1. Correct font properties not being inherited.
 * 2. Address margins set differently in Firefox 4+, Safari, and Chrome.
 */

button,
input,
optgroup,
select,
textarea {
  font: inherit; /* 1 */
  margin: 0; /* 2 */
}

/**
 * Address `overflow` set to `hidden` in IE 8/9/10/11.
 */

button {
  overflow: visible;
}

/**
 * Address inconsistent `text-transform` inheritance for `button` and `select`.
 * All other form control elements do not inherit `text-transform` values.
 * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
 * Correct `select` style inheritance in Firefox.
 */

button,
select {
  text-transform: none;
}

/**
 * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
 *    and `video` controls.
 * 2. Correct inability to style clickable `input` types in iOS.
 * 3. Improve usability and consistency of cursor style between image-type
 *    `input` and others.
 */

button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
  -webkit-appearance: button; /* 2 */
  cursor: pointer; /* 3 */
}

/**
 * Re-set default cursor for disabled elements.
 */

button[disabled],
html input[disabled] {
  cursor: default;
}

/**
 * Remove inner padding and border in Firefox 4+.
 */

button::-moz-focus-inner,
input::-moz-focus-inner {
  border: 0;
  padding: 0;
}

/**
 * Restore focus style in Firefox 4+ (unset by a rule above)
 */

button:-moz-focusring,
input:-moz-focusring {
  outline: 1px dotted ButtonText;
}

/**
 * Address Firefox 4+ setting `line-height` on `input` using `!important` in
 * the UA stylesheet.
 */

input {
  line-height: normal;
}

/**
 * It's recommended that you don't attempt to style these elements.
 * Firefox's implementation doesn't respect box-sizing, padding, or width.
 *
 * 1. Address box sizing set to `content-box` in IE 8/9/10.
 * 2. Remove excess padding in IE 8/9/10.
 */

input[type="checkbox"],
input[type="radio"] {
  box-sizing: border-box; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Fix the cursor style for Chrome's increment/decrement buttons. For certain
 * `font-size` values of the `input`, it causes the cursor style of the
 * decrement button to change from `default` to `text`.
 */

input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  height: auto;
}

/**
 * Address `appearance` set to `searchfield` in Safari and Chrome.
 */

input[type="search"] {
  -webkit-appearance: textfield;
}

/**
 * Remove inner padding and search cancel button in Safari and Chrome on OS X.
 * Safari (but not Chrome) clips the cancel button when the search input has
 * padding (and `textfield` appearance).
 */

input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}

/**
 * Define consistent border, margin, and padding.
 */

fieldset {
  border: 1px solid #c0c0c0;
  margin: 0 2px;
  padding: 0.35em 0.625em 0.75em;
}

/**
 * 1. Correct `color` not being inherited from fieldset in IE 8/9/10/11.
 * 2. Remove padding so people aren't caught out if they zero out fieldsets.
 */

legend {
  color: inherit; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Remove default vertical scrollbar in IE 8/9/10/11.
 */

textarea {
  overflow: auto;
}

/**
 * Restore font weight (unset by a rule above).
 * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
 */

optgroup {
  font-weight: bold;
}
<h2 class="titoloPagina">
  <span>Title</span>
</h2>

With Mozilla Firefox, the first letter is base aligned with the underline, while with Internet Explorer 11 it's 15px lower.

What am I missing?

like image 419
gt.guybrush Avatar asked Mar 16 '16 10:03

gt.guybrush


3 Answers

This is a well-known discrepancy between Firefox's treatment of floating ::first-letter pseudo-elements versus other browsers, documented in this bug report. Firefox is the only browser that follows CSS2.1 correctly here, which is ironic considering that Firefox is otherwise the browser where ::first-letter is most broken in (Chrome being a close second).

The bad news is that there is nothing you can do to work around this in other browsers without using some sort of browser hack.

The (sorta) good news is that the working group is planning to consolidate this behavior in CSS Inline Module Level 3 with the initial-letter-align property, and we can only hope that browser vendors implement it eventually.

like image 192
BoltClock Avatar answered Nov 10 '22 22:11

BoltClock


Your requirement is not completely clear at this point as we are not able to deduct how do you want the alignment of remaining letters and the underline regarding the size and position of your first exactly.

But here are two versions of a code which will be targeting your possible original requirement.:

h2.titoloPagina { 
    font-family: Bell MT !important;
}
h2.titoloPagina::first-letter {
    float: left;
    font-size: 70px;
    color: #1d5987;
    margin-top: 2.5px;
}
h2.titoloPagina span {
    border-bottom: 7px solid #1d5987;
    font-size: 30px;
    color: #538cc3;
    line-height: 70px;
}

enter image description here

h2.titoloPagina { 
    font-family: Bell MT !important;
}
h2.titoloPagina::first-letter {
    float: left;
    font-size: 70px;
    color: #1d5987;
    padding: 14px;
padding-right: 3px;
}
h2.titoloPagina span {
    border-bottom: 7px solid #1d5987;
    font-size: 30px;
    color: #538cc3;
    line-height: 70px;
    padding-bottom: 12.5px;
}

enter image description here

p.s.: You need to test your code on browsers other than Firefox, because your code renders exactly the same on Chrome as it does on Explorer and every other major browser except for Mozilla's.

like image 44
Bekim Bacaj Avatar answered Nov 10 '22 23:11

Bekim Bacaj


You have to set more properties, like margin, padding and line-height. With some changes it works fine:

h2 {
  margin: 0;
  padding: 0.3em 0;
}
h2.titoloPagina::first-letter {
    color: #1d5987;
    display: block;
    float: left;
    font-family: Bell MT !important;
    font-size: 70px;
   /* margin-top: -15px;*/
    padding: 0 3px 0 0;
    margin: 0;
    line-height: 50px;
}
h2.titoloPagina span {
    border-bottom: 7px solid #1d5987;
    color: #538cc3;
    font-family: Bell MT !important;
    font-size: 30px !important;
    letter-spacing: 0;
    margin-left: 4px;
    padding-bottom: 5px;
}
<h2 class="titoloPagina">
  <span>Title</span>
</h2>
like image 1
Aloso Avatar answered Nov 10 '22 23:11

Aloso