css переход с линейным градиентом

Я пытаюсь добавить переход к кнопке, которая у меня есть, фон сделан с помощью css linear-gradient, но он не работает.

Это CSS для моей кнопки.

a.button
{
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,@green), color-stop(100%,#a5c956));
-webkit-transition: background 5s linear;
}

a.button:hover
{
-webkit-gradient(linear, left top, left bottom, color-stop(0%,@greenhover), color-stop(100%,#89af37))
}

Если вам интересно, что такое @green и @greenhover, я использую .less для создания своего css.

Что-то не так? Любые идеи?


person Johan Alkstål    schedule 09.09.2011    source источник
comment
Я просто хочу намекнуть на мой ответ, потому что все ответы относятся к изменению непрозрачности, и это неудовлетворительно .. надеюсь, вы согласны, и вы все найдете, что это помогает   -  person Biskrem Muhammad    schedule 02.02.2018


Ответы (9)


К сожалению, сейчас вы действительно не можете переходить с градиентов.

Итак, единственный работоспособный обходной путь - использовать дополнительный элемент с необходимым градиентом и изменить его непрозрачность:

a.button {
  position: relative;
  z-index: 9;
  display: inline-block;
  padding: 0 10px;
  background: -webkit-gradient(linear, 0 0, 0 100%, from(green), to(#a5c956));
  background: -webkit-linear-gradient(top, green, #a5c956);
  background: -moz-linear-gradient(top, green, #a5c956);
  background: -o-linear-gradient(top, green, #a5c956);
  background: linear-gradient(top, green, #a5c956);
}

.button-helper {
  position: absolute;
  z-index: -1;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  background: -webkit-gradient(linear, 0 0, 0 100%, from(lime), to(#89af37));
  background: -webkit-linear-gradient(top, lime, #89af37);
  background: -moz-linear-gradient(top, lime, #89af37);
  background: -o-linear-gradient(top, lime, #89af37);
  background: linear-gradient(top, lime, #89af37);
  -webkit-transition: opacity 1s linear;
  -moz-transition: opacity 1s linear;
  -o-transition: opacity 1s linear;
  transition: opacity 1s linear;
}

a.button:hover .button-helper {
  opacity: 1;
}
<a href="#" class="button"><span class="button-helper"></span>button</a>

person kizu    schedule 09.09.2011
comment
Это устарело, элементы psudo теперь работают нормально - person Dave Lunny; 13.04.2015
comment
Это не всегда дает одинаковые результаты. Вы можете использовать SVG, чтобы вместо этого иметь реальный переход - person Zach Saucier; 19.04.2016
comment
вместо решения svg, которое я нашел, это очень приятно проверить мое решение - person Biskrem Muhammad; 02.02.2018

это сложно .. и конечно же сложно - это круто;)

хорошо .. у меня есть решение. и в основном это делается с помощью замечательного селектора :before

#cool-hover{
	width: 120px;
	height: 120px;
	display: block;
	cursor: pointer;
	border-radius: 10px;
	box-shadow: 0 0 15px rgba(0,0,0,0.3);
	margin: 0px auto 24px auto;
	transition: all 0.5s;
	position: relative;
	overflow: hidden;
}
#cool-hover:before{
	border-radius: inherit;
	display: block;
	width: 200%;
	height: 200%;
	content: '';
        position: absolute;
        top: 0; 
        left: 0;
	background: linear-gradient(135deg, #21d4fd 25%, #b721ff 75%);	
	transition: all 0.5s;
	transform: translate(-25%, -25%);
	z-index: 0;
}
#cool-hover:after{
	border-radius: 9px;
	display: block;
	width: 108px;
	height: 108px;
	margin: 6px;
	background: url('https://i.imgur.com/w0BjFgr.png');
	background-size: cover;
	content: '';
	position: absolute;
	top: 0; left: 0;
	z-index: 1;
}
#cool-hover:hover:before{
	transform: translate(-25%, -25%) rotate(-180deg);
}
#cool-hover:hover{
	box-shadow: 0 0 35px rgba(0,0,0,0.3);
}
<div id="cool-hover"></div>


ПРИМЕЧАНИЕ: я просто добавил :after класс sudo только для небольшого заполнителя изображения сверху ..

приятного классного стиля;)

person Biskrem Muhammad    schedule 02.02.2018

Вы можете имитировать градиентные переходы, используя тени! Например, с одной из моих страниц:

c { 
color: #FFF;
background: #000;
border-style:solid;
border-color:#CCC;
border-width: 0 0 0 1px;
box-shadow: 2px 2px 2px #555, inset 0 25px 20px -10px rgba(255, 255, 255, 0.3),
    inset 0 -15px 20px -10px rgba(0, 0, 0, 0.15);
-moz-box-shadow: 2px 2px 2px #555, inset 0 25px 20px -10px rgba(255, 255, 255, 0.3),
    inset 0 -15px 20px -10px rgba(0, 0, 0, 0.15);
-o-box-shadow: 2px 2px 2px #555, inset 0 25px 20px -10px rgba(255, 255, 255, 0.3),
    inset 0 -15px 20px -10px rgba(0, 0, 0, 0.15);
-webkit-box-shadow: 2px 2px 2px #555,
    inset 0 25px 20px -10px rgba(255, 255, 255, 0.3),
    inset 0 -15px 20px -10px rgba(0, 0, 0, 0.15);
-moz-transition: background-color .5s ease; 
-o-transition: background-color .5s ease; 
-webkit-transition: background-color .5s ease-in-out; 
transition: background-color .5s ease;
}

С последующим:

c:hover {
color:#FFF;
background: #505;
position:relative;
top:1px;
box-shadow: -1px -1px -1px #555,inset 0 20px 20px -10px rgba(0, 0, 0, 0.15), 
        inset 0 -15px 20px -10px rgba(255, 255, 255, 0.3);
-moz-box-shadow: -1px -1px -1px #555,inset 0 20px 20px -10px rgba(0, 0, 0, 0.15),
    inset 0 -15px 20px -10px rgba(255, 255, 255, 0.3);
-o-box-shadow: -1px -1px -1px #555, inset 0 20px 20px -10px rgba(0, 0, 0, 0.15), 
        inset 0 -15px 20px -10px rgba(255, 255, 255, 0.3);
-webkit-box-shadow: 1px -1px -1px #555, inset 0 20px 20px -10px rgba(0, 0, 0, 0.15), 
    inset 0 -15px 20px -10px rgba(255, 255, 255, 0.3);
}

Здесь вы, по сути, используете вставленную тень в качестве маски, подобной Photoshop, вызывая эффект градиента на нижележащем элементе. При наведении вы инвертируете эффект.

person Mark Choi    schedule 20.04.2013
comment
У него довольно ужасная производительность, если только это не очень незначительный переход. - person Zach Saucier; 19.04.2016

Я знаю это довольно давно, но пока не нашел хорошего решения. Итак, вот мое решение

Сначала сделайте градиент на: before и скройте его с помощью непрозрачности, затем при наведении курсора выберите непрозрачность перехода 1.

https://jsfiddle.net/sumon380/osqLpboc/3/

.button {
    text-decoration: none;
    padding: 10px 25px;
    font-size: 20px;
    color: #333;
    display: inline-block;
    background: #d6e9eb;
    position: relative;
    z-index: 1;
    transition: color 0.3s ease-out;

}
.button:before {
    background: #91a5f4;
    background: linear-gradient(135deg, #91a5f4 0%, #b08cf9 86%);
    content: "";
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    position: absolute;
    z-index: -1;
    opacity: 0;
    transition: opacity 0.3s ease-out;
}
.button:hover:before {
    opacity: 1;
}
.button:hover {
    color: #fff;
}
<a class="button" href="#">Button</a>

person user2462948    schedule 14.01.2018
comment
Лучший ответ здесь! - person allenski; 25.08.2020

Если вы делаете небольшое выделение при наведении курсора на кнопку, есть гораздо более простое решение. Вы можете просто сдвинуть градиент немного вниз и сделать так, чтобы цвет фона был таким же, как верхний цвет вашего градиента: http://cdpn.io/oaByI

Я знаю, что он довольно ограничен, но если он подходит для этого варианта использования.

person Hampus Ahlgren    schedule 17.02.2014

Я знаю, что этот вопрос довольно старый, но я нашел хороший способ анимировать базовые градиенты, который в некоторых случаях будет работать.

Этот метод позволит вам анимировать изменение цвета градиента, но не изменение положения цветовых точек.

https://jsfiddle.net/62vzydeh/

HTML:

<div class="button">
    Click Me!
</div>

CSS:

.button {

  width: 200px;
  height: 30px;

  margin: 50px;
  padding-top: 10px;

  color: #C0C0C0;
  background: linear-gradient(to left, #F8F8F8, transparent 30%);
  background-color: #808080;

  text-align: center;
  font-family: sans-serif;

  cursor: pointer;

  transition: background-color 500ms;
}

.button:hover {

  background-color: #A0A0A0;
}
person Gogeta70    schedule 12.04.2017

Хакерский способ, который я пробовал, заключался в размещении большого количества <spans> для репликации "позиции", здесь взломать только CSS: https://codepen.io/philipphilip/pen/OvXEaV

person philip    schedule 16.03.2018

9 лет, но на этот раз надеюсь, что мой styled-components сможет кому-то помочь:

import React, { ReactNode } from 'react'
import { Button as ButtonUI } from "@your-library-ui"
import styled from 'styled-components'

type Props = {
  onClick?: () => void;
  children?: ReactNode;
};

const Button = ({onClick, children}: Props) => (
  <StyledButton onClick={onClick} >
    {children}
    <ButtonHelper />
  </StyledButton>
)

export default Button

const ButtonHelper = styled.span`
  position: absolute;
  z-index: -1;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  border-radius: 5px;
  background: linear-gradient(to right, #5ab0f4, #1273ea)!important;
  transition: opacity 0.2s linear;
`;

const StyledButton = styled(ButtonUI)`
  position: relative;
  z-index: 1;
  background: linear-gradient(to right, #1273ea, #1c94f4)!important;
  color: #fff;
  &:hover ${ButtonHelper} {
    opacity: 1;
  }
`;

И начните использовать ваш новый разработанный компонент с дополнительным эффектом! Спасибо @kizu за предложение.

person nambk    schedule 15.07.2021

у вас должен быть тот же стиль в источнике и измененный стиль в целевом.

нравиться

a {
   background: transparent;
   background: linear-gradient(transparent,transparent);
   -moz-transition: all 0.3s ease;
   -o-transition: all 0.3s ease;
   -webkit-transition: all 0.3s ease;
   transition: all 0.3s ease;
}
a:hover
{
   background: #abc07c;
   background: linear-gradient(#c5db95,#88a743);
}

person Omid Moridi    schedule 13.12.2014