【问题标题】:Pure CSS 3 image slider - without JavaScript or radio inputs纯 CSS 3 图像滑块 - 没有 JavaScript 或无线电输入
【发布时间】:2022-03-31 22:56:43
【问题描述】:

有没有一种方法可以仅使用 CSS 3 和 HTML 创建图像滑块, 但是没有使用任何 HTML input(无线电)元素并且没有 JavaScript?

我进行了大量搜索,发现了与 worked well 很接近的内容,但它使用的是 HTML 单选输入。

【问题讨论】:

  • 你应该永远记住,Web 开发中的 CSS 层与行为/结构和内容无关。 CSS是样式层,所以它是关于样式的。您不能仅通过样式滑动图像。
  • 是什么让你知道画廊滑块需要输入元素的信息?你有没有做过任何研究?有什么代码可以分享吗?什么以及为什么它对您不起作用?
  • 您必须使用链接片段(例如 /#image1)在同一页面上的图像之间导航,并将它们全部包含在某个固定的容器 div 中。这将使页面每次跳转到固定 div 的顶部。这就是我们15年前所做的!今天有更优雅的解决方案。为什么要求这么严格?
  • @Cyval 这不再是真的了。
  • @RokoC.Buljan 让我认为必须使用输入的是我遇到的所有东西都使用了输入元素。它是为 eBay 设计的,在那里你不能在你的列表中使用 JavaScript 或 Input 元素。

标签: html css


【解决方案1】:

纯 CSS 轮播

(...因为您不允许使用 input radio 元素来保持活动状态...)
还有另一种方法可以使用 :target pseudo 在纯 CSS(3) 中制作滑动图库

  • :target 成为那些被单击的锚点引用的id="foo" 元素,URI 片段(哈希)href="#foo"

  • 在 CSS 中,使用 :target 伪,您可以使用 ~通用同级选择器)在树下引用其他同级元素,并且可以进一步访问它们的子元素(幻灯片、按钮等)像往常一样。

  • 提示:如果您不喜欢图库的“功能”弄乱您的 URL 片段浏览器后退按钮触发图库幻灯片而不是浏览历史记录!),您始终可以将其沙盒化 - 将您的图库文件调用到<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>

【讨论】:

  • @Ciwan 不客气。请注意,以上在旧浏览器中不起作用 1. 导致使用 CSS3 过渡,2. 导致 CSS ~ 选择器。另外不要忘记添加所有必要的 -vendor- 前缀,例如 -webkit-transition 等...
  • 有没有办法让它使用箭头而不是活动子弹?左右两个箭头?
  • @Ciwan 使 HTML(和 CSS)复杂化了很多,但它是可行的。简单地说,对于每张幻灯片,您都需要一对带有正确 URI 片段(哈希)href="#sN" 的 PREV/NEXT 按钮(锚点),它将相应地指向上一张/下一张幻灯片。
  • 如何添加超过 4 张幻灯片? ?想通了。您也必须更改 CSS。虽然很好,但这不是一个非常可扩展的解决方案。添加额外幻灯片需要进行太多更改。
  • @Shardul 好吧,如果您创建一个工具(使用 JavaScript 或其他工具)来帮助制作,则不会。但现在,它不是动态的。如果您需要动态的东西而不是根本不需要静态 HTML/CSS-only 解决方案。您可以使用 JS 滑块。
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多