|
|
(One intermediate revision by the same user not shown) |
Line 10: |
Line 10: |
| position: relative; | | position: relative; |
| | | |
− | }
| |
− |
| |
− | /*
| |
− | * CSS Fadeshow by @alexerlandsson
| |
− | * This is a fadeshow built in CSS and with customization in focus.
| |
− | * Supports quick navigation, prev/next navigation and autoplay.
| |
− | *
| |
− | * For better documentation and implementation guide, check out the GitHub repository:
| |
− | * https://github.com/alexerlandsson/css-fadeshow
| |
− | */
| |
− |
| |
− |
| |
− | /*
| |
− | * ===== VARIABLES =====
| |
− | *
| |
− | * Change these variables to match your preferences. For a more detailed
| |
− | * description of what each variable do, visit https://github.com/alexerlandsson/css-fadeshow
| |
− | */
| |
− |
| |
− | $max-slides: 5;
| |
− | $prefix: true;
| |
− | $responsive: true;
| |
− | $breakpoint-small: 500px;
| |
− | $fade-time: 1;
| |
− | $prev-next-fontfamily: sans-serif;
| |
− | $prev-next-icon-size: 3vw;
| |
− | $prev-next-icon-color: rgba(255,255,255,0.5);
| |
− | $prev-next-bg: rgba(255,255,255,0);
| |
− | $prev-next-bg-hover: rgba(255,255,255,0.1);
| |
− | $prev-icon: '❮';
| |
− | $next-icon: '❯';
| |
− | $autohide-next-prev: true;
| |
− | $quick-nav-color: rgba(255,255,255,0.8);
| |
− | $quick-nav-active-color: coral;
| |
− | $fade-color: #fff;
| |
− | $autoplay: true;
| |
− | $autoplay-duration: 5;
| |
− |
| |
− |
| |
− | /*
| |
− | * ===== MIXINS =====
| |
− | *
| |
− | * This section contains mixin used
| |
− | * Do not change anything here unless you know what you are doing.
| |
− | */
| |
− |
| |
− | /* Mixins to handle prefixes */
| |
− |
| |
− | @mixin fadeshow-transition($value...) {
| |
− | @if length($value) < 1 {
| |
− | $value: all 150ms linear;
| |
− | }
| |
− | @if $prefix == true {
| |
− | -webkit-transition: $value;
| |
− | }
| |
− | transition: $value;
| |
− | }
| |
− |
| |
− | @mixin fadeshow-transform($value...) {
| |
− | @if length($value) < 1 {
| |
− | $value: all 150ms linear;
| |
− | }
| |
− | @if $prefix == true {
| |
− | -webkit-transform: $value;
| |
− | -ms-transform: $value;
| |
− | }
| |
− | transform: $value;
| |
− | }
| |
− |
| |
− | @mixin fadeshow-animation($value...) {
| |
− | @if $prefix == true {
| |
− | -webkit-animation: $value;
| |
− | }
| |
− | animation: $value;
| |
− | }
| |
− |
| |
− | @mixin fadeshow-animation-delay($value) {
| |
− | @if $prefix == true {
| |
− | -webkit-animation-delay: $value;
| |
− | }
| |
− | animation-delay: $value;
| |
− | }
| |
− |
| |
− | @mixin fadeshow-unselectable() {
| |
− | @if $prefix == true {
| |
− | -webkit-user-select: none;
| |
− | -moz-user-select: none;
| |
− | -ms-user-select: none;
| |
− | }
| |
− | user-select: none;
| |
− | }
| |
− |
| |
− | /* Mixins to handle Quick Navigation Button states */
| |
− |
| |
− | @mixin quickNavBtnActive() {
| |
− | background-color: $quick-nav-active-color;
| |
− | }
| |
− |
| |
− | @mixin quickNavBtnInactive() {
| |
− | background-color: $quick-nav-color;
| |
− | }
| |
− |
| |
− |
| |
− | /*
| |
− | * ===== FADESHOW =====
| |
− | *
| |
− | * Base functionality for the fadeshow.
| |
− | * Do not change anything here unless you know what you are doing.
| |
− | */
| |
− |
| |
− | [data-am-fadeshow] {
| |
− | position: relative;
| |
− | width: 100%;
| |
− | height: 100%;
| |
− | overflow: hidden;
| |
− | background-color: $fade-color;
| |
− |
| |
− | /* Slides */
| |
− | .fs-slide {
| |
− | position: absolute;
| |
− | top: 0;
| |
− | bottom: 0;
| |
− | left: 0;
| |
− | right: 0;
| |
− | opacity: 0;
| |
− | background-size: cover;
| |
− | background-position: center;
| |
− | background-repeat: no-repeat;
| |
− | @include fadeshow-transition(opacity #{$fade-time}s ease);
| |
− |
| |
− | /* Display first child on load */
| |
− | &:first-child {
| |
− | opacity: 1;
| |
− | }
| |
− | }
| |
− |
| |
− | /* Quick Navigation */
| |
− | .fs-quick-nav {
| |
− | position: absolute;
| |
− | bottom: 15px;
| |
− | left: 50%;
| |
− | z-index: 1;
| |
− | @include fadeshow-unselectable();
| |
− | @include fadeshow-transform(translateX(-50%));
| |
− | }
| |
− |
| |
− | .fs-quick-btn {
| |
− | display: inline-block;
| |
− | width: 15px;
| |
− | height: 15px;
| |
− | margin: 0 2px;
| |
− | border-radius: 50%;
| |
− | cursor: pointer;
| |
− | @include fadeshow-transition(opacity 200ms ease);
| |
− | @include quickNavBtnInactive();
| |
− |
| |
− | &:hover {
| |
− | opacity: 0.8;
| |
− | }
| |
− |
| |
− | /* Set active state to first button on load */
| |
− | &:first-child {
| |
− | @include quickNavBtnActive();
| |
− | }
| |
− | }
| |
− |
| |
− | /* Prev/Next Navigation */
| |
− | %prev-next {
| |
− | position: absolute;
| |
− | display: none;
| |
− | top: 0;
| |
− | bottom: 0;
| |
− | width: 100px;
| |
− | cursor: pointer;
| |
− | font-family: $prev-next-fontfamily;
| |
− | background-color: $prev-next-bg;
| |
− | -webkit-tap-highlight-color: rgba(0,0,0,0);
| |
− | @include fadeshow-transition(all 200ms ease);
| |
− |
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | width: 50%;
| |
− | }
| |
− | }
| |
− |
| |
− | &:before {
| |
− | position: absolute;
| |
− | top: 50%;
| |
− | font-size: $prev-next-icon-size;
| |
− | color: $prev-next-icon-color;
| |
− | }
| |
− |
| |
− | &:hover {
| |
− | background-color: $prev-next-bg-hover;
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | background-color: rgba(255,255,255,0);
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | .fs-prev-btn {
| |
− | @extend %prev-next;
| |
− | left: 0;
| |
− |
| |
− | &:before {
| |
− | content: "#{$prev-icon}";
| |
− | left: 50%;
| |
− | @include fadeshow-transform(translate(-50%, -50%));
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | left: 30px;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | @if $autohide-next-prev == true {
| |
− | @include fadeshow-transform(translateX(-100%));
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | @include fadeshow-transform(translate(0));
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | .fs-next-btn {
| |
− | @extend %prev-next;
| |
− | right: 0;
| |
− |
| |
− | &:before {
| |
− | content: "#{$next-icon}";
| |
− | right: 50%;
| |
− | @include fadeshow-transform(translate(50%, -50%));
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | right: 30px;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | @if $autohide-next-prev == true {
| |
− | @include fadeshow-transform(translateX(100%));
| |
− | @if $responsive == true {
| |
− | @media (max-width: $breakpoint-small) {
| |
− | @include fadeshow-transform(translate(0));
| |
− | }
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Base functionality */
| |
− | input[type="radio"] {
| |
− | position: fixed;
| |
− | top: -9999px;
| |
− |
| |
− | &:checked {
| |
− |
| |
− | /* This loop handles the slide switching and quick navigation active state */
| |
− | $i: $max-slides;
| |
− |
| |
− | @while $i > 0 {
| |
− |
| |
− | &:nth-of-type(#{$i}) {
| |
− | /* Show slide */
| |
− | ~ .fs-slides {
| |
− | .fs-slide {
| |
− | //Cancel autoplay
| |
− | opacity: 0;
| |
− | @include fadeshow-animation(none !important);
| |
− | }
| |
− | .fs-slide:nth-child(#{$i}) {
| |
− | opacity: 1;
| |
− | }
| |
− | }
| |
− |
| |
− | /* Add active state to dot */
| |
− | ~ .fs-quick-nav {
| |
− | .fs-quick-btn {
| |
− | @include quickNavBtnInactive();
| |
− | /* Cancel autoplay */
| |
− | @include fadeshow-animation(none !important);
| |
− | }
| |
− | .fs-quick-btn:nth-child(#{$i}) {
| |
− | background-color: $quick-nav-active-color;
| |
− | &:hover {
| |
− | opacity: 1;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | $i: $i - 1;
| |
− | }
| |
− |
| |
− | /* Hide navigation if only one slide */
| |
− | &:first-of-type:last-of-type {
| |
− | ~ .fs-quick-nav,
| |
− | ~ .fs-prev-nav,
| |
− | ~ .fs-next-nav {
| |
− | display: none !important;
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | }
| |
− |
| |
− | /* Autohide Prev/Next Navigation */
| |
− | @if $autohide-next-prev == true {
| |
− | &:hover {
| |
− | .fs-prev-btn,
| |
− | .fs-next-btn {
| |
− | @include fadeshow-transform(translateX(0));
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− | /*
| |
− | * ===== PREV/NEXT NAVIGATION =====
| |
− | *
| |
− | * This section handles the prev/next navigation.
| |
− | */
| |
− |
| |
− | /* Handle Prev/Next buttons */
| |
− | [data-am-fadeshow~="next-prev-navigation"] {
| |
− | input[type="radio"] {
| |
− |
| |
− | &:checked {
| |
− |
| |
− | $i: $max-slides;
| |
− |
| |
− | @while $i > 0 {
| |
− |
| |
− | &:nth-of-type(#{$i}) {
| |
− |
| |
− | $prev: ($i - 1);
| |
− | $next: ($i + 1);
| |
− |
| |
− | /* Show previous button */
| |
− | @if $prev > 0 {
| |
− | ~ .fs-prev-nav {
| |
− | .fs-prev-btn {
| |
− | display: none;
| |
− | }
| |
− | .fs-prev-btn:nth-child(#{$prev}) {
| |
− | display: block;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Show next button */
| |
− | @if $next < ($max-slides + 1) {
| |
− | ~ .fs-next-nav {
| |
− | .fs-next-btn {
| |
− | display: none;
| |
− | }
| |
− | .fs-next-btn:nth-child(#{$next}) {
| |
− | display: block;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Show last prev button if first slide */
| |
− | &:first-of-type {
| |
− | ~ .fs-prev-nav {
| |
− | .fs-prev-btn:last-child {
| |
− | display: block;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Show first next button if last slide */
| |
− | &:last-of-type {
| |
− | ~ .fs-next-nav {
| |
− | .fs-next-btn:first-child {
| |
− | display: block;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | $i: $i - 1;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Display first pair of Prev/Next Buttons on load */
| |
− | .fs-prev-btn:last-child {
| |
− | display: block;
| |
− | }
| |
− |
| |
− | .fs-next-btn:nth-child(2) {
| |
− | display: block
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− | /*
| |
− | * ===== AUTOPLAY =====
| |
− | *
| |
− | * Functions to handle autoplay.
| |
− | * If you're not going to use autoplay, set $autoplay to false.
| |
− | * This part tends to compile into a lot of uneccesary CSS otherwise.
| |
− | */
| |
− |
| |
− | @if $autoplay == true {
| |
− |
| |
− | $i: $max-slides;
| |
− |
| |
− | @while $i > 1 {
| |
− |
| |
− | $total-duration: $autoplay-duration * $i;
| |
− |
| |
− | @keyframes quickNavAnimation-#{$i} {
| |
− | 0% { @include quickNavBtnInactive(); }
| |
− | #{100% * $fade-time / $total-duration},
| |
− | #{100% * $autoplay-duration / $total-duration} { @include quickNavBtnActive(); }
| |
− | #{100% * ($autoplay-duration + $fade-time) / $total-duration},
| |
− | 100% { @include quickNavBtnInactive(); }
| |
− | }
| |
− | @if $prefix == true {
| |
− | @-webkit-keyframes quickNavAnimation-#{$i} {
| |
− | 0% { @include quickNavBtnInactive(); }
| |
− | #{100% * $fade-time / $total-duration},
| |
− | #{100% * $autoplay-duration / $total-duration} { @include quickNavBtnActive(); }
| |
− | #{100% * ($autoplay-duration + $fade-time) / $total-duration},
| |
− | 100% { @include quickNavBtnInactive(); }
| |
− | }
| |
− | }
| |
− |
| |
− | @keyframes slidesAnimation-#{$i} {
| |
− | 0% { opacity: 0; }
| |
− | #{100% * $fade-time / $total-duration},
| |
− | #{100% * $autoplay-duration / $total-duration} { opacity: 1; }
| |
− | #{100% * ($autoplay-duration + $fade-time) / $total-duration},
| |
− | 100% { opacity: 0; }
| |
− | }
| |
− | @if $prefix == true {
| |
− | @-webkit-keyframes slidesAnimation-#{$i} {
| |
− | 0% { opacity: 0; }
| |
− | #{100% * $fade-time / $total-duration},
| |
− | #{100% * $autoplay-duration / $total-duration} { opacity: 1; }
| |
− | #{100% * ($autoplay-duration + $fade-time) / $total-duration},
| |
− | 100% { opacity: 0; }
| |
− | }
| |
− | }
| |
− |
| |
− | [data-am-fadeshow~="autoplay"] {
| |
− | input[type="radio"]:nth-of-type(#{$i}):last-of-type {
| |
− |
| |
− | /* Slide animation */
| |
− | ~ .fs-slides {
| |
− | .fs-slide {
| |
− | @include fadeshow-animation(slidesAnimation-#{$i} #{$total-duration}s infinite);
| |
− | }
| |
− | }
| |
− |
| |
− | /* Quick navigation animation */
| |
− | ~ .fs-quick-nav {
| |
− | .fs-quick-btn {
| |
− | @include fadeshow-animation(quickNavAnimation-#{$i} #{$total-duration}s infinite);
| |
− | }
| |
− | }
| |
− |
| |
− | /* Animation Delay */
| |
− | @for $j from 1 through $i {
| |
− | ~ .fs-slides .fs-slide:nth-child(#{$j}),
| |
− | ~ .fs-quick-nav .fs-quick-btn:nth-child(#{$j}) {
| |
− | $animation-delay: #{($j - 1) * ($autoplay-duration) - $fade-time}s;
| |
− | @include fadeshow-animation-delay(#{$animation-delay});
| |
− | }
| |
− | }
| |
− |
| |
− | }
| |
− | $i: $i - 1;
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− | /* Base Styling */
| |
− |
| |
− | body {
| |
− | margin: 0;
| |
− | }
| |
− |
| |
− | .container {
| |
− | position: absolute;
| |
− | top: 0;
| |
− | bottom: 0;
| |
− | left: 0;
| |
− | right: 0;
| |
− | box-shadow: 0 0 20px rgba(0,0,0,0.1);
| |
− | overflow: hidden;
| |
| } | | } |
| </style> | | </style> |
− | <div class="container"> | + | <body> |
− |
| + | |
− | <div data-am-fadeshow="next-prev-navigation">
| + | |
− | | + | |
− | <!-- Radio -->
| + | |
− | <input type="radio" name="css-fadeshow" id="slide-1" />
| + | |
− | <input type="radio" name="css-fadeshow" id="slide-2" />
| + | |
− | <input type="radio" name="css-fadeshow" id="slide-3" />
| + | |
− | | + | |
− | <!-- Slides -->
| + | |
− | <div class="fs-slides">
| + | |
− | <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1460500063983-994d4c27756c?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2550);">
| + | |
− | <!-- Add content to images (sample) -->
| + | |
− | <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-family: sans-serif; text-align: center; text-shadow: 0 0 20px rgba(0,0,0,0.5);">
| + | |
− | <h1 style="margin-top: 0; margin-bottom: 0.8vw; font-size: 5vw; font-weight: bold;">CSS Fadeshow</h1>
| + | |
− | <p style="font-size: 2vw; font-weight: 100; margin-top: 0;">Easy to implement and use on <strong>your</strong> site!</p>
| + | |
− | </div>
| + | |
− | </div>
| + | |
− | <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1440557653082-e8e186733eeb?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2500);"></div>
| + | |
− | <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1449057528837-7ca097b3520c?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2500);"></div>
| + | |
− | </div>
| + | |
− | | + | |
− | <!-- Quick Navigation -->
| + | |
− | <div class="fs-quick-nav">
| + | |
− | <label class="fs-quick-btn" for="slide-1"></label>
| + | |
− | <label class="fs-quick-btn" for="slide-2"></label>
| + | |
− | <label class="fs-quick-btn" for="slide-3"></label>
| + | |
− | </div>
| + | |
− |
| + | |
− | <!-- Prev Navigation -->
| + | |
− | <div class="fs-prev-nav">
| + | |
− | <label class="fs-prev-btn" for="slide-1"></label>
| + | |
− | <label class="fs-prev-btn" for="slide-2"></label>
| + | |
− | <label class="fs-prev-btn" for="slide-3"></label>
| + | |
− | </div>
| + | |
− |
| + | |
− | <!-- Next Navigation -->
| + | |
− | <div class="fs-next-nav">
| + | |
− | <label class="fs-next-btn" for="slide-1"></label>
| + | |
− | <label class="fs-next-btn" for="slide-2"></label>
| + | |
− | <label class="fs-next-btn" for="slide-3"></label>
| + | |
− | </div>
| + | |
| | | |
− | </div>
| + | </body> |
− |
| + | |
− | </div>
| + | |
| </html> | | </html> |