Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

Is there a way one can create an image slider using just CSS3 and HTML
but without using any of the HTML input (radio) elements and no JavaScript?

I had a massive search sessions and found stuff that was close and worked well, but was using the HTML radio input.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
246 views
Welcome To Ask or Share your Answers For Others

1 Answer

Pure CSS carousel

(...Since you're not allowed to use input radio elements to maintain the active state...)
there's another way to make a sliding gallery in pure CSS(3) using the :target pseudo.

  • :target become those id="foo" elements who are referenced by a clicked anchor with URI Fragment (Hash) href="#foo"

  • In CSS, using :target pseudo you can than reference down-the-tree to other sibling elements using ~ (General sibling selectors), and than you can further access their child elements (slides, buttons etc) as usual.

  • Tip: If you don't like the "feature" of the gallery messing with your URL fragments (Browser Back button triggering a gallery slide instead of navigating the history!), you can always sandbox it - calling your gallery file into an <iframe>.

html, body{height:100%;}
body{font:15px/1 sans-serif; margin:0;}

/*
RESPONSIVE CSS3 SLIDE CAROUSEL GALLERY
http://stackoverflow.com/a/34696029/383904
*/

.CSSgal{
  position: relative;
  overflow: hidden;
  height:   100%; /* Or set a fixed height */
}

/* SLIDER */
.CSSgal .slider{
  height:      100%;
  white-space: nowrap;
  font-size:   0;
  transition:  0.8s;
}

/* SLIDES */
.CSSgal .slider > *{
  font-size:       1rem;
  display:         inline-block;
  vertical-align:  top;
  height:          100%;
  width:           100%;
  background:      none 50% no-repeat;
  background-size: cover;
}

/* PREV/NEXT, CONTAINERS & ANCHORS */
.CSSgal .prevNext{
  position: absolute;
  z-index:  1;
  top:      50%;
  width:    100%;
  height:   0;
}
.CSSgal .prevNext > div+div{
  visibility: hidden; /* Hide all but first P/N container */
} 
.CSSgal .prevNext a{
  background:  #fff;
  position:    absolute;
  width:       40px;
  height:      40px;
  line-height: 40px;
  text-align:  center;
  opacity:     0.7;
  text-decoration:   none;
  -webkit-transform: translateY( -50% );
          transform: translateY( -50% );
}
.CSSgal .prevNext a:hover{
  opacity: 1;
}
.CSSgal .prevNext a+a{
  right: 0px;
}

/* NAVIGATION */
.CSSgal .bullets{
  position:   absolute;
  z-index:    2;
  bottom:     0;
  padding:    10px 0;
  width:      100%;
  text-align: center;
}
.CSSgal .bullets > a{
  display:         inline-block;
  width:           20px;
  height:          20px;
  line-height:     20px;
  text-decoration: none;
  text-align:      center;
  border-radius:   50%;
  background:      rgba(255,255,255,1);
}
.CSSgal .bullets > a+a{
  background: rgba(255,255,255,0.5); /* Dim all but first */
}
.CSSgal .bullets > a:hover{
  background: rgba(0,255,255,0.9);
}

/* ACTIVE NAVIGATION ANCHOR */
.CSSgal >s:target ~ .bullets >* { background: rgba(255,255,255,0.5); }
#s1:target ~ .bullets >*:nth-child(1){ background: rgba(255,255,255,  1); }
#s2:target ~ .bullets >*:nth-child(2){ background: rgba(255,255,255,  1); }
#s3:target ~ .bullets >*:nth-child(3){ background: rgba(255,255,255,  1); }
#s4:target ~ .bullets >*:nth-child(4){ background: rgba(255,255,255,  1); }

/* PREV/NEXT CONTAINERS VISIBILITY */
.CSSgal >s:target ~ .prevNext >* { visibility:  hidden; }
#s1:target ~ .prevNext >*:nth-child(1){ visibility: visible; }
#s2:target ~ .prevNext >*:nth-child(2){ visibility: visible; }
#s3:target ~ .prevNext >*:nth-child(3){ visibility: visible; }
#s4:target ~ .prevNext >*:nth-child(4){ visibility: visible; }

/* SLIDER ANIMATION POSITIONS */
#s1:target ~ .slider{ transform: translateX(   0%); -webkit-transform: translateX(   0%); }
#s2:target ~ .slider{ transform: translateX(-100%); -webkit-transform: translateX(-100%); }
#s3:target ~ .slider{ transform: translateX(-200%); -webkit-transform: translateX(-200%); }
#s4:target ~ .slider{ transform: translateX(-300%); -webkit-transform: translateX(-300%); }
<div class="CSSgal">

  <!-- Don't wrap targets in parent -->
  <s id="s1"></s> 
  <s id="s2"></s>
  <s id="s3"></s>
  <s id="s4"></s>

  <div class="slider">
    <div style="background:#5fc;">Slide 1</div>
    <div style="background-image:url('//i.imgur.com/squw4Fw.jpg');"></div>
    <div style="background:#fc5;">Slide 3</div>
    <div style="background:#f5c;">Slide 4</div>
  </div>
  
  <div class="prevNext">
    <div><a href="#s4">4</a><a href="#s2">2</a></div>
    <div><a href="#s1">1</a><a href="#s3">3</a></div>
    <div><a href="#s2">2</a><a href="#s4">4</a></div>
    <div><a href="#s3">3</a><a href="#s1">1</a></div>
  </div>

  <div class="bullets">
    <a href="#s1">1</a>
    <a href="#s2">2</a>
    <a href="#s3">3</a>
    <a href="#s4">4</a>
  </div>

</div>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...