Upgrading Ionic 3 - Ionic 4 CSS copy over issue - ionic-framework

I'm working on updating an Ionic 3 application to Ionic 4. I'm having an issue with the app css not working. I copied everything within app.scss from the original application to global.scss in the new application.
When I load up the first page of the app it looks nothing like the original application. I thought this part was more or less copy/paste but I may be wrong. One thing I experimented with was a line of css I have that looks like:
ion-input.input {
margin-bottom: 0;
border: 1px solid lightgrey;
}
and changed it to
ion-input {
margin-bottom: 0;
border: 1px solid lightgrey;
}
The new application then seems to take the border into account. Is there some major css changes needed in this conversion? or am I missing something?

Yes there are major changes. Now that Ionic 4 is based on web components the insides of them are encapsulated.
This is so they can be dropped into any page and look how the developer expects it to look, rather than being messed up by the pages styles.
The web components expose certain settings that can be styled. These are listed at the end of each documentation page. For example with ion-input:
ion-input - custom css properties - Ionic Documentation

Here is a solution for the border, and here is a solution for margin. Unfortunately the reason this has to be changed in Ionic 4 is because the Shadow DOM is now being implemented. Here is more info on that. Cheers :)

Related

Ionic / Capacitor flickering screen and refresher not working

I am developing an app, and it works 100% in android. In IOS I have 2 issues:
refresher does not work
<ion-refresher slot="fixed" #ionRefresh="doRefresh($event)">
there is a flicker when I touch the screen (may be related to background? I read some old posts about that)
ion-content.background{
--background: url(/bg.png) 0 0/100% 100% no-repeat;
}
I don't believe its relevant to this issue, but I am using vuejs.
I tested in various desktop browsers and it works as well.
So, we had 2 things here, and I thank #johnborges for following up
it was necessary to add the pullingIcon
link for Ionic docs
and the relevant paragraph
Using the iOS native ion-refresher requires setting the pullingIcon
property on ion-refresher-content to the value of one of the available
spinners. See the Spinner Documentation for accepted values. The
pullingIcon defaults to the lines spinner on iOS. The spinner tick
marks will be progressively shown as the user pulls down on the page.
the flicker, based on this link from stackoverflow I added a CSS DIV element instead of styling ion-content. It worked. I had to do a secodn CSS trick because one of my pages had fullpage slides and padding, but after that it worked

$card-md-margin-left not working properly in variables.scss

I'm looking for a way to remove margin around an ion-card. It seems like the ionic framework suggested way to do this is by using global variables in a theme file, such as the default theme > variagles.scss
Using the suggested variables yields no change in margin:
$card-md-margin-left: 0;
$card-ios-margin-left: 0;
However, using the ion-card tag instead works:
ion-card {
margin-left: 0;
}
I'm not sure if this is a change in ionic3 vs ionic4, but I'm having a hard time finding any ionic4 related documentation about theme variables.
Are you viewing the changes VIA the ionic serve command in your web browser?
the MD and IOS style tags you reference, are specific to the ANDROID/IOS platforms, so you are not likely seeing these in the web browser for that very reason.

Ionic 3 images not displaying on device

I'm developing an Ionic 3 application. it has some custom styling done, and some images are instantiated via scss as backgrounds.
Thing is, when I run it on local (ionic serve) it works just fine.
But when I build an apk and run it on my phone, images are gone.
I've debugged it, and turns that image files are there, but there's no image on them.
Here's a piece of scss:
&:nth-child(3) {
border-right:none;
padding-top: 28px;
background: url('../../../assets/imgs/tabs/more-tab.png') no-repeat center 4px;
background-size: 20px 20px;
}
When I inspect the app from chrome, I can see the image file on sources tab. But there's no preview for it.
I have been researching a bit, and found only relative/absolute path workarounds (Which none worked). Actually, if I change the image path, it's not even loaded inside the apk.
Any idea why this is happening?
I leverage a background image in the app.scss and below works for me on web/ios/android. I think the relative paths are supposed to be in relation to the the output structure of www/build (not the code directory structure). So maybe try with just 1 ../
background: url("../assets/img/truck.png") no-repeat;
So, turns thatin order to load images both with ionic serve and on a build, image path has to be like this:
../assets/path-to-image
Hope this helps someone else

Background image not showing on iPad and iPhone

