mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
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.
365 lines
6.9 KiB
SCSS
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;
|
|
}
|