Letters getting cut off to the leftmost in posts

I hope none of you recognize me from my last bug report, I have a history of noticing stupid details…

I just noticed that letters are getting cut off to the leftmost in posts. At first I thought I was going crazy, but upon closer inspection it turned out I was somewhat sane.

Have a look at these two letters:

A A

Notice that the left leg of the first A is not quite as thick at the bottom as the left leg of the second? I won’t blame you if you don’t. Here’s a closeup (images captured on the forum of which I am a member):

image image

Now, this is even more noticable if you have a theme with white text
image

This is so frustrating now that I know it’s there. Hopefully someone clever will be equally frustrated and have a look at it.

The rest of the letters, if you want to have a look at them

A A
B B
C C
D D
E E
F F
G G
H H
I I
J J
K K
L L
M M
N N
O O
P P
Q Q
R R
S S
T T
U U
V V
W W
X X
Y Y
Z Z

7 Likes

Do you see that problem here on or try.discourse.org? Do you see it on that site if you use example.com/safe-mode?

1 Like

Yep, same thing on here. As you see below it is consistent on all pages. The left A is getting cut off by a pixel.

Same comparison here on the meta:

image image

Comparison on try:

image image

Comparison in safe mode:

image image

4 Likes

Good catch, it’s incredibly slight. Looks as though the overflow: hidden; on .cooked is what’s causing it to be cut off, but I’m not entirely sure why the text would be overflowing by 1px to begin with… will investigate.

12 Likes

Sorry to bump this topic, but I found an example which makes it much clearer what is happening

*j j* becomes
j j

9 Likes

Small update on this, I tested it out a little bit more (in Chrome on Windows 10) and it’s definitely an issue that’s more pronounced on Windows specifically… and if you change the width of your browser window sometimes it happens, sometimes it doesn’t. I don’t really see it on my screen in OSX.

Seems like that would have something to do with subpixel rendering… I think the only way to solve that would be to add a small amount of padding to the left side of .cooked or remove the overflow: hidden (it’s there to protect content like images in deeply nested lists from overflowing the post container, but we might be able to apply it only to the nested containers?)

This issue is a little different. When a font is italicized, it overflows outside of its reserved space (and also its parent div) - so it’s getting cut off by our same overflow: hidden rule.

9 Likes

Closing this out because it was fixed quite a while ago. There were some other clipping issues cause by overflow: hidden and that fix also solved this.

Overflow is still hidden, but it was moved and some padding was added, which gives text a little extra space in cases where it naturally overflows a little bit.

https://github.com/discourse/discourse/commit/fa21b398755ccf3c523d0e0262567dbdc510de05

6 Likes

Btw. we have a similar issue with topic title. See: current (#1) vs an example without overflow: hidden in h1 (#2)

#1 image
#2 image

We do want to hide the overflow, so the best solution I had so far was to add a “positive padding, negative margin” combo on the X axis to give it a breathing room. But that’s a bit hacky. @awesomerobot?

7 Likes

The un-scrolled page title was a straightforward fix. That title can wrap to multiple lines, so overflow was only there to prevent long unborken words from breaking the width. Removing the overflow and adding overflow-wrap: break-word; will break words when there isn’t enough space.

When the title docks to the header on scroll we use overflow: hidden along with text-overflow: ellipsis to truncate titles that are longer than one line… we can’t as easily remove overflow there, so I added some padding and re-align to the left with a negative margin. Not the prettiest CSS, but it works.

https://github.com/discourse/discourse/commit/89f6ff1574d15c9d654472f9cd3536d6da833182


A little more detail on why this happens. Within a font there’s the concept of an em-box (also called an em-square). These boxes are the same size for each character and it serves as the base used for scaling, adjusting line-height, letter-spacing, etc.

Characters can extend outside of the em-box in any direction… sometimes it’s necessary for certain characters, sometimes it’s just what the font designer wanted to do. In the browser there’s no way to tell that this oveflowed content exists, so there’s nothing that can be done to account for it dynamically.

As far as I know the only options are to avoid overflow on text when possible or add a little additional padding when you can’t.

6 Likes