Files
ionic-framework/scss/_scaffolding.scss
Adam Bradley 03086ed228 fix(nav): prevent flickers between views
By default the scroll bar is being created for each view, then
immediately it adds the .scroll-bar-fade-out class. On every transition
you sometimes saw the scroll bar appear then fade away quickly. Sure
that was annoying and has been fixed to prevent that, but the real
issue is that on every view transition, the scroll bar’s opacity
transition fired off a transitionend event, which bubbled up to the
view and messed with Angular’s $animate. If timed out correctly, at the
time the scroll bar’s transitionend event bubbled up, and an element
was actively leaving the view, it would confuse $animate and cause the
leave animation to abruptly end, which caused an ugly flicker.
2014-09-16 22:58:22 -05:00

365 lines
6.9 KiB
SCSS

/**
* Scaffolding
* --------------------------------------------------
*/
*,
*:before,
*:after {
@include box-sizing(border-box);
}
html {
overflow: hidden;
-ms-touch-action: pan-y;
touch-action: pan-y;
}
body,
.ionic-body {
@include touch-callout(none);
@include font-smoothing(antialiased);
@include text-size-adjust(none);
@include tap-highlight-transparent();
@include user-select(none);
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: hidden;
margin: 0;
padding: 0;
color: $base-color;
word-wrap: break-word;
font-size: $font-size-base;
font-family: $font-family-base;
line-height: $line-height-computed;
text-rendering: optimizeLegibility;
-webkit-backface-visibility: hidden;
-webkit-user-drag: none;
}
body.grade-b,
body.grade-c {
// disable optimizeLegibility for low end devices
text-rendering: auto;
}
.content {
// used for content areas not using the content directive
position: relative;
}
.scroll-content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: hidden;
// Hide the top border if any
margin-top: -1px;
// Prevents any distortion of lines
padding-top:1px;
width: auto;
height: auto;
}
.scroll-content-false,
.menu .scroll-content.scroll-content-false{
z-index: $z-index-scroll-content-false;
}
.scroll-view {
position: relative;
display: block;
overflow: hidden;
// Hide the top border if any
margin-top: -1px;
}
/**
* Scroll is the scroll view component available for complex and custom
* scroll view functionality.
*/
.scroll {
@include user-select(none);
@include touch-callout(none);
@include text-size-adjust(none);
@include transform-origin(left, top);
}
// hide webkit scrollbars
::-webkit-scrollbar {
display:none;
}
// Scroll bar styles
.scroll-bar {
position: absolute;
z-index: $z-index-scroll-bar;
}
// hide the scroll-bar during animations
.ng-animate .scroll-bar {
visibility: hidden;
}
.scroll-bar-h {
right: 2px;
bottom: 3px;
left: 2px;
height: 3px;
.scroll-bar-indicator {
height: 100%;
}
}
.scroll-bar-v {
top: 2px;
right: 3px;
bottom: 2px;
width: 3px;
.scroll-bar-indicator {
width: 100%;
}
}
.scroll-bar-indicator {
position: absolute;
border-radius: 4px;
background: rgba(0,0,0,0.3);
opacity: 1;
@include transition(opacity .3s linear);
&.scroll-bar-fade-out {
opacity: 0;
}
}
.grade-b .scroll-bar-indicator,
.grade-c .scroll-bar-indicator {
// disable rgba background and border radius for low end devices
border-radius: 0;
background: #aaa;
&.scroll-bar-fade-out {
@include transition(none);
}
}
@keyframes refresh-spin {
0% { transform: translate3d(0,0,0) rotate(0); }
100% { transform: translate3d(0,0,0) rotate(180deg); }
}
@-webkit-keyframes refresh-spin {
0% {-webkit-transform: translate3d(0,0,0) rotate(0); }
100% {-webkit-transform: translate3d(0,0,0) rotate(180deg); }
}
@keyframes refresh-spin-back {
0% { transform: translate3d(0,0,0) rotate(180deg); }
100% { transform: translate3d(0,0,0) rotate(0); }
}
@-webkit-keyframes refresh-spin-back {
0% {-webkit-transform: translate3d(0,0,0) rotate(180deg); }
100% {-webkit-transform: translate3d(0,0,0) rotate(0); }
}
// Scroll refresher (for pull to refresh)
.scroll-refresher {
position: absolute;
top: -60px;
right: 0;
left: 0;
overflow: hidden;
margin: auto;
height: 60px;
.ionic-refresher-content {
position: absolute;
bottom: 15px;
left: 0;
width: 100%;
color: $scroll-refresh-icon-color;
text-align: center;
font-size: 30px;
.text-refreshing,
.text-pulling {
font-size: 16px;
line-height: 16px;
}
&.ionic-refresher-with-text {
bottom: 10px;
}
}
.icon-refreshing,
.icon-pulling {
width: 100%;
-webkit-backface-visibility: hidden;
-webkit-transform-style: preserve-3d;
backface-visibility: hidden;
transform-style: preserve-3d;
}
.icon-pulling {
@include animation-name(refresh-spin-back);
@include animation-duration(200ms);
@include animation-timing-function(linear);
@include animation-fill-mode(none);
-webkit-transform: translate3d(0,0,0) rotate(0deg);
transform: translate3d(0,0,0) rotate(0deg);
}
.icon-refreshing,
.text-refreshing {
display: none;
}
.icon-refreshing {
@include animation-duration(1.5s);
}
&.active {
.icon-pulling:not(.pulling-rotation-disabled) {
@include animation-name(refresh-spin);
-webkit-transform: translate3d(0,0,0) rotate(-180deg);
transform: translate3d(0,0,0) rotate(-180deg);
}
&.refreshing {
@include transition(transform .2s);
@include transition(-webkit-transform .2s);
-webkit-transform: scale(1,1);
transform: scale(1,1);
.icon-pulling,
.text-pulling {
display: none;
}
.icon-refreshing,
.text-refreshing {
display: block;
}
&.refreshing-tail{
-webkit-transform: scale(0,0);
transform: scale(0,0);
}
}
}
}
ion-infinite-scroll {
height: 60px;
width: 100%;
opacity: 0;
display: block;
@include transition(opacity 0.25s);
@include display-flex();
@include flex-direction(row);
@include justify-content(center);
@include align-items(center);
.icon {
color: #666666;
font-size: 30px;
color: $scroll-refresh-icon-color;
}
&.active {
opacity: 1;
}
}
.overflow-scroll {
overflow-x: hidden;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
top: 0;
right: 0;
bottom: 0;
left: 0;
position: absolute;
.scroll {
position: static;
height: 100%;
-webkit-transform: translate3d(0, 0, 0); // fix iOS bug where relative children of scroller disapear while scrolling. see: http://stackoverflow.com/questions/9807620/ipad-safari-scrolling-causes-html-elements-to-disappear-and-reappear-with-a-dela
}
}
// Pad top/bottom of content so it doesn't hide behind .bar-title and .bar-tab.
// Note: For these to work, content must come after both bars in the markup
/* If you change these, change platform.scss as well */
.has-header {
top: $bar-height;
}
// Force no header
.no-header {
top: 0;
}
.has-subheader {
top: $bar-height * 2;
}
.has-tabs-top {
top: $bar-height + $tabs-height;
}
.has-header.has-subheader.has-tabs-top {
top: 2 * $bar-height + $tabs-height;
}
.has-footer {
bottom: $bar-height;
}
.has-subfooter {
bottom: $bar-height * 2;
}
.has-tabs,
.bar-footer.has-tabs {
bottom: $tabs-height;
}
.has-footer.has-tabs {
bottom: $tabs-height + $bar-height;
}
// A full screen section with a solid background
.pane {
@include translate3d(0,0,0);
z-index: $z-index-pane;
}
.view {
z-index: $z-index-view;
}
.pane,
.view {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
background-color: $base-background-color;
overflow: hidden;
}
ion-nav-view {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #000;
}