roy*_*wie 119 html javascript css jquery
我正在寻找一个图像轮播,用户可以通过点击箭头在图像之间切换.例如:
但是,我只能使用HTML和CSS - 没有JavaScript(因此,jQuery).我只需要基本设置; 平滑过渡等不是必需的.
我怎样才能完成这个?
roy*_*wie 167
这很简单!只需使用单选按钮和目标标签即可.
单选按钮具有(必要的)行为,只允许在任何时间选择一个 - 就像我们的旋转木马中的图像一样.
div.wrap2 {
float: left;
height: 500px;
width: 422px;
}
div.group input {
display: none;
left: -100%;
position: absolute;
top: -100%;
}
div.group input ~ div.content {
border: solid 1px black;
display: none;
height: 350px;
margin: 0px 60px;
position: relative;
width: 300px;
}
div.group input:checked ~ div.content {
display: block;
}
div.group input:checked ~ label.previous,
div.group input:checked ~ label.next {
display: block;
}
div.group label {
background-color: #69c;
border: solid 1px black;
display: none;
height: 50px;
width: 50px;
}
img {
left: 0;
margin: 0 auto;
position: absolute;
right: 0;
}
p {
text-align: center;
}
label {
font-size: 4em;
margin: 125px 0 0 0;
}
label.previous {
float: left;
padding: 0 0 30px 5px;
}
label.next {
float: right;
padding: 0 5px 25px 0;
text-align: right;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrap">
<div class="wrap2">
<div class="group">
<input type="radio" name="test" id="0" value="0">
<label for="4" class="previous"><</label>
<label for="1" class="next">></label>
<div class="content">
<p>panel #0</p>
<img src="http://i.stack.imgur.com/R5yzx.jpg" width="200" height="286">
</div>
</div>
<div class="group">
<input type="radio" name="test" id="1" value="1">
<label for="0" class="previous"><</label>
<label for="2" class="next">></label>
<div class="content">
<p>panel #1</p>
<img src="http://i.stack.imgur.com/k0Hsd.jpg" width="200" height="139">
</div>
</div>
<div class="group">
<input type="radio" name="test" id="2" value="2">
<label for="1" class="previous"><</label>
<label for="3" class="next">></label>
<div class="content">
<p>panel #2</p>
<img src="http://i.stack.imgur.com/Hhl9H.jpg" width="140" height="200">
</div>
</div>
<div class="group">
<input type="radio" name="test" id="3" value="3" checked="">
<label for="2" class="previous"><</label>
<label for="4" class="next">></label>
<div class="content">
<p>panel #3</p>
<img src="http://i.stack.imgur.com/r1AyN.jpg" width="200" height="287">
</div>
</div>
<div class="group">
<input type="radio" name="test" id="4" value="4">
<label for="3" class="previous"><</label>
<label for="0" class="next">></label>
<div class="content">
<p>panel #4</p>
<img src="http://i.stack.imgur.com/EHHsa.jpg" width="96" height="139">
</div>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
input(type="radio")
是checked
默认,或整个传送带将被隐藏.labels
正确定位上一个/下一个无线电输入(有关如何进行定位,请参阅最后的标签部分):checked
以下是基本HTML结构的外观:
div#holder
div.group
input(type="radio")
label.previous
label.next
div.content
img
div.group
// ... repeat as necessary
Run Code Online (Sandbox Code Playgroud)
div#holder
将保留我们所有的内容.然后,我们将我们的单选按钮,标签和图像分组在一个下面div.group
.这确保我们的无线电输入不会受到破坏性干扰(双关语)的影响.
首先,我们将隐藏我们的单选按钮 - 无论如何它们都很难看:
div.group input {
display: none;
position: absolute;
top: -100%;
left: -100%;
}
Run Code Online (Sandbox Code Playgroud)
我们不必单击单选按钮.相反,我们将设置标签样式并添加目标(for
属性),以便将点击重定向到相应的无线电输入块.
我们的大多数标签都应隐藏:
div.group label {
display: none;
}
Run Code Online (Sandbox Code Playgroud)
(我将省略所有美学风格,以便使样式更容易理解.您可以在堆栈代码中看到更好看的版本.)
除了切换到的无线电输入旁边的那些,或者 :checked
div.group input:checked ~ label.previous,
div.group input:checked ~ label.next {
display: block;
}
Run Code Online (Sandbox Code Playgroud)
此外,div.content
还应显示以下检查输入:
div.group input:checked ~ div.content {
display: block;
}
Run Code Online (Sandbox Code Playgroud)
但是,当未选中单选按钮时,div.content
应隐藏:
div.group input ~ div.content {
display: none;
position: relative;
}
Run Code Online (Sandbox Code Playgroud)
Bazinga!现在我们的旋转木马应该完全是功能性的,虽然有点难看.让我们将标签移动到正确的位置:
label.previous { float: left; }
label.next { float: right; }
Run Code Online (Sandbox Code Playgroud)
并将我们的图像集中在各自的div中:
img {
left: 0;
margin: 0 auto;
position: absolute;
right: 0;
}
Run Code Online (Sandbox Code Playgroud)
<input type="radio" id="1">
<label class="previous" for="0"><</label>
<label class="next" for="2">></label>
Run Code Online (Sandbox Code Playgroud)
注意如何给出一个无线电输入id
的n
,则label.previous
会有一个for
属性(n - 1) % M
和label.next
将有一个for
属性(n + 1) % M
,其中M
在转盘图像的数量.
如果您正在使用Jade(或其他一些模板引擎),您可以使用这样的简单for循环进行设置:
div.wrap2
- var imgs = [[200, 286], [200, 139], [140, 200], [200, 287], [96, 139]];
- for (var i = 0; i < imgs.length; i++)
div.group
input(type="radio" name="test" id="#{i}" value="#{i}" checked="#{input == 3}")
label(for="#{(i - 1 + imgs.length) % imgs.length}").previous <
label(for="#{(i + 1) % imgs.length}").next >
div.content
p panel ##{i}
img(src="http://placekitten.com/g/#{imgs[i].join('/')}"
height="#{imgs[i][1]}"
width="#{imgs[i][0]}"
)
Run Code Online (Sandbox Code Playgroud)
gue*_*314 44
注意,css
下面不符合Question的具体要求
用户可以通过单击箭头在图像之间切换.
利用伪类,缩略图作为控件在图像之间切换; 使用:target在Click如何触发CSS3 Transitions中描述的模式建模:target
body {
width: 70%;
overflow: hidden;
}
section {
position: relative;
display: block;
left: calc(50%);
}
/* set `div` container `background` to last `div img` `src` */
div {
display: inline-block;
position: relative;
height: 100px;
width: 100px;
background: url(http://lorempixel.com/100/100/cats);
border: 0.1em outset black;
}
/* set `img` `opacity:0` */
div img {
position: absolute;
transition: all 500ms ease-in-out;
-moz-transition: all 500ms ease-in-out;
-webkit-transition: all 500ms ease-in-out;
-o-transition: all 500ms ease-in-out;
-ms-transition: all 500ms ease-in-out;
opacity: 0;
}
/*
display `:target` `img` on click of `a`,
having `img` as fragment identifier
*/
div img:target {
opacity: 1;
animation: active 1s ease-in-out 0s normal 1 both;
-moz-animation: active 1s ease-in-out 0s normal 1 both;
-webkit-animation: active 1s ease-in-out 0s normal 1 both;
}
/* `.thumbs` `span` elements */
.thumbs {
height: 25px;
width: 25px;
padding: 1px;
display: inline-block;
position: relative;
text-align: center;
border: 0.1em inset black;
border-radius: 50px;
font-size: 1em;
}
/* set `background` of `.thumbs` `span` elements */
[href="#3"] .thumbs {
background: url(http://lorempixel.com/100/100/cats);
background-size: 100%;
background-repeat: no-repeat;
}
[href="#2"] .thumbs {
background: url(http://lorempixel.com/100/100/animals);
background-size: 100%;
background-repeat: no-repeat;
}
[href="#1"] .thumbs {
background: url(http://lorempixel.com/100/100/technics);
background-size: 100%;
background-repeat: no-repeat;
}
[href="#0"] .thumbs {
background: url(http://lorempixel.com/100/100/nature);
background-size: 100%;
background-repeat: no-repeat;
}
span:hover {
border-top: 0.1em solid gold;
border-left: 0.1em solid yellow;
border-bottom: 0.1em solid orange;
border-right: 0.1em solid goldenrod;
box-shadow: 0 0 0 0.125em sienna, 0 0 0 0.225em dodgerblue;
}
a {
top: 30%;
text-decoration: none;
display: inline-block;
position: relative;
color: transparent;
}
nav a {
left: -16px;
}
@keyframes active {
0% {
box-shadow: 0 0 0 0.125em dodgerblue, 0 0 0 0.25em yellow;
}
100% {
box-shadow: none;
}
}
@-webkit-keyframes active {
0% {
box-shadow: 0 0 0 0.125em dodgerblue, 0 0 0 0.25em yellow;
}
100% {
box-shadow: none;
}
}
@-moz-keyframes active {
0% {
box-shadow: 0 0 0 0.125em dodgerblue, 0 0 0 0.25em yellow;
}
100% {
box-shadow: none;
}
}
Run Code Online (Sandbox Code Playgroud)
<section>
<div>
<img src="http://lorempixel.com/100/100/nature" id="0" />
<img src="http://lorempixel.com/100/100/technics" id="1" />
<img src="http://lorempixel.com/100/100/animals" id="2" />
<img src="http://lorempixel.com/100/100/cats" id="3" />
</div>
<nav>
<a href="#3">
<span class="thumbs">
</span>
</a>
<a href="#2">
<span class="thumbs">
</span>
</a>
<a href="#1">
<span class="thumbs">
</span>
</a>
<a href="#0">
<span class="thumbs">
</span>
</a>
</nav>
</section>
Run Code Online (Sandbox Code Playgroud)
Woj*_*Maj 18
受到royhowie的启发,如果涉及HTML语法,我最终得到了一个更简单的解决方案.此外,有很好的动画和完全可定制!
主要的想法是创建箭头不是通过逐个放置HTML,而是通过创建然后仔细定位伪元素.
* {
-ms-box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.CSS_slideshow {
display: block;
width: 600px;
height: 425px;
overflow: hidden;
margin: 0 auto;
-ms-user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
text-space-collapse: trim-inner;
}
.CSS_slideshow[data-show-indicators="true"][data-indicators-position="in"] {
-webkit-margin-after: -25px; /* Removes the space under the slideshow. Webkit only as only Webkit-based browsers will support the dots in the wrapper */
}
/* Defines animation timing function */
.CSS_slideshow[data-animation-style] {
-moz-transition-timing-function: ease-in-out;
-webkit-transition-timing-function: ease-in-out;
transition-timing-function: ease-in-out;
}
/* Inherit all animation properties from parent element */
.CSS_slideshow[data-animation-style] *,
.CSS_slideshow[data-show-buttons="true"][data-animation-style] label:before,
.CSS_slideshow[data-show-buttons="true"][data-animation-style] label:after {
-moz-transition-duration: inherit;
-webkit-transition-duration: inherit;
transition-duration: inherit;
-moz-transition-timing-function: inherit;
-webkit-transition-timing-function: inherit;
transition-timing-function: inherit;
}
/* WRAPPER */
.CSS_slideshow_wrapper {
display: block;
width: 600px;
height: 400px;
position: relative;
/* Styling */
text-align: center;
}
/* Indicators */
.CSS_slideshow[data-show-indicators="true"] input {
width: 10px;
height: 10px;
outline: none;
position: relative;
top: calc(100% + 7px);
-ms-transform: scale(1); /* Fallback for Internet Explorer: supports radio button resizing, does not support :after. Not necessary, put for readibility. */
-moz-transform: scale(0.6); /* Fallback for Firefox: does not radio button resizing, does not support :after */
-webkit-appearance: none; /* hide radio buttons for Webkit: supports :after */
}
.CSS_slideshow[data-show-indicators="true"] input:checked {
-ms-transform: scale(1.25); /* Fallback for Internet Explorer: supports radio button resizing, does not support :after */
-moz-transform: scale(0.9); /* Fallback for Firefox: it does not do radio button resizing, does not support :after */
}
/* Webkit-only goodness - for now */
.CSS_slideshow[data-show-indicators="true"] input:after {
content: '';
display: block;
position: absolute;
left: 0;
width: 8px;
height: 8px;
border: 1px solid;
border-radius: 100%;
cursor: pointer;
z-index: 4;
-moz-transition-property: transform, background;
-webkit-transition-property: transform, background;
transition-property: transform, background;
}
.CSS_slideshow[data-show-indicators="true"][data-indicators-position="under"] input:after {
top: -2px;
background: rgba(0, 0, 0, 0);
border-color: rgb(0, 0, 0);
}
.CSS_slideshow[data-show-indicators="true"][data-indicators-position="in"] input:after {
top: -35px;
box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.25), 0 0 2px rgba(0, 0, 0, 0.25);
background: rgba(235, 235, 235, 0);
border-color: rgb(235, 235, 235);
}
.CSS_slideshow[data-show-indicators="true"] input:checked:after {
-webkit-transform: scale(1.25);
}
.CSS_slideshow[data-show-indicators="true"][data-indicators-position="under"] input:checked:after {
background: rgb(0, 0, 0)
}
.CSS_slideshow[data-show-indicators="true"][data-indicators-position="in"] input:checked:after {
box-shadow: 0 0 2px rgba(0, 0, 0, 0.25);
background: rgb(235, 235, 235);
}
.CSS_slideshow:not([data-show-indicators="true"]) input {
display: none;
}
/* SLIDES */
.CSS_slideshow label {
display: inline-block;
width: 100%;
height: 100%;
position: absolute;
top: 0;
}
.CSS_slideshow[data-animation-style="slide"] label {
-moz-transition-property: left;
-webkit-transition-property: left;
transition-property: left;
}
.CSS_slideshow label img {
width: 100%;
height: 100%;
}
/* Puts all the slides on the left... */
.CSS_slideshow label {
left: -100%;
}
/* ...except the ones coming after input:checked - those are put on the right... */
.CSS_slideshow input:checked ~ label {
left: 100%;
}
/* ...except the one coming directly after input:checked - this is our current slide and it's in the middle */
.CSS_slideshow input:checked + label {
left: 0;
}
/* PREV/NEXT ARROWS */
.CSS_slideshow[data-show-buttons="true"] label:before,
.CSS_slideshow[data-show-buttons="true"] label:after {
display: block;
position: absolute;
width: 60px;
height: 60px;
top: calc((100% - 60px) / 2);
/* Styling */
background: rgb(235, 235, 235);
font-size: 35px;
font-weight: 800;
font-family: Consolas;
line-height: 56px;
color: black;
z-index: 1;
cursor: pointer;
}
.CSS_slideshow[data-show-buttons="true"][data-animation-style="slide"] label:before,
.CSS_slideshow[data-show-buttons="true"][data-animation-style="slide"] label:after {
-moz-transition-property: left, right;
-webkit-transition-property: left, right;
transition-property: left, right;
}
.CSS_slideshow[data-show-buttons="true"] label:hover:before,
.CSS_slideshow[data-show-buttons="true"] label:hover:after {
/* Styling */
background: rgb(245, 245, 245);
}
/* Slides on the left */
/* Since the slides are on the left, we need to move the buttons 100% to the right */
.CSS_slideshow[data-show-buttons="true"] label:before {
right: -100%;
opacity: 0;
/* Styling */
content: '>'; /* next */
}
.CSS_slideshow[data-show-buttons="true"] label:after {
left: 100%;
opacity: 1;
/* Styling */
content: '<'; /* previous */
}
/* Slides on the right */
/* Since the slides are on the right, we need to move the buttons 100% to the left */
.CSS_slideshow[data-show-buttons="true"] input:checked ~ label:before {
right: 100%;
opacity: 1;
}
.CSS_slideshow[data-show-buttons="true"] input:checked ~ label:after {
left: -100%;
opacity: 0;
cursor: default;
}
/* Active slide */
/* And for the active slide - just usual positioning */
.CSS_slideshow[data-show-buttons="true"] input:checked + label:before {
right: 0;
opacity: 0;
cursor: default;
}
.CSS_slideshow[data-show-buttons="true"] input:checked + label:after {
left: 0;
}
/* Buttons positioning */
.CSS_slideshow[data-show-buttons="true"] label:after {
z-index: 3; /* move "previous" buttons forward... */
}
.CSS_slideshow[data-show-buttons="true"] input:checked ~ label:after {
z-index: 1; /* ...except the one for an active slide - this should be hidden - causes the "previous" arrow from the previous slide to be on top */
}
.CSS_slideshow[data-show-buttons="true"] input:checked + label + input + label:before {
z-index: 3; /* move "next" button one slide ahead forward - causes the "next" arrow from the next slide to be on top */
}
/* WRAP ARROWS */
/* We'll reuse "previous" arrow from the first slide and "next" arrow from the last to make "wrap" buttons, based on roughly the same principles */
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] label:first-of-type:before,
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] label:last-of-type:after {
z-index: 2 !important;
opacity: 1 !important;
cursor: pointer !important;
/* Styling */
letter-spacing: -9px;
text-align: left;
padding-left: 14px;
width: 46px;
}
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] label:first-of-type:before {
content: '<<'; /* jump to first */
right: 0 !important;
}
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] input:not(:checked) + label:first-of-type:before {
right: -100% !important;
}
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] label:last-of-type:after {
content: '>>'; /* jump to last */
left: 0 !important;
}
.CSS_slideshow[data-show-buttons="true"][data-show-wrap-buttons="true"] input:not(:checked) + label:last-of-type:after {
left: -100% !important;
}
/* Non-CSS slideshow CSS */
body {
font-family: Segoe UI, Tahoma, sans-serif;
font-size: 14px;
}
#license {
margin-top: 3em;
text-align: center;
font-size: 10px;
}
#license * {
font-size: 10px;
}
Run Code Online (Sandbox Code Playgroud)
<div
class="CSS_slideshow"
data-show-indicators="true"
data-indicators-position="in"
data-show-buttons="true"
data-show-wrap-buttons="true"
data-animation-style="slide"
style="-moz-transition-duration: 0.3s; -webkit-transition-duration: 0.3s; transition-duration: 0.3s;"
>
<div class="CSS_slideshow_wrapper">
<input type="radio" name="css3slideshow" id="slide1" checked /><!--
--><label for="slide1"><img src="https://placekitten.com/g/602/400" /></label><!--
--><input type="radio" name="css3slideshow" id="slide2" /><!--
--><label for="slide2"><img src="https://placekitten.com/g/605/400" /></label><!--
--><input type="radio" name="css3slideshow" id="slide3" /><!--
--><label for="slide3"><img src="https://placekitten.com/g/600/400" /></label><!--
--><input type="radio" name="css3slideshow" id="slide4" /><!--
--><label for="slide4"><img src="https://placekitten.com/g/603/400" /></label><!--
--><input type="radio" name="css3slideshow" id="slide5" /><!--
--><label for="slide5"><img src="https://placekitten.com/g/604/400" /></label>
</div>
</div>
<div id="license">
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" property="dct:title" rel="dct:type">Pure CSS slideshow</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://wojtekmaj.pl" property="cc:attributionName" rel="cc:attributionURL">Wojciech Maj</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a>.
</div>
Run Code Online (Sandbox Code Playgroud)
您可以在我的小提琴上阅读有关自定义和一些技术限制的更多信息.