选项卡

  1. <style>
  2. * {
  3. padding: 0;
  4. margin: 0;
  5. box-sizing: border-box;
  6. }
  7. li {
  8. list-style: none;
  9. }
  10. .tabs {
  11. width: 10em;
  12. margin: 0 auto;
  13. }
  14. .tabs ul.tab {
  15. display: flex;
  16. height: 2em;
  17. background-color: #fff;
  18. }
  19. .tabs ul.tab li {
  20. flex: auto;
  21. text-align: center;
  22. line-height: 2em;
  23. }
  24. .tabs .item {
  25. background-color: slategrey;
  26. display: none;
  27. }
  28. .tab li.active {
  29. background-color: slategrey;
  30. }
  31. .item.active {
  32. display: block;
  33. }
  34. </style>
  35. <div class="tabs">
  36. <ul class="tab">
  37. <li data-index="1" class="active">省内</li>
  38. <li data-index="2">国内</li>
  39. <li data-index="3">国际</li>
  40. </ul>
  41. <ul data-index="1" class="item active">
  42. <li>这是省内</li>
  43. <li>这是省内</li>
  44. <li>这是省内</li>
  45. <li>这是省内</li>
  46. </ul>
  47. <ul data-index="2" class="item">
  48. <li>这是国内</li>
  49. <li>这是国内</li>
  50. <li>这是国内</li>
  51. </ul>
  52. <ul data-index="3" class="item">
  53. <li>这是国际</li>
  54. <li>这是国际</li>
  55. <li>这是国际</li>
  56. </ul>
  57. </div>
  58. <script>
  59. const tab = document.querySelector('.tab');
  60. const items = document.querySelectorAll('.item');
  61. tab.onclick = (ev) => {
  62. //事件绑定对象 ev.currentTarget
  63. //事件触发对象 ev.target
  64. //1 情况之前所有处于激活状态的选项卡,并将当前点击对象激活
  65. [...tab.children].forEach(item => item.classList.remove('active'));
  66. ev.target.classList.add('active');
  67. //2 根据自定义属性data-index找到对应的列表并显示出来
  68. items.forEach(item => item.classList.remove('active'));
  69. [...items].filter(item => item.dataset.index === ev.target.dataset.index)[0].classList.add('active');
  70. }
  71. </script>

切换背景图

  1. .container {
  2. display: grid;
  3. grid-template-columns: repeat(3, 2em);
  4. gap: .2em;
  5. }
  6. .container img {
  7. width: 100%;
  8. border: 1px solid #ddd;
  9. }
  10. body {
  11. background-image: url(1.jpg)
  12. }
  13. <body>
  14. <div class="container">
  15. <img src="1.jpg" alt="">
  16. <img src="2.png" alt="">
  17. <img src="3.png" alt="">
  18. </div>
  19. </body>
  20. <script>
  21. const container = document.querySelector('.container');
  22. container.onclick = (ev) => {
  23. document.body.style.backgroundImage = "url(" + ev.target.src + ")";
  24. }
  25. </script>

简单实现懒加载

  1. <body>
  2. <!-- //当要显示的图片进入到窗口的可视区时,使用data-src的值将src替换 -->
  3. <img src="1.jpg" alt="" data-src="1.jpg">
  4. <img src="1.jpg" alt="" data-src="2.png">
  5. <img src="1.jpg" alt="" data-src="3.png">
  6. </body>
  7. <script>
  8. // //视口高度
  9. // let viewHeight = document.documentElement.clientHeight;
  10. // //滚动高度
  11. // let scrollTop = document.documentElement.scrollTop;
  12. // window.onscroll = ev => console.log(document.documentElement.scrollTop);
  13. // const img = document.querySelector('img');
  14. // window.onscroll = ev => img.src = img.dataset.src;
  15. const imgs = document.querySelectorAll('img');
  16. const clientHeight = document.documentElement.clientHeight;
  17. window.addEventListener('scroll', layzyload);
  18. //首次加载自动执行
  19. window.addEventListener('load', layzyload)
  20. function layzyload() {
  21. //滚动高度
  22. let scrollTop = document.documentElement.scrollTop;
  23. //遍历图片并判断是否进入可是区
  24. imgs.forEach(img => {
  25. //只要当前图片距离文档顶部的偏移量小于可视区高度与滚动高度之间的距离则表示进入可视区
  26. if (img.offsetTop < clientHeight + scrollTop) {
  27. img.src = img.dataset.src;
  28. }
  29. })
  30. }
  31. </script>