I want to create a section with a background covering it in a mobile web page, so I was using the following CSS code:
#section1{
background: url("background1.png") auto 749px;
height: 749px;
}
The background is showing correctly on Android (Chrome, Firefox ...), but it is not showing at all on iPhone or iPad (Safari, Chrome iOS ...). I have tried to set these properties using jQuery when the DOM is ready, but no luck. I read that the size might be a problem, but the image is about 700kB (1124x749px) so it should accomplish the Safari Web Content Guide rules. Which is the problem?
My problem was that iOS doesn't support background-attachment: fixed. Removing that line made the image appear.
It looks like there are workarounds for a fixed background image though: How to replicate background-attachment fixed on iOS
There's a problem with your CSS rule:
Your using the shorthand notation in which the background-size-property comes after the background-position-property and it must be separated by a /.
What you're trying to do is to set the position, but it will fail as auto is not a valid value for it.
To get it to work in shorthand notation it has to look like this:
background: url([URL]) 0 0 / auto 749px;
Also note that there's a value called cover, which may be suitable and more flexible here:
background: url([URL]) 0 0 / cover;
The support for background-size in the shorthand notation is also not very broad, as it's supported in Firefox 18+, Chrome 21+, IE9+ and Opera. It is not supported in Safari at all. Regarding this, I would suggest to always use:
background: url("background1.png");
background-size: auto 749px; /* or cover */
Here are a few examples and a demo, to demonstrate that behavior. You'll see that Firefox for example shows every image except the fist one. Safari on the other hand shows only the last.
CSS
section {
width: 200px;
height: 100px;
border: 1px solid grey;
}
#section1 {
background: url(http://placehold.it/350x150) auto 100px;
}
#section2 {
background: url(http://placehold.it/350x150) 0 0 / auto 100px;
}
#section3 {
background: url(http://placehold.it/350x150) 0 0 / cover;
}
#section4 {
background: url(http://placehold.it/350x150) 0 0;
background-size: cover;
}
Demo
Try before buy
Further reading
MDN CSS reference "background"
MDN CSS reference "background-size"
<'background-size'>
See background-size.
This property must be specified after background-position, separated with the '/' character.
I hope this will help someone in despair.
In my case, it was the size of the image that was too big, so the iPad just wasn't loading it (and it was right actually).
Diminishing its size and quality solved the loading issue.
The problem was not solved when I tried to use properly the background in shorthand. It works when I split the background property:
#section1{
background: url("background1.png");
background-size: auto 749px;
height: 749px;
}
Reduce the image size if nothing else works -- iOS doesn't like large image sizes on mobile and simply won't display the image if it's too large.
Great fundamentals by #insertusernamehere! No matter what I did I couldn't get my image to show up...until, I went back to basics. The image size was too large and iPhone didn't like loading an image of that size, over 700kbs. So, I reduced it to 32kb and we were in action.
Background image disappears on the IOS Browser (iPhone/iPad).
This is the code i used:
/*CSS*/
.bg-image {
background: url([URL]) center/cover no-repeat;
}
Alternatively, img src works on all browsers. It adds the Background Images acc to devices resolution.
<div class="download">
<picture>
<source srcset="/images/ios-device-mobile-v2.png" media="(max-width:450px)"/>
<source srcset="/images/ios-device-mobile-v2.png" media="(min-width: 600px)"/>
<img src="/images/ios-device.png" class="imgright">
</picture>
</div>
This piece of code is tested on iPhone Safari, Android Chrome and web Safari. Hopefully, This will help.
background-attachment: fixed; is not supported by IOS.
You can fix this by keeping the image in the div and positioning the div.
Hope this will work.
I had an negative text-indent that was throwing my background image off the page, so color:Transparent it is then.
I didn't see anyone specifically say this, but you have to define the width too. Makes since, since I set the background size to "contain" - it has to know what the container's dimensions are.
Once I did, the background rendered as expected.
#media only screen and (max-width:599px) {
[id=banner] td { width:480px !important; height:223px !important; background:url('image') no-repeat 0 0 !important; }
}
#media only screen and (max-width:479px) {
[id=banner] td { width:320px !important; height:149px !important; background:url('image') no-repeat 0 0 !important; background-size:contain !important; }
}
Note: The background URL needs to be defined for both breakpoints so that it works for iPhone 5 (iOS7).
Add a background-color solved my problem
background-color: #F4F4F2;
I had to set input { opacity: 0; } for my input + span {} icon to show up.
I don't have a real solution/reason for my similar issue but my background-image PNG image simply wouldn't show up until I moved it to a new folder in my (Cordova) iPad app. I literally moved it from /css/images/sweden/myimage.png to /css/images/sv/myimage.png and it started working. The other odd thing is that ALL other images in the original folder work fine (as background-image). Super strange. If I find the true reason/fix I'll report back.
I tried resizing my background image, made it way too small to test the theory, but it still wouldn’t show on any browser on the iPad (and presumably an iPhone). Tried other solutions that are listed here – still no good. Then I noticed that the element had inherited display: table;. Added display: block; to override that and the background image now displays on all divices that I've tested it on.
It's an old issue, i would like to share my solution here. iOS bigger image than the dimension ignores rendering, please use appropriate use size, not the css height/width. The actual image should not be more than 150% larger in size than the rendering viewpoint.

