Home  >  Article  >  Web Front-end  >  Pure CSS alternative to drop-down selection box select_html/css_WEB-ITnose

Pure CSS alternative to drop-down selection box select_html/css_WEB-ITnose

WBOY
WBOYOriginal
2016-06-24 11:58:171383browse

这篇教程中,我将给大家展示表单元素下拉选择框select的CSS替代方案。该方法采用css来实现,看上去非常简单。我们用radio标签列表来模拟下拉列表,选择一个radio可以很好的模拟出select中选择一个元素的效果。

一:HTML

下面是我们在form表单里面用到的html代码:

.代码 

  1.   
  2.         
      
  3.                 
    Choose your beer
      
  4.                 
        
    •                         
    •   
    •                                   
    •                                   
    •                         
    •   
    •                         
    •   
    •                                   
    •                                   
    •                         
    •   
    •                         
    •   
    •                                   
    •                                   
    •                         
    •   
    •                         
    •   
    •                                   
    •                                   
    •                         
    •   
    •                 
      
  5.         
  • 2: Logic sketch

    For the explanation It seems more intuitive. I tried to draw the following sketch to describe it. I hope it can be expressed clearly. Front-end UI sharing

    3: CSS code

    In order to make the tutorial look more concise, I have omitted some CSS code for visual effects. (For example, the CSS for drawing the arrow part) - You can view the full version of the code in the attachment. For the same reason I've also omitted prefixes that can be specific to different browsers.

    css of radio-container:

    .code

    1. radio-container {
    2. position: relative;
    3. height: 4em; /* 3em (being the max-height of the inner container) 1em ("margin") */
    4. }
    5. .radio-container:hover {
    6. z-index: 9999; }

    CSS of elements contained in radio-container: Front-end UI sharing

    .code

    1. .radio-options {
    2. position: absolute;
    3. max -height: 3em;
    4. width: 100%;
    5. overflow: hidden;
    6. transition: 0.7s;
    7. }
    8. .radio-options:hover {
    9. max-height: 100em;
    10. }

    then

    .code

    1. .radio-options .toggle {
    2. position: relative;
    3. cursor: pointer;
    4. padding: 0.75em;
    5. background: darkgreen;
    6. border-radius: 10px;
    7. z-index: 1; }
    8. * li are stacked at the same position as .toggle, only .toggle is visible */
    9. .radio-options li {
    10. position: absolute;
    11. top: 0 ;
    12. left: 0;
    13. width: 100%;
    14. height: 100%;
    15. }
    16. .radio-options label {
    17. display: block;
    18. opacity: 0;
    19. transition: 0s; }

    In order to hide the input, we can use display: none to achieve the goal, but this method will not focus on the relevant input when clicking the label in some browsers (such as some mobile browsers). Front-end UI sharing

    .code

    1. .radio-options input {
    2. position: absolute;
    3. top: 0;
    4. left: 0;
    5. width: 300px;
    6. height: 3em;
    7. opacity: 0;
    8. z-index:1;
    9. cursor: pointer;
    10. }

    Four: Move the mouse up css code

    According to the above code, let’s take a closer look at what happens when the hover goes up. The z-index of .radio-container is a very large value, and at the same time, the z-index of .radio-options The max-height attribute has also become larger (to 100em), we continue:

    . Code

    1. /* li elements have a normal flow within the .radio-options container */  
    2. .radio-options:hover li {  
    3.     position: relative; }  
    4. .radio-options:hover label {  
    5.     opacity: 1;  
    6.     transition: 0.5s; }  

     

    五:选中状态

    To style the checked option we will use the general sibling selector. It uses a tilde character combinator (E ~ F) and matches elements that are siblings of a given element. The first element (E) has to occur before the second (F) one and they have to share the same parent (li items in our case).前端UI分享


    If one of the radio is checked, we’ll see its label instead of the toggle :

    .代码 

    1. .radio-options input:checked ~ label {  
    2.    position: absolute;  
    3.    top: 0;  
    4.    left: 0;  
    5.    right: 0;  
    6.    opacity: 1;  
    7. /* is above the .toggle so is visible */  
    8.    z-index: 2;  
    9. /* has tha same styles as .toggle */  
    10.    padding: 0.75em;  
    11.    background: darkgreen;  
    12.    border-radius: 10px; }  

     

    On hover it returns to the normal flow

    .代码 

    1. .radio-options:hover input:checked ~ label {  
    2.   position: static;  
    3.   border-radius: 0; }  

     

    六:移动设备上所需的修正

    因为我们响应的是鼠标的hover事件,所以必须针对移动设备做响应(移动设备没有鼠标)。一种解决办法是将radio 的label始终可见。我先用用自定义的modernizr build来检测触摸设备,然后添加如下的脚本:

    .代码 

    1. $(document).ready(function(){  
    2.         if (Modernizr.touch) {  
    3.                         $(".radio-options").bind("click", function(event) {  
    4.                                 if (!($(this).parent('.radio-container').hasClass("active")))   {  
    5.                                 $(this).parent('.radio-container').addClass("active");  
    6.                                 event.stopPropagation();  
    7.                                 }  
    8.                         });      
    9.         $(".toggle").bind("click", function(){  
    10.                 $(this).parents('.radio-container').removeClass("active");  
    11.                 return false;  
    12.                  });   
    13.         }  
    14. })  

     

    在css中我如下修改每一个:hover的定义: 前端UI分享

    .代码 

    1. .no-touch .radio-container:hover, .active.radio-container  {  
    2.     z-index: 9999; }  
    3. .no-touch .radio-options:hover, .active .radio-options {  
    4.   max-height: 100em;  
    5. }  
    6. .no-touch .radio-options:hover li,  .active .radio-options li {  
    7.     position: relative; }  
    8. .no-touch .radio-options:hover label, .active .radio-options label {  
    9.     opacity: 1;  
    10.     transition: 0.5s; }  
    11. ....  

     

    七:IE8下如何处理

    是否兼容IE8取决于你自己,这部分并不是本教程的重点

    .代码 

    1.   

     

    css

    .code

    1. .radio-options .checked label {
    2. position: absolute;
    3. top: 0 ;
    4. left: 0;
    5. right: 0;
    6. padding: 0.75em;
    7. background: #1b9e4d;
    8. visibility : visible;
    9. z-index: 2; }
    10. .... That helps, thank you.
    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Previous article:Output style of ADF page_html/css_WEB-ITnoseNext article:Output style of ADF page_html/css_WEB-ITnose

    Related articles

    See more