Search code examples
csscss-selectorssasscompass-sass

How to shorten this placeholder-transitioning CSS selector using sass/compass?


So I decided to make a pretty animating search box (demo) with CSS transitions using SASS. I also wanted to animate the placeholder text, which involves four different pesudo-classes, and the source now looks like this:

input {
  background-image:url(search.png);
  background-repeat:no-repeat;
  background-size:20px 20px;
  background-position-x:12px;
  background-position-y:10px;
  background-color:#6E597E;
  box-shadow:0 0 5px #333 inset;
  border-radius:15px;
  border:0;
  padding:8px 10px 10px 45px;
  font-size:20px;
  font-weight:300;
  font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
  color:#BBB;
  width:100%;
  transition:all 0.5s ease;
  &:focus {
    outline:none;
    box-shadow:0 0 10px #333 inset;
    background-color:#85699A;
    color:#EEE;

    &::-webkit-input-placeholder { color:#DDD; }
    &:-moz-placeholder { color:#DDD; }
    &::-moz-placeholder { color:#DDD; }
    &:-ms-input-placeholder { color:#DDD; }
  }

  &::-webkit-input-placeholder {
     color: #BBB;
     transition:color 0.5s ease;
  }

  &:-moz-placeholder { /* Firefox 18- */
     color: #BBB;  
     transition:color 0.5s ease;
  }

  &::-moz-placeholder {  /* Firefox 19+ */
     color: #BBB;  
     transition:color 0.5s ease;
  }

  &:-ms-input-placeholder {  
     color: #BBB;  
     transition:color 0.5s ease;
  }
}

Is there any way to shorten / neaten this up using SASS or compass?


Solution

  • The best you can do is abstract your placeholders as a mixin:

    @mixin placeholder {
      &::-webkit-input-placeholder {
         @content;
      }
    
      &:-moz-placeholder { /* Firefox 18- */
         @content;
      }
    
      &::-moz-placeholder {  /* Firefox 19+ */
         @content;
      }
    
      &:-ms-input-placeholder {  
         @content;
      }
    }
    
    input {
      background-image:url(search.png);
      background-repeat:no-repeat;
      background-size:20px 20px;
      background-position-x:12px;
      background-position-y:10px;
      background-color:#6E597E;
      box-shadow:0 0 5px #333 inset;
      border-radius:15px;
      border:0;
      padding:8px 10px 10px 45px;
      font-size:20px;
      font-weight:300;
      font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
      color:#BBB;
      width:100%;
      transition:all 0.5s ease;
      &:focus {
        outline:none;
        box-shadow:0 0 10px #333 inset;
        background-color:#85699A;
        color:#EEE;
    
        @include placeholder { color:#DDD; }
      }
    
      @include placeholder {  
         color: #BBB;  
         transition:color 0.5s ease;
      }
    }