Transparent gradient not working in Safari
This issue is known and best explained in the link below:
https://css-tricks.com/thing-know-gradients-transparent-black/
Below are few related links on github for the same issue:
https://github.com/jakubpawlowicz/clean-css/issues/315
https://github.com/Compass/compass/issues/2010
Eventually I believe that you need a work around to do so until they come up with a fix in future releases.
Best Wishes
Safari linear gradient
This is a bug in safari that has to do with the way browsers interpolate between gradients.
A common answer is to do what you did, using rgba(255, 255, 255, 0), however, Safari still interprets this as white and leads to that unwanted additional of white to the gradient. A fix is to use the same color you are transitioning from (coral in this case) and set it to transparent, which for coral would be rgba(255, 127, 80, 0). The example below uses the code from your pen with the fix applied for safari.
See this stack for more
* {
margin: 0;
}
.gradient-container {
background-color: coral;
width: 200px;
height: 30px;
position: relative;
display: flex;
align-items: center;
}
.elements {
padding: 0 10px;
display: flex;
column-gap: 10px;
overflow-x: hidden;
}
.elements p {
color: #fff;
white-space: nowrap;
}
.gradient {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/*RGBA equivalent to coral html color with alpha set to 0 - fixes safari interpolation bug*/
background: linear-gradient(to right, rgba(255, 127, 80, 0) calc(100% - 50px), coral);
}
<div class="gradient-container">
<div class="elements">
<p>Element 1</p>
<p>Element 2</p>
<p>Element 3</p>
</div>
<div class="gradient"></div>
</div>
CSS linear gradient transparency misbehaving only in Safari
Instead of:
background: linear-gradient(to top, white, transparent);
Try setting your transparent to an rgba color value. For example:
background: linear-gradient(to top, white, rgba(255,255,255,0));
In other words, the rgb value of both colors should match. For example:
background: linear-gradient(to top, red, rgba(255,0,0,0));
As defined by the w3c spec, transparent is black transparent (rgba(0,0,0,0)). That means that when you are in the middle of the transition, some black should appear.
The color seen in Safari is the correct one, as per the specs.
CSS3 Gradient with transparency not displaying correctly in Safari
Try:
background: linear-gradient(rgba(255,255,255,0) 124px, #de6230);
Edit: sorry OP, that still doesn't look the same as your gradient although it is the correct colors, the gray middle just turned to a white middle. The solution I found was:
background: linear-gradient(rgba(222,98,48,0) 124px, #de6230);
222,98,48 is the rgb value of #de6230 so this should work. It's transitioning from your color at 0% alpha to your color at 100% alpha.
Different gradient color in chrome and safari
You can find a good explanation of what is going on here. Basically, this has been in the working draft for years now, and Safari is the only major player who hasn't fixed it. See current status here:
Partial support in Safari and Older Firefox versions refers to not
using premultiplied colors which results in unexpected behavior when
using the transparent keyword as advised by the spec.
I guess if you were desperate, you could calculate the gradient yourself and put in a lot of stop points. Otherwise just wait for Apple to fix.
Safari 6 Gradient color blending/interpolation bug
I was able to reproduce the problem on Mac 10.8.1 Safari 6.0 (8536.25) and iOS Safari 6.0.1. I think applying a -webkit-mask-image
instead of a transparent color-stop avoids the issue:
.grad-bg {
background-image:
-webkit-linear-gradient(top, #ff0000, #fff);
height: 100%;
}
.masked {
-webkit-mask-image:
-webkit-linear-gradient(top, white, transparent, white);
}
jsFiddle
In the image, the top shows over a white background, bottom shape shows over an opaque gradient background of the same colors.
(Many edits.)
CSS gradient not working on iOS
Do give this a check in iOS but it ought to work:
background: #ffad26; /* Old browsers */
background: -moz-linear-gradient(top, #ffad26 0%, #fea026 50%, #ff8b00 51%, #ff7701 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffad26), color-stop(50%,#fea026), color-stop(51%,#ff8b00), color-stop(100%,#ff7701)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, #ffad26 0%,#fea026 50%,#ff8b00 51%,#ff7701 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, #ffad26 0%,#fea026 50%,#ff8b00 51%,#ff7701 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, #ffad26 0%,#fea026 50%,#ff8b00 51%,#ff7701 100%); /* IE10+ */
background: linear-gradient(to bottom, #ffad26 0%,#fea026 50%,#ff8b00 51%,#ff7701 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffad26', endColorstr='#ff7701',GradientType=0 ); /* IE6-9 */
I'd also recommend looking into a pre-processor like SASS which will generate a lot of these things for you.
Alternative 1
As an alternative, you could try using an inset box shadow. It's not exact, and it has it's limitations but it's just an option :)
background-color:#FF8B00;
-webkit-box-shadow: inset 0px 100px 0px 0px rgba(255, 255, 255, 0.5);
box-shadow: inset 0px 100px 0px 0px rgba(255, 255, 255, 0.5);
Alternative 2
If you know the height, either use the box shadow above or just use a background image. That way you'll get cross-browser support without the mess that is a hundred prefixed CSS properties like above :)
Related Topics
Firefox Blurs an Image When Scaled Through External CSS or Inline Style
Css: Background-Color on Multi-Line Text
Strange Float Behaviour in IE7
CSS Class Repetition to Increase Specificity
Firefox Sets Wrong Caret Position Contenteditable with :Before
CSS Cursor Pointer with Svg Image
Is There a CSS Media Query to Detect Windows
Styling Browser-Native Video Controls
How to Create Inline Pseudo Styles
How to Add Multiple CSS Gradient as a Multiple Background
Overflow:Hidden Ignored with Border-Radius and CSS Transforms (Webkit Only)
CSS Gradient Checkerboard Pattern
CSS Selector for Selecting an Element That Comes Before Another Element
CSS Multi-Column Layout of List Items Doesn't Align Properly in Chrome