简单实现轮播图案例

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. }
  7. li {
  8. list-style: none;
  9. }
  10. a {
  11. text-decoration: none;
  12. }
  13. ul.imgs {
  14. width: 1000px;
  15. margin: 0 auto;
  16. }
  17. ul.imgs .active {
  18. display: block;
  19. }
  20. ul.imgs li img {
  21. width: 100%;
  22. display: none;
  23. }
  24. .container {
  25. position: relative;
  26. margin: 0 auto;
  27. }
  28. div.btns {
  29. width: 140px;
  30. position: absolute;
  31. bottom: 120px;
  32. left: 50%;
  33. margin-left: -70px;
  34. display: flex;
  35. justify-content: space-evenly;
  36. }
  37. div.btns a {
  38. display: flex;
  39. width: 30px;
  40. height: 30px;
  41. border-radius: 50%;
  42. background-color: #fff;
  43. }
  44. div.btns a.active {
  45. background-color: sienna;
  46. }
  47. .prev,
  48. .next {
  49. position: absolute;
  50. height: 50px;
  51. width: 50px;
  52. top: 50%;
  53. margin-top: -25px;
  54. margin-left: -75px;
  55. text-align: center;
  56. line-height: 50px;
  57. }
  58. .prev {
  59. left: 25%;
  60. }
  61. .next {
  62. right: 25%;
  63. margin-right: -75px;
  64. }
  65. </style>
  66. <body>
  67. <div class="container">
  68. <ul class="imgs">
  69. <li>
  70. <a href=""><img src="1.jpg" alt="" data-index="1" class="active"></a>
  71. </li>
  72. <li>
  73. <a href=""><img src="2.png" alt="" data-index="2"></a>
  74. </li>
  75. <li>
  76. <a href=""><img src="3.png" alt="" data-index="3"></a>
  77. </li>
  78. <li>
  79. <a href=""><img src="2.png" alt="" data-index="4"></a>
  80. </li>
  81. </ul>
  82. <div class="btns">
  83. </div>
  84. <a href="javascript:;" class="next">&gt;</a>
  85. <a href="javascript:;" class="prev">&lt;</a>
  86. </div>
  87. </body>
  88. <script>
  89. //所有图
  90. const imgs = document.querySelectorAll('.container .imgs img');
  91. //小圆圈
  92. const btnsGroup = document.querySelector('.container .btns');
  93. //上一个
  94. document.querySelector('.next').addEventListener('click', () => {
  95. let imgIndex = parseInt(getActiveEle(imgs).dataset.index);
  96. setActiveEle((imgIndex === imgs.length ? 1 : imgIndex + 1).toString());
  97. })
  98. //下一个
  99. document.querySelector('.prev').addEventListener('click', () => {
  100. let imgIndex = parseInt(getActiveEle(imgs).dataset.index);
  101. setActiveEle((imgIndex === 1 ? imgs.length : imgIndex - 1).toString());
  102. })
  103. //1创建一组与图片数量对应的小按钮
  104. function autoCreateBtns(ele, imgLength) {
  105. // 创建一个虚拟的节点对象
  106. const frag = document.createDocumentFragment();
  107. //创建对应的
  108. for (let i = 0; i < imgLength; i++) {
  109. const a = document.createElement('a');
  110. a.href = 'javascript:;';
  111. a.dataset.index = i + 1;
  112. if (i === 0) a.classList.add('active');
  113. frag.appendChild(a);
  114. }
  115. ele.appendChild(frag);
  116. }
  117. autoCreateBtns(btnsGroup, imgs.length);
  118. //所有小圆圈
  119. const btns = document.querySelectorAll('.btns > *')
  120. //获取激活的元素
  121. function getActiveEle(eles) {
  122. let actives = [...eles].filter(img => img.classList.contains('active'));
  123. return actives.shift();
  124. }
  125. //设置激活的元素,根据按钮索引更新正则显示的图片
  126. function setActiveEle(btnIndex) {
  127. [imgs, btns].forEach(arr => {
  128. getActiveEle(arr).classList.remove('active');
  129. arr.forEach(item => {
  130. if (item.dataset.index === btnIndex) {
  131. item.classList.add('active');
  132. }
  133. })
  134. })
  135. }
  136. //为每一个小圆圈添加事件
  137. btns.forEach(btn => btn.addEventListener('click', ev => setActiveEle(ev.target.dataset.index)));
  138. //自动播放
  139. let timer = '';
  140. autoMove();
  141. function autoMove() {
  142. timer = setInterval(() => {
  143. document.querySelector('.prev').click()
  144. }, 2000)
  145. }
  146. const move = document.querySelector('.container');
  147. move.addEventListener('mouseout', () => autoMove());
  148. move.addEventListener('mouseover', () => clearInterval(timer));
  149. </script>

更多相关文章

  1. android ViewPager 自适应高度
  2. 如何在Android5.1系统上实现RecyclerView高度自适应
  3. Android自定义SeekBar样式,遇到的进度条高度问题
  4. 安卓学习随笔 -- 自定义标题栏
  5. android之ScrollView里嵌套ListView
  6. 【Android】TabLayout 自定义指示器 Indicator 样式
  7. Android获取屏幕宽高
  8. Android(安卓)PopupWindow与ListView配合使用
  9. Android布局中ScrollView与ListView的冲突

随机推荐

  1. java数组的拷贝四种方法:for、clone、Syst
  2. “java.exe”已退出,代码为 1。
  3. 经典算法问题的java实现
  4. java高并发测试实例(精确到几百纳秒)
  5. java中的大事件
  6. 给定一个整数数组,找出两个下标,要求后面下
  7. JavaWeb中GET请求url传参中文乱码问题
  8. 黑马程序员-异常小结
  9. 如何在泽西Rest Webservice中接受json数
  10. 栅栏(CyclicBarrier类)的用法