Detect support for CSS property with CSS only

Short question
Using CSS only, how do I detect that the background-size property is supported? If it's not supported, I would like to provide some fallback CSS. I already know how to do this with Javascript, but it's cleaner with CSS.
Long question
I have a high resolution sprite image that needs to look good on all cell phones, regardless of its exact pixel density. By using a background-size trick, I can scale the sprite appropriately.
.sprite {
background-image: url(sprite180x76.png);
/* 180 / 2 = 90 */
background-size: 90px auto;
}
There are some iOS and Android versions that don't support the background-size property, so the sprite would look twice as big as it should be. For these old systems, I would like to load up a low resolution sprite with no background scaling:
/* fake CSS */
#notSupported(background-size)
.sprite {
background-image: url(sprite90x38.png);
}
}
CSS doesn't have conditional statements as it's not a programming language like Javascript. Although, I believe there might be some kind of conditional statement in the works for CSS.
You'll have to rely on JavaScript to achieve any kind of conditional test case for CSS.
Meaning, you can't directly detect support for CSS.
However, CSS does have a "trick" thanks to its "Cascading" nature, but it's only usable when looking to replace some older code with newer code for the same style.
That sounds funny, here's a couple of examples:
-moz-border-radius: 6px;
-o-border-radius: 6px;
-webkit-border-radius: 6px;
-ms-border-radius: 6px;
border-radius: 6px;
In browsers that do support the official CSS, it will the style as denoted on line 5. While in older versions of say Firefox, line 1 will get applied and line 2-5 will get ignored because they're unknown.
Another (and perhaps better) example could be:
background-color: #AAA;
background-color: rgba(0, 0, 0, 0.5);
This code will give the background a grey color, while newer browsers will give it a black color with a 50% transparency, overriding the old color.
Hope that helps a little.
Cheers!
-- Update --
I did just come across something that might help. In Aaron Gustafson's book "Adaptive Web Design" he mentions how CSS will ignore an entire rule if a given browser/renderer doesn't support a given selector.
With the concept above, if you can find a selector that was not implemented in the older version but is available in the newer version you could do something like this:
/* fake CSS */
.sprite {
background-image: url(sprite90x38.png);
}
[[ selector that is supported by newer browser/OS ]],
.sprite {
background-image: url(sprite180x76.png);
/* 180 / 2 = 90 */
background-size: 90px auto;
}
The idea is that for the "old" browsers you can load the old PNG but for the newer browser it will load the larger PNG and apply background size.
The only thing I would be concerned about is if this causes the supportive browsers to load both images but apply one.
And this still requires finding an unsupported selector in one version of another. Quicksmode.com might help you find one:
http://www.quirksmode.org/css/contents.html
-- UPDATE 2 --
I put this in the comments but I'll add it here as it might help. I spent some time trying to find out what browser version iOS 3.1.3 supported and therefor what selectors might be possible to use with the above trick.
What I found was this Apple developers site: http://developer.apple.com/library/safari/#documentation/appleapplications/reference/SafariCSSRef/Articles/StandardCSSProperties.html
If you do a page search (ctr+f) for background-size, it shows that iOS 1+ supported a proprietary version called:
-webkit-background-size: length
-webkit-background-size: length_x length_y
That might be a possible solution. If you add that before the real one, you can ensure backwards compatability.
-webkit-background-size: length
background-size: length
Hopefully that helps find alternate solutions since the original question of doing a conditional test to see if a rule is supported is not possible in CSS right now.
You can't (for now) detect support of property A and, given or not this support, serve different values for property B with CSS only ...
... except if the browser support for properties A and B is exactly the same! Then instructions below:
selector {
propertyA: valueA;
propertyB: valueB;
}
will both fail or both succeed.
The remaining problem is to find a CSS property that has the exact same support than background-size :)
I was thinking about multi-background : it should (not) work in IE6/7/8 according to CSS Background Properties support in Standardista but I can't test in iOs and Android, only in bada/Dolfin 2.0 (Samsung Wave; also based on Webkit).
Here's a Fiddle : http://jsfiddle.net/PhilippeVay/2VaWu/
that shows a paragraph with only a simple background that any browser should display and then another paragraph with both a simple background and (*) a multi-background resized with background-size that only modern browsers should display (older browsers should display the same background as for the first paragraph).
Fx9 and dolfin 2.0 both display correctly the second paragraph. IE8 doesn't, as expected.
Another solution would be to use a selector understood by browser versions that also understand background-size but not understood by others. Though it's easier to find for IE than for smartphones based on Webkit!
(*) using a different CSS rule with higher specificity, for the purpose of the demo. In real world, there'd be only one rule with simple background defined before the multiple background.