Ограничете щракването до конкретна форма

Имам това изображение/многоъгълник, дефиниран в css така:

.post-wrapper {
    position: relative;
    width: 250px;
    height: 420px;
    float: left;
    background-color: #ddc;
    -webkit-clip-path: polygon(50% 100%, 100% 50%, 50% 0, 0 50%);
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover; 
}

можете да видите изображението:

Поддържане на събитие за щракване в CSS форма

Определя нещо като правоъгълник, това е изображение с възможност за щракване, което пренасочва към друга страница и хората могат да щракнат във всяка част на правоъгълника, но аз искам да щракнат само върху многоъгълника. Някой знае ли как мога да направя това тук в моя код?

Fidde


person gn66    schedule 31.05.2014    source източник
comment
защо просто не използвате карта на изображението?   -  person Chris L    schedule 31.05.2014
comment
Би било чудесно, ако можете да направите цигулка. Можете също да проверите този отговор, който е подобен на този: stackoverflow.com/a/23188768/1811992   -  person web-tiki    schedule 05.06.2014
comment
@web-tiki добави цигулката :) jsfiddle.net/T4BSg/2   -  person gn66    schedule 05.06.2014


Отговори (5)


CSS решение

Можете да запазите границите на диамантената форма и да направите кликване само върху частта с изображението, като използвате свойствата на css transform. Въпросът е да използвате свойството skew, така че връзката всъщност има форма на диамант и следователно не може да се кликне извън тази форма (вижте следната демонстрация и екранна снимка). След това трябва да "контратрансформирате" съдържанието, така че да не е изкривено.

ДЕМО

екранна снимка:

диамантена форма с правилни граници

Подходящ CSS:

a{
    width: 216px;
    height: 250px;
    overflow:hidden;
    display:inline-block;
    background:red;

    -webkit-backface-visibility:hidden; /* to reduce pixelisation on borders in chrome */

    -webkit-transform-origin:0 0;
    -ms-transform-origin:0 0;
    transform-origin:0 0;


    -webkit-transform: translate(55%,0) rotate(30deg) skewY(30deg);
    -ms-transform: translate(55%,0) rotate(30deg) skewY(30deg);
    transform: translate(55%,0) rotate(30deg) skewY(30deg);
}

.post-wrapper {
    width: 250px;
    height: 432px;
    background: url(http://lorempixel.com/output/people-h-c-250-432-8.jpg) center center;
    background-size: cover; 

    -webkit-transform-origin:0 0;
    -ms-transform-origin:0 0;
    transform-origin:0 0;

    -webkit-transform:   skewY(-30deg) rotate(-30deg) translate(-50%,0);
    -ms-transform:   skewY(-30deg) rotate(-30deg) translate(-50%,0);
    transform:   skewY(-30deg) rotate(-30deg) translate(-50%,0);
}
person web-tiki    schedule 05.06.2014
comment
Това е страхотно решение, но за съжаление не е твърде разширимо към други форми. - person Etheryte; 05.06.2014
comment
Може да се адаптира към други форми, всички, които можете да създадете в CSS, и има предимството да не използва JS. - person web-tiki; 05.06.2014
comment
Виждате ли, не приех отговора ви за правилен, но отговорът е наистина добър, Нит ми даде повече подкрепа, тъй като отговорът му е правилен и беше първият, аз го приемам, но отговорът ви е доста невероятен. Благодаря за отговора и най-добрите пожелания. - person gn66; 05.06.2014
comment
без притеснения, @gn66 изборът е ваш. Радвам се, че помогнах :) - person web-tiki; 05.06.2014
comment
@NicolasBorda за триъгълници можете да използвате техниката, описана в този отговор и тази демонстрация: триъгълник с ефект на задържане - person web-tiki; 19.02.2015
comment
@web-tiki благодаря ти за този отговор, бях срещал този отговор и ти вършиш страхотна работа, обяснявайки всичко. Това, което не можах да тренирам, е как да направя равностранен триъгълник. Бихте ли помогнали със стойностите, които трябва да променя, за да постигна това. - person Nicolas Borda; 02.03.2015

Това може лесно да се постигне с SVG пътища и Javascript. Примерното внедряване е както следва:
Създайте прозрачна SVG форма, която покрива областта, която искате да направите кликваща. След това прикачете слушател на кликване към пътя с Javascript.

Примерен Jsfiddle.

HTML:

<div id="status"></div>
<div id="sample_image">
    <svg id="cover" preserveAspectRatio="none">
        <path d="M 70,266 L 196,56 320,266 196,478 z"></path>
    </svg>
</div>

CSS:

#sample_image {
    background-image: url('http://i.stack.imgur.com/m4zEw.png');
    width: 448px;
    height: 701px;
}

#cover {
    width: 100%;
    height: 100%;
}

#cover path {
    fill: transparent;
}

JS:

$('#cover path').on('click', function() {
    //Used only for sample output
    $('#status').append("<span>Click received.</span> ");
})
person Etheryte    schedule 05.06.2014
comment
Можете ли да обясните отговора си? Fiddle наистина не работи, така че не разбирам какво прави. Как мога да интегрирам направения от вас код тук: jsfiddle.net/T4BSg/2? - person gn66; 05.06.2014
comment
Актуализирана цигулка, така че кликванията се уведомяват визуално. - person Etheryte; 05.06.2014
comment
Не сте включили jQuery, както аз, в моя Fiddle. Не ви трябва, просто го използвах за улеснение на селекторите за примера. Вижте jsfiddle.net/dMw23 - person Etheryte; 05.06.2014

За чисто HTML/CSS решение можете да добавите празен href върху изображението с фиксирана височина и ширина. Като:

.clickable-href{
    display:inline-block;
    height:100px;
    width:100px;
    background:red; /* remove this to make the anchor transparent */
}

JSFiddle

Или ако това е img таг, тогава добавете relative родител и използвайте position:absolute котвата:

.relative a{
    display:inline-block;
    position:absolute;
    top:0;
    left:0;
    width:100px;
    height:100px;
    background:red; /* remove this to make the anchor transparent */
}

JSFiddle

person Vucko    schedule 31.05.2014
comment
@GaurangTandon използва JavaScript като последна възможност :) - person Vucko; 31.05.2014
comment
Първо благодаря за отговора! Ако разбрах отговора ви, вие определяте квадрат, върху който да щракнете. Искам само да щракна вътре в многоъгълника/ромба в тази конкретна форма. - person gn66; 04.06.2014
comment
@gn66 можете да използвате два вградени елемента, като span, за да създадете горен и долен триъгълник - пример - person Vucko; 05.06.2014
comment
@Vucko Благодаря отново за отговора :) Може би не съм обяснил правилно, вижте това изображение, взето от вашата цигулка: s7.postimg.org/ikwipqb8n/Prt_Scr_capture_6.jpg Просто не искам хората да могат да кликват върху червената зона, във вашия пример и в моя могат, но не трябва :/ - person gn66; 05.06.2014
comment
@gn66 след това направете четири малки spans и ги позиционирайте absolutly. - person Vucko; 05.06.2014

Ще трябва да използвате JavaScript, предполагам. Вземете координатите на щракването. Сравнете, ако са в допустимия диапазон. И ако не са, използвайте return false.

Прочетете: Получаване на позиция на мишката вътре в родителски div с javascript/jQuery

Псевдокод:

element.onclick = function(){
    if(check range here){
        // user clicked in allowed range
    }else{
        // user did not click in allowed range
        return false; // stop event from working
    }
}
person Gaurang Tandon    schedule 31.05.2014

Има решение, използващо свойството за преобразуване css3, оставете ви JSfiddle Само с помощта на html и css

Пренаредете етикетите:

<div class="post-wrapper"><a href="/bg#"></a></div>

И css:

.post-wrapper{
    position:relative;
    width: 250px;
    height: 420px;
    float: left;
    background-color: #ddc;
    -webkit-clip-path: polygon(50% 100%, 100% 50%, 50% 0, 0 50%);
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
    overflow: hidden;
}
.post-wrapper a{
    display:block;
    position:absolute;
    overflow: hidden;
    width: 400px;
    height: 400px;
    left: -30%;
    top: 2.3%;
    transform: rotate(45deg) scale(.6, .6) skew(10deg, 10deg) translate(0px);
    -webkit-transform: rotate(45deg) scale(.6, .6) skew(10deg, 10deg) translate(0px);
    -moz-transform: rotate(45deg) scale(.6, .6) skew(10deg, 10deg) translate(0px);
    -ms-transform: rotate(45deg) scale(.6, .6) skew(10deg, 10deg) translate(0px);
    -o-transform: rotate(45deg) scale(.6, .6) skew(10deg, 10deg) translate(0px);
}
person eiqqen    schedule 08.06.